iOS实现app之间的内容分享总结,字数限制等

iOS实现app之间的内容分享总结

转载自:https://blog.csdn.net/TuGeLe/article/details/78816890

说到iOS实现app之间的内容分享,第一印象就是社会化分享,然后就是QQ、微信、微博等的第三方分享SDK,当然现在也有很多做社会化分享集合的,例如友盟分享、ShareSDK。其实如果分享来说已经很方便了,但是呢第三方分享SDK还是有一些分享内容上的限制的,具体限制如下(iOS平台QQ、微信、微博为例):

微博分享支持类型

微博网页分享支持文字,文字+图片,要分享的链接需要添加在text里面

客户端分享:文字,图片,文字+图片,文字+图片+链接

参数说明:

text:在客户端分享不得超过2000个字,网页分享不得超过140个字

image,图片最大不超过10M,支持动态图传输,但分享后不会显示为动态图

QQ好友分享

支持文字,图片,文字+图片+链接,音乐链接,视频链接

参数说明:

标题:最长128个字符

描述:最长512个字符

URL:最长512个字符

Image:最大10M,支持动态图

QQ空间分享

支持文字,图片,文字+图片+链接,本地视频,视频链接

URL:必须用域名网址且不能包含中文

其他参数类似QQ好友分享

微信好友分享

支持文字,图片,文字+图片+链接,音乐链接,视频分享,表情,文件(本地视频),小程序

标题:最长512个字符

描述:最长1024个字符

image:大小不能超过10M(分享动态图要以表情方式分享)

缩略图:不得超过32k

URL:最长不能超过10k

微信朋友圈分享

支持文字,图片,文字+图片+链接,音乐链接,视频链接

参数与分享到微信好友一致

以上就是第三方SDK分享的限制,由于我们现在有分享本地视频的需求,发现只有微信支持,所以不得不调研看看有没有其他的分享方案。于是就找到目前有这么几种方案可以在app之间共享数据,也就引出了本文。

通过URL Scheme来实现app之间的内容分享

通过UTI规范来实现app之间的内容给分享

使用URL Scheme来实现app之间的内容分享

由于苹果的app都是在沙盒中,相互是不能访问数据的。但是苹果还是给出了一个可以在app之间跳转的方法:URL Scheme。简单的说,URL Scheme就是一个可以让app相互之间可以跳转的协议。每个app的URL Scheme都是不一样的,如果存在一样的URL Scheme,那么系统就会响应先安装那个app的URL Scheme,因为后安装的app的URL Scheme被覆盖掉了,是不能被调用的。

要跳转到别人的app,就要知道别人的app的跳转协议是什么,需要传入什么参数,如果我们希望别人打开我们的app,也需要在info.plist中配置跳转协议,然后在handleOpenUrl方法中来处理数据。

这里有彩蛋,iOS好玩有趣的URL Scheme:

https://www.zhihu.com/question/19907735

第三方分享的SDK就是通过这种方式来实现分享的,我们将需要分享的数据传递给SDK,SDK通过OpenURL来传递数据,返回时SDK来处理handleOpenUrl的参数,实现查看分享的回调。原理就是这么的简单。所以在我们不知道跳转协议是什么的情况下,我们可以通过第三方SDK来跳转到对应的app,实现分享。

这里还要提一下另外一个SDK——OpenShare,这个sdk也是社会化分享的集合,但是与友盟分享、shareSDK不一样的地方是不需要集成QQ、微信、微博官方SDK,因为他通过一些方式,得到了URL Scheme的协议,所以这个sdk做的就是通过这些参数来拼接实现分享到不同第三方应用的协议。如果对安装包大小有要求,同时也需要使用到分享的app可以试试这个SDK。

接下来就是重点啦,UIT。

通过UTI规范来实现app之间的内容给分享

UTI全称Uniform type identifiers,他提供了整个系统里面表示数据的一个统一的方式,比如documents(文档)、pastebord(剪贴板数据)和bundles(包)。一个统一类型标识符是一个唯一标识一种拥有"类型"属性实例的字符串。而针对这个类型,官方文档还给我们提出了例子解释,对于一个文件或者字节流来说,类型指的是数据类型,而对于packages和bundles来说,类型就是他们内部的目录层级结构。比如一个JPEG类型的图片,在不同环境下,可以有一下集中的标志方式:

1."JPEG",OSType表示

2.".jpg"文件扩展名

3.".jpeg"文件扩展名

4."image/jpeg",MIME中的一种类型

而UTI则是用"public.jpeg"这个字符串来标识,完全代替了这些不一致的标签。在iOS和Mac开发中,苹果给我们提供了注册UTI的接口,而这种注册的文档类型是全局的,系统中所有的应用程序和服务都可以检测到。因此我们通过这个底层侦测,可以使用其他可选的第三方app来预览我们app中不支持的文档,同样也可以将我们想要分享出去的数据,分享给第三方app。如果我们的app可以处理某些类型的实体内容,那么我们也可以在info.plist中进行注册。注册好一个可识别的类型以后,就可以打开一个使用UIDocumentInteractionController来展示内容的第三方app,例如QQ的我的文件,来得到文件的数据。然后再从回调中处理。UIDocumentInteractionController是iOS3提供的API,主要目的是为了让第三方应用查看本应用处理不了的文件类型,例如QQ无法查看PDF文件,那么我们做一个PDF阅读器,就可以注册UTI来实现QQ中PDF文件的阅读。

在iOS6之后,苹果又引入了UIActivityViewController,这个是完全为了分享来做的,系统内置了分享到微博等功能,当然如果你有其他分享的需求,但是系统没有提供,你也可以在自己的程序内部通过API来实现,例如上传视频到twitter并且分享,但是这里可能用到的是twitter的open API了。但总归也是让分享可定制化。

之后在iOS 8时,苹果提供了Share Extension,让那些可以分享到的应用实现Share Extension来帮助其他应用分享内容到自己的应用,现在常见的就是在iOS系统相册中可以直接将照片、视频分享到QQ、微信。这样就不用通过集成第三方SDK达到分享的效果。

说下这两种方式的优缺点

首先第一种方式URL Scheme以第三方的SDK做代表,第二种方式UTI以Share Extension做代表来进行一下对比。

URL Scheme

注册自己的URL Scheme,当两款应用的URL Scheme一致时,分享后返回不能正常跳转。

集成第三方sdk,可以自定义界面展示

分享到第三方应用时需要跳转过去,然后再跳转回来

可以参考第三方SDK提供的文档以及demo来实现

Share Extension

无需任何配置,全部交给系统处理可分享的渠道

无需集成第三方SDK,但界面无法自定义

分享到第三方应用时不需要跳转,

只能参考Share Extension的文档来确定可以分享那些内容,但不知道各个分享渠道的限制,开发成本较大(如果想知道QQ或者微信的Share Extension的限制,可以下载对应的ipa包,解压缩查看Share Extension的plist文件中对文本,图片,视频,文件是否支持,以及数量限制)

当第三方应用修改了Share Extension后,会存在旧版本可分享的渠道,在新版本无法分享。

最后来说一点关于视频分享上的小坑

最终视频分享是通过UIActivityViewController来分享的,其实实现起来飞铲更简单,只要将本地视频的路径URL当做参数即可实现将本地视频分享到QQ、微信、微博中,但需要注意实例化URL时要使用[URL fileURLWithPath],细心的朋友可能会发现,分享列表中会出现QQ和拷贝到QQ两个选项。点击QQ的话可以正常分享,但是点击拷贝到QQ却没有反应,由于国内很少用UIActivityViewController,资料也比较少,所以没有找到问题的根本解决办法,但是我们可以把拷贝到QQ隐藏,这也是个不错的选择。其实细心的朋友在用的时候会注意到UIActivityViewController初始化方法的第一个参数传递的可以是系统提供好的NSURL,NSString,UIImage类型,也可以是遵循UIActivityItemSource协议的类型。在UIActivityItemSource协议中,我们可以指定placeholderItem,设定这个后,系统就会找与之匹配的可分享的渠道来进行展示,那么我们在这里配置成一个带有域名的url,在实际的itemForActivityType方法中返回本地的url之后,拷贝到QQ很神奇的消失了,这也算是个小惊喜吧。

---------------------

作者:TuGeLe

来源:CSDN

原文:https://blog.csdn.net/TuGeLe/article/details/78816890

版权声明:本文为博主原创文章,转载请附上博文链接!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 前言 我们在iOS平台上想要实现不同App之间的内容分享一般有几种常用方式: 第一种是通过AirDrop实现不同设...
    SeraZheng阅读 38,837评论 24 120
  • 不知不觉,原创文章已经持续更新了有1个月的时间,这1个月是按照每2天更新一篇文章的频率进行的。还算是自己能够经得起...
    酒事要说阅读 652评论 0 0
  • 到了34岁,我开始思考人生的意义,人生活一回,是为了什么,为了金钱,我去年非常狂热的追逐,被生活给了重重一拳,为...
    炙星火阅读 141评论 0 0
  • 他是一个男孩,­一个双鱼座男孩。 比较懒不出门不洗脸,不喜欢叠被子,喜欢做饭,但是不喜欢洗碗。喜欢看电影,喜欢旅...
    招财猫LH阅读 299评论 0 0