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

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

推荐阅读更多精彩内容

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