ios原生社交分享实践

1. 前言

目前很多分享可能都是考虑接入第三方SDK,一种是接入集成SDK,类似有盟,另外一种就是接入各个社交平台的官方SDK,UI定制性高,内容处理更灵活。其实系统也有提供分享组件,第三方的在多图分享上支持不太友好,而且有的社交平台是没有提供SDK的,用第三方就不一定更适合,所以去了解了一下系统的分享组件接入方式。
系统分享组件接入,有两种方案:
1,social.framework + extension方式,这种方式在iOS10以后不支持了,所以不建议使用;
2,使用UIActivityViewController实现分享,相比接入多个SDK,此方案更加便捷。

2. 可参考APP

亚马逊,知乎,简书等都有使用到系统分享。

3. 社交平台支持分享内容

社交平台 文字 图片(多图) 链接
wechat
whatsapp
Facebook
Messenger
Line
Twitter
AirDrop
  • 分享都是在app内,不会外跳到社交平台app,比如分享到微信,是在app内弹出微信分享页面,不会跳到微信app。
  • 图片建议不能太大,否则可能分享失败,尝试过一个2M图片大概会压缩到500K左右,失帧后的效果从肉眼上看不太明显。
  • 链接分享出去,大多数分享平台会自动load 链接里面的内容,需要前端的同学在header里面设置对应的内容,比如title,desc,image.

4. 实现分享三步走

初始化接口设置分享内容,设置回调方法,打开页面,就可进行分享。

4.1. 初始化

//分享內容
NSString *string = @"Lemon share Demo";
UIImage *image = [UIImage imageNamed:@"image.png"];
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
NSArray *activityItems = @[string,image,url];

//自定义Activity
UIActivityCustom * customActivity = [[UIActivityCustom alloc] initWithModel:[self customModelWithArr:activityItems]];
NSArray *customActivities = @[customActivity];
  
//初始化:
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:customActivities];

//禁掉不用的服务
activityVC.excludedActivityTypes = @[UIActivityTypePrint,UIActivityTypeAssignToContact];

4.1.1. 初始化崩溃点

  • ActivityItems入参不能为nil,为空会崩溃,所以注意检查参数。(自定义applicationActivities入参可以为空)

4.1.2. 初始化其他二三事

  • 分享链接:社交平台会自动加载链接header里面的titleimagedesc信息,以图文的样式显示。

  • 分享文本+链接:有两种方式

    第一种:
    NSString *string = @"Lemon share Demo";
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    NSArray *activityItems = @[string,url];
    这种方式,每个分享平台都支持正常分享,但是个别平台,只会取URL,显示图文信息,不取文本信息,不显示文本,也就是不会显示`Lemon share Demo`
    
    第二种:
    NSString *string = @"Lemon share Demo http://www.baidu.com";
    NSArray *activityItems = @[string];
    这种方式,大部分平台都支持,但是个别平台,会提示不支持的分享类型,但支持的分享的平台,可以解决第一种里面不会显示文本的问题,也就是说只要支持分享,那么文本信息就会显示。
    
  • 分享图片:在自己写demo调研方案的时候,一般使用一张本地图片,本地图片需要放在Assets里面,不然分享时会提示“不支持的分享类型”。

  • 禁掉不用服务:只能禁掉系统的,如果是用户自己下载的,比如微信,用户开关打开,这里就算屏蔽,也会显示出来。非系统的服务,是否屏蔽依赖用户的操作。

4.2. 模态打开分享页面

//获取分享的视图控制器
  UIViewController *shareVc = [self shareVc];
  //注意崩溃点:区分iPad,因为iPad以UIPopoverPresentationController的形式,不然直接present会崩溃
  if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
      UIPopoverPresentationController *popVc = shareVc.popoverPresentationController;
      popVc.sourceView = self.shareButton;
      popVc.sourceRect = CGRectMake(CGRectGetMidX(self.shareButton.frame), CGRectGetMidY(self.shareButton.frame), 0, 0);
  }
  //必须模态
  [self presentViewController:shareVc animated:YES completion:nil];

效果如下图:

image_1.png

4.2.1. 打开分享页崩溃点

  • 注意兼容ipad,分享到iPad必须用UIPopoverPresentationController形式,不然会崩溃。
  • UIPopoverPresentationControllersourceView不能为空,为空会崩溃
  • 必须模态打开分享页,不然会崩溃

4.3. 设置回调

 activityVC.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
        NSLog(@"activityType :%@", activityType);
        [self showAlertWithMessage:activityType.length ? activityType : @"" success:completed];
    };

4.2.1. 回调里的两三事

  • 回调里的comppleted值,是有平台区分的,并不代表真正分享成功,所以如果你的业务需要用这个值时,请注意结合场景分析。
比如: 
  1. 分享到WhatsApp,中途取消,不分享了,这里的值也是YES,activityError也是nil
  2. 分享到facebook,中途取消,这里的值就是NO

下面是点击分享到微信的效果

image_2.PNG

微信分享页(在自己的app内,不会外跳到微信app,其他分享平台也一样)

image_3.PNG

在微信查看消息效果

image_4.png

至此你已经可以进行各个社交平台分享了,但是如果需要定义入口,可以继续往下看。

5. 自定义Activity

如果自定义的话,需要继承系统的UIActivity

5.1 接口介绍

// 决定自定义Activity显示的位置,第一行是AirDrop,第二行是Share,第三行Action
+ (UIActivityCategory)activityCategory
{
    return UIActivityCategoryAction;
}
//自定义的title
- (NSString *)activityTitle 
{
  return @"Lemon";
}
//自定义的图片
- (UIImage *)activityImage 
{
  return [UIImage imageNamed:@"image"];
}
//实现activity的事件响应
- (void)performActivity {
  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.baidu.com"]];
  [self activityDidFinish:YES];    
}

实现以上方法就可以进行自定义Activity了。

5.1.2 自定义activity三两事

  • activityImage图片系统会重绘,所以你会发现它可能是灰色的,图片大小建议60 * 60

效果图如下:

image_6.png

safri打开百度

image_5.PNG

戳这里获取demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,018评论 3 119
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,556评论 25 708
  • 第一章:重新开始 “你怎么可以这样?”鹿晗紧皱着眉头。啪!朴灿烈抽了我一巴掌“你这个可恶的女人!”两滴晶莹的眼泪从...
    琳琳心心阅读 492评论 9 4
  • 今天感恩妈妈给我买了新的粉粉的羊毛衫。 感恩去树舍魔方课,和老师们聊到10点半,感恩。大家帮我分析了现在的状况。也...
    叶丹丹阅读 242评论 0 0
  • 驾照我上大三的时候就拿到了,但是抱着侥幸心理好赖算是过了驾考,科目三完全是走后门过的,现在需要用到我开车了,因为要...
    田永威阅读 214评论 0 0