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

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

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

  1. 微博分享支持类型

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

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

    参数说明:

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

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

  2. QQ好友分享

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

    参数说明:

    标题:最长128个字符

    扫描二维码关注公众号,回复: 1426109 查看本文章

    描述:最长512个字符

    URL:最长512个字符

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

  3. QQ空间分享

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

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

    其他参数类似QQ好友分享

  4. 微信好友分享

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

    标题:最长512个字符

    描述:最长1024个字符

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

    缩略图:不得超过32k

    URL:最长不能超过10k

  5. 微信朋友圈分享

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

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

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

  1. 通过URL Scheme来实现app之间的内容分享
  2. 通过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

  1. 注册自己的URL Scheme,当两款应用的URL Scheme一致时,分享后返回不能正常跳转。
  2. 集成第三方sdk,可以自定义界面展示
  3. 分享到第三方应用时需要跳转过去,然后再跳转回来
  4. 可以参考第三方SDK提供的文档以及demo来实现

Share Extension

  1. 无需任何配置,全部交给系统处理可分享的渠道
  2. 无需集成第三方SDK,但界面无法自定义
  3. 分享到第三方应用时不需要跳转,
  4. 只能参考Share Extension的文档来确定可以分享那些内容,但不知道各个分享渠道的限制,开发成本较大(如果想知道QQ或者微信的Share Extension的限制,可以下载对应的ipa包,解压缩查看Share Extension的plist文件中对文本,图片,视频,文件是否支持,以及数量限制)
  5. 当第三方应用修改了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很神奇的消失了,这也算是个小惊喜吧。

猜你喜欢

转载自blog.csdn.net/tugele/article/details/78816890
今日推荐