iOS 社会化分享方案总结

一、系统原生 UIActivityViewController

优缺点

  • 优点:使用简单、不用注册繁杂的分享平台账号、不用导入臃肿的SDK包

  • 缺点:UI可定制性差,只能使用系统提供的固定样式,长相如下。分享的类型受限,只能分享text、url、image。

UIActivityViewController分享界面

使用:

NSString *textToShare = @"要分享的文本内容"; 
UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"]; 
NSURL *urlToShare = [NSURL URLWithString:@"http://www.baidu.com"];

NSArray *activityItems = @[textToShare, imageToShare, urlToShare];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];

[self presentViewController:activityVC animated:YES completion:nil];

activityItems是要分享的内容,包括文字、图片、网址。但是要注意的是,不是所有平台都支持这三种内容的分享,例如微信,不能同时分享图片和网址,文字不能直接往外分享,下图是几个平台分享概略

各平台分享概略

当弹出视图框的时候,我们发现上边很多图标是我们用不到,我们可以将用不到的图标去掉,只要设置以下属性:

activityVC.excludedActivityTypes = @[UIActivityTypePostToFacebook,UIActivityTypeAirDrop];

设置回调block,可以在分享之后成功或失败后做事情,

 UIActivityViewControllerCompletionWithItemsHandler myBlock = ^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError) {
        
        if (completed){
            NSLog(@"completed");
        }
    };

activityVC.completionWithItemsHandler = myBlock;

二、系统原生Social Framework

优缺点

  • 优点:使用简单、不用注册繁杂的分享平台账号、不用导入臃肿的SDK包。UI可以自己绘制,满足了很多个性化的需求。

  • 缺点:分享界面的UI需要开发者自己绘制,增加了工作量。分享的类型受限,只能分享text、url、image。

使用

导入Social.framework

#import <Social/Social.h>
//创建分享的控制器
SLComposeViewController *composeVc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];

if (composeVc == nil){
    NSLog(@"未安装软件");
    return;
}

if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]) {
    NSLog(@"软件未配置登录信息");
    return;
}

//添加分享的文字、图片、链接
[composeVc setInitialText:@"要分享的文本内容"];
[composeVc addImage:[UIImage imageNamed:@"choice_highlight"]];
[composeVc addURL:[NSURL URLWithString:@"http://www.baidu.com"]];

//弹出分享控制器
[self presentViewController:composeVc animated:YES completion:nil];

//监听用户点击了取消还是发送
composeVc.completionHandler = ^(SLComposeViewControllerResult result){
    if (result == SLComposeViewControllerResultCancelled) {
        NSLog(@"点击了取消");
    } else {
        NSLog(@"点击了发送");
    }
};   

系统只提供了下面几种分享平台:

SLServiceTypeTwitter;
SLServiceTypeFacebook;
SLServiceTypeSinaWeibo;
SLServiceTypeTencentWeibo;
SLServiceTypeLinkedIn;

实际可以根据id来分享到更多平台,如微信:

NSString *socialType = @"com.tencent.xin.sharetimeline";
SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:socialType];

可以这么使用的原因是:iOS8之后系统推出的Share Extension,不是系统实现了微信分享,而是微信App的Share Extension提供了分享入口。所以这个不是私有API,可以放心使用,想获取手机中装的App的所有Share Extension的方法。只需调用下面一句代码。。

SLComposeViewController *composeVc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];

看看控制台输出,手机内所有可用的Share Extension的bundle Id 都出来了。

三、友盟等第三方分享平台

优缺点

  • 优点:开发者可以按照第三方文档自己定制分享界面UI、功能。分享的类型可以自由选择,除了text、url、image。还有其他格式多媒体(声音、视频、文件等)可供选择。

  • 缺点:需要去友盟以及各个分享平台注册繁杂的账号、导入臃肿的SDK包。配置跳转白名单。

使用

友盟分享使用文档及SDK下载

四、OpenShare

优缺点

  • 优点:开发者可以自己定制分享界面UI、功能。分享的类型可以自由选择,除了text、url、image。还有其他格式多媒体(声音、视频、文件等)可供选择。

  • 缺点:需要配置跳转白名单。

使用

实现原理介绍
github代码和demo地址

总结

这四种分享方案,各有优缺点,没有最好的分享方案,只有最适合你App需求的方案。

如果你的App界面需要定制化,分享类型需要支持多媒体(声音、视频、文件等),分享平台只限于微信、QQ、微博、人人、支付宝,使用openshare。如果需要支持的平台很多,使用友盟分享。

如果分享的类型只限于text、image、url,对界面要求不高,系统原生的UIActivityViewController就可以,使用UIActivityViewController。如果界面需要定制化,使用Social Framework。

方案 UI 分享类型 分享平台
UIActivityViewController 要求不高 text、image、url 多种平台
Social Framework 要求自定义 text、image、url 多种平台
友盟等第三方分享平台 要求自定义 支持多媒体(声音、视频、文件等) 多种平台
OpenShare 要求自定义 支持多媒体(声音、视频、文件等 微信/QQ/微博/人人/支付宝

除了第一种方案UIActivityViewController不需要自己绘制界面以外,其他方案均要自己绘制分享弹出菜单,针对以上问题,我写了一个界面和功能高度可定制化的轮子IFMShareSwift版)供大家使用。

推荐

IFMShareSwift版)使用简单、优雅,界面和功能高度可定制化。支持单行滚动、双行滚动、多行、九宫格、头视图、尾视图等多种样式,分享功能可以一个平台名直接调用Share Extension,也可以使用各平台SDK或者OpenShare自定义分享功能。欢迎前去issue、pull request、star,代码示例如下:

 IFMShareView *shareView = [[IFMShareView alloc] initWithItems:@[IFMPlatformNameSms,IFMPlatformNameEmail,IFMPlatformNameQQ,IFMPlatformNameWechat] itemSize:CGSizeMake(80,100) DisplayLine:YES];
 
 //设置分享内容
[shareView addText:@"分享测试"];
[shareView addURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[shareView addImage:image];
    
[shareView showFromControlle:self];

部分自定义界面展示

图片展示

GIF展示

动图展示

下一篇内容:UIActivityViewController自定义Activity、OpenShare配置跳转白名单


参考文章:

《使用系统自带的UIActivityViewController和UIActivity进行内容分享》
新手指南:使用 Social Framework 以及 UIActivityViewController
iOS通过UIActivityViewController实现原生分享功能
UIActivityViewController 和 SLComposeViewController
程序内分享到微信

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

推荐阅读更多精彩内容

  • 一、系统原生 UIActivityViewController 优缺点 优点:使用简单、不用注册繁杂的分享平台账号...
    为什么划船不靠桨阅读 1,264评论 0 0
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,798评论 8 183
  • 幼年庄周X神医扁鹊 “哎哎听说了吗,那神医捡了个小孩!” “啊?真的?” “真的那还有假!” 扁鹊是在山上捡到的庄...
    换无邪一生喜乐阅读 1,617评论 1 7
  • 我妹妹最近越来不像我妹妹了。 她活泼得愈发像个疯子,可有时候她又沉默地看着电视,手里紧紧攥着遥控器,双...
    浮辞z阅读 229评论 0 1
  • 今天讲讲“移动”这个词,很多笔记达人都在强调一句话,使用evernote等笔记软件,必须让自己的笔记能经常移动,而...
    时间管理讲师泽阳阅读 283评论 0 1