程序内分享 之二
在上篇博客程序内分享到微信(其实适用于所有支持Share Extension的分享,不仅仅是微信)中说过,利用SLComposeViewController + App Share Extension特性能实现程序内分享。并且给大家介绍过程序内实现分享的两种方式:程序内部分享方式一 和 程序内部分享方式二。这篇博客主要分享在实际使用程序内部分享方式一中遇到的一些问题。供大家,在选择使用哪种分享方式做参考。如果你正在犹豫是否要用程序内分享取代传统SDK分享 或者犹豫使用程序内部分享方式一还是程序内部分享方式二,那请你看完下面内容,再细细权衡。
下面通过实践过程来详细分析程序内部分享方式一优缺点
“程序内部分享方式一”的优缺点
如果还不清楚程序内部分享方式一指的是什么,请看程序内分享到微信
内部分享方式一优点
1,不需要集成SDK(想想不需要申请/注册Key,不需要为每个平台添加scheme支持,这是多么幸福的事啊)。
2,程序内部搞定,体验非常好(不用担心跳转到微信,用户不返回app)。
3,各种平台分享,代码高度一致,通用性非常强。
4,由于是app 内部分享,分享成功失败,统计非常准确。(不用担心跳转到微信用户不返回app了或者分享完后“玩了一会”才返回app造成我们的app不知道用户是否真的分享)
内部分享方式一缺点
1,对“图文链接”支持不是很好(后面有详细案例分析)。如果单纯分享图片或者文字这种方式是首先。
2,没有网络的情况不能分享成功。(SDK集成即使没有网络也能分享成功)
3,不能指定分享到某个特定平台。你休想限制用户分享到“微信朋友圈”
而不是“微信好友”。因为你只能在SLComposeViewController 唤起微信分享的界面才能选择"发送给好友"/"分享到朋友圈",但是用户具体是"发送给好友"/"分享到朋友圈",我们app无法知道。所以我们无法根据具体是"发送给好友"/"分享到朋友圈"来定制不同内容。(SDK集成可以个性化定制,分享“朋友圈”和“微信好友”内容)。
下面详细分析内部分享方式一,分享“图文链接”遇到的问题。
同样下面一段代码,分享到微信和QQ表现效果不一样。
//微信Share Extension bundle id
NSString *test = @"com.tencent.xin.sharetimeline";
//QQ Share Extension bundle id
//NSString *test = @"com.tencent.mqq.ShareExtension";
//分享到sina微博
//NSString *test = SLServiceTypeSinaWeibo;
if (![SLComposeViewController isAvailableForServiceType:test]) {
NSLog(@"或者没有配置相关的帐号");
return;
}
// 2.创建分享的控制器
SLComposeViewController *composeVc = [SLComposeViewController composeViewControllerForServiceType:test];
if(composeVc == nil){
return
}
// 2.1.添加分享的文字
[composeVc setInitialText:@"balabalabala..."];
// 2.2.添加一个图片
[composeVc addImage:[UIImage imageNamed:@"icon_session-8"]];
// 2.3.添加一个链接
[composeVc addURL:[NSURL URLWithString:@"http://www.jianshu.com/p/8a8c74684a26"]];
// 3.弹出分享控制器(以Modal形式弹出)
[self presentViewController:composeVc animated:YES completion:nil];
// 4.监听用户点击了取消还是发送
/*
SLComposeViewControllerResultCancelled,
SLComposeViewControllerResultDone
*/
composeVc.completionHandler = ^(SLComposeViewControllerResult result){
if (result == SLComposeViewControllerResultCancelled) {
NSLog(@"点击了取消");
} else {
NSLog(@"点击了发送");
}
};
下面分享一个图文链接到微信,看看会是什么效果。代码如上:
没有网络的情况(如飞行模式下分享):
下图说明,虽然我设置了icon_session-8
[composeVc addImage:[UIImage imageNamed:@"icon_session-8"]];
但是没起一点作用。在分享链接的时候,图片被忽略,标题为“无标题“。
weichat.pngicon_session-8 图如下:
icon_session-8.png
没有网络分享到“微信好友”分享时提示
weichat_tip.png有网络的情况下分享到微信:
有网的情况默认先显示图"weichat.png",然后网络刷新后变成图"weichat_net.png",titile取自链接的标题,分享的图片取自链接里面的第一张图
上面代码稍作如下改动,启用QQ分享
//微信Share Extension bundle id
//NSString *test = @"com.tencent.xin.sharetimeline";
//QQ Share Extension bundle id
NSString *test = @"com.tencent.mqq.ShareExtension";
下面来看看利用程序内部分享方式一将“图文链接”分享到QQ的表现:
没有网络的情况(如飞行模式下):
从下面效果图上能看出,我们我们设置的默认图,是默认的分享链接。标题默认是"分享链接"
没有网络时分享到“我的好友”提示
qq_tip.png有网络的情况:
图片取自我博客的默认头像,标题取自博客标题,描述取自博客第一句话
对比一下QQ 和 微信 分享”图文链接“的行为。实现机制各不相同。所以对于”图文链接“的分享,不建议采用内部分享方式一这种机制。而且如果你分享的链接有redirect行为,QQ和微信表现也不一样。所以程序内部分享方式一对“图文链接”支持的不是很好。
程序内部分享方式二的优缺点
程序内部分享方式二优点:
1,不需要集成SDK(想想不需要申请/注册Key,不需要为每个平台添加scheme支持,这是多么幸福的事啊)。
2,程序内部搞定,体验非常好(不用担心,跳转到微信等,用户不返回app)。
3,各种平台分享,代码高度一致,通用性非常强。
4,系统支持的比较好。系统实现的程序内分享基本都是这种方式调用。所以第三方厂商对这种方式支持比较好。
程序内部分享方式二缺点:
1,界面定制非常差(如果第一次分享到某个非系统默认支持的平台,第一次还需要自己选中)。
2,没有网络的情况不能分享成功。(SDK集成即使没有网络也能分享成功)
3,不能指定分享到某个特定平台。你休想限制用户分享到“微信朋友圈”
而不是“微信好友”。因为你只能在SLComposeViewController 唤起微信分享的界面才能选择"发送给好友"/"分享到朋友圈",但是用户具体是"发送给好友"/"分享到朋友圈",我们app无法知道。所以我们无法根据具体是"发送给好友"/"分享到朋友圈"来定制不同内容。(SDK集成可以个性化定制,分享“朋友圈”和“微信好友”内容)。
程序内部分享方式一 和 程序内部分享方式二对比
总的来说程序内部分享方式一 和 程序内部分享方式二在某些方面各有千秋。
"程序内部分享方式一"相对于“程序内部分享方式二”的优点:
1,界面比较好定制
2,能精确统计分享成功失败。
“程序内部风向方式二”相对于“内部分享方式一”的优点:
1,对图文链接支持的比较好。
后面有时间在说一说利用“程序跳转实现分享”的两种方式。一种是依赖于SDK的,如友盟;另一种是利用scheme 实现跳转,经典代表Openshare。