美文网首页iOS 开发学习成长之路iOS实战超棒文集
UIActivityViewController系统原生分享-仿

UIActivityViewController系统原生分享-仿

作者: 且行且珍惜_iOS | 来源:发表于2016-08-31 19:07 被阅读9740次

利用UIActivityViewController实现系统原生分享,不需要三方SDK,支持自定义分享,可以分享到微博、微信、QQ、信息、邮件、备忘录、通讯录、剪贴板、FaceBook.....等等 示例Github

效果图,诸位请看:


效果1.gif 效果2.gif

接下来介绍UIActivityViewController:Demo里也注释的很清楚

1. 创建要分享的数据内容,加在一个数组 ActivityItems里。
NSString *textToShare = @"我是且行且珍惜_iOS,欢迎关注我!";
UIImage *imageToShare = [UIImage imageNamed:@"wang.png"];
NSURL *urlToShare = [NSURL URLWithString:@"https://github.com/wslcmk"];
NSArray *activityItems = @[urlToShare,textToShare,imageToShare];
   //自定义 customActivity继承于UIActivity,创建自定义的Activity加在数组Activities中。
   customActivity * custom = [[customActivity alloc] initWithTitie:@"且行且珍惜_iOS" withActivityImage:[UIImage imageNamed:@"wang"] withUrl:urlToShare withType:@"customActivity" withShareContext:activityItems];
NSArray *activities = @[custom];

这里需要注意:不同的 Activity 类型所支持的数据类型不同,当不支持时,应用程序支持的系统服务按钮就不会出现,比如说打印、添加书签,,,,

不同的 Activity 类型所支持的数据类型.png
/**
2. //创建分享视图控制器,初始化UIActivityViewController

 ActivityItems  在执行activity中用到的数据对象数组。数组中的对象类型是可变的,并依赖于应用程序管理的数据。例如,数据可能是由一个或者多个字符串/图像对象,代表了当前选中的内容。
 
 Activities  是一个UIActivity对象的数组,代表了应用程序支持的自定义服务。这个参数可以是nil。
 */

UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:activities];


   // 分享功能(Facebook, Twitter, 新浪微博, 腾讯微博...)需要你在手机上设置中心绑定了登录账户, 才能正常显示。
//关闭系统的一些Activity类型,不需要的功能关掉。
 activityVC.excludedActivityTypes = @[UIActivityTypePostToVimeo ];

//Activity 类型又分为“操作”和“分享”两大类
/*
 UIKIT_EXTERN NSString *const UIActivityTypePostToFacebook     NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToTwitter      NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToWeibo        NS_AVAILABLE_IOS(6_0);    //SinaWeibo
 UIKIT_EXTERN NSString *const UIActivityTypeMessage            NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeMail               NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypePrint              NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeCopyToPasteboard   NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeAssignToContact    NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeSaveToCameraRoll   NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeAddToReadingList   NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToFlickr       NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToVimeo        NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToTencentWeibo NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypeAirDrop            NS_AVAILABLE_IOS(7_0);
 */

 3. //判断系统版本,初始化点击回调方法
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
    //初始化Block回调方法,此回调方法是在iOS8之后出的,代替了之前的方法
    UIActivityViewControllerCompletionWithItemsHandler myBlock = ^(NSString *activityType,BOOL completed,NSArray *returnedItems,NSError *activityError)
    {
        NSLog(@"activityType :%@", activityType);
        if (completed)
        {
            NSLog(@"completed");
        }
        else
        {
            NSLog(@"cancel");
        }
        
    };
    
    // 初始化completionHandler,当post结束之后(无论是done还是cancell)该blog都会被调用
    activityVC.completionWithItemsHandler = myBlock;
}else{
    //此Block回调方法在iOS8.0之后就弃用了,被上面的所取代
    UIActivityViewControllerCompletionHandler myBlock = ^(NSString *activityType,BOOL completed)
    {
        NSLog(@"activityType :%@", activityType);
        if (completed)
        {
            NSLog(@"completed");
        }
        else
        {
            NSLog(@"cancel");
        }
        
    };
    // 初始化completionHandler,当post结束之后(无论是done还是cancell)该blog都会被调用
    activityVC.completionHandler = myBlock;
}

4. //在展现view controller时,必须根据当前的设备类型,使用适当的方法。在iPad上,必须通过popover来展现view controller。在iPhone和iPodtouch上,必须以模态的方式展现。
[self presentViewController:activityVC animated:YES completion:nil];

接下来介绍几个系统Activity 类型的API,用于自定义title、Image的时候用。
- (void)SystemAPI{

//复制链接功能
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = @"需要复制的内容";

//用safari打开网址
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://github.com/wslcmk"]];

//保存图片到相册
UIImage *image = [UIImage imageNamed:@"wang"];
id completionTarget = self;
SEL completionSelector = @selector(didWriteToSavedPhotosAlbum);
void *contextInfo = NULL;
UIImageWriteToSavedPhotosAlbum(image, completionTarget, completionSelector, contextInfo);


//添加书签
NSURL *URL = [NSURL URLWithString:@"https://github.com/wslcmk"];
BOOL result = [[SSReadingList defaultReadingList] addReadingListItemWithURL:URL
                                                                      title:@"WSL"
                                                                previewText:@"且行且珍惜_iOS"
                                                                      error:nil];
if (result) {
    NSLog(@"添加书签成功");
}


//发送短信
MFMessageComposeViewController *messageComposeViewController = [[MFMessageComposeViewController alloc] init];
messageComposeViewController.recipients = @[@"且行且珍惜_iOS"];
//messageComposeViewController.delegate = self;
messageComposeViewController.body = @"你好,我是且行且珍惜_iOS,请多指教!";
messageComposeViewController.subject = @"且行且珍惜_iOS";



//发送邮件
MFMailComposeViewController *mailComposeViewController = [[MFMailComposeViewController alloc] init];
[mailComposeViewController setToRecipients:@[@"mattt@nshipster•com"]];
[mailComposeViewController setSubject:@"WSL"];
[mailComposeViewController setMessageBody:@"Lorem ipsum dolor sit amet"
                                   isHTML:NO];
if([MFMailComposeViewController  canSendMail]){
    [self presentViewController:mailComposeViewController animated:YES completion:nil];
};



//发送推文
TWTweetComposeViewController *tweetComposeViewController =
[[TWTweetComposeViewController alloc] init];
[tweetComposeViewController setInitialText:@"梦想还是要有的,万一实现了呢!-----且行且珍惜_iOS"];
[tweetComposeViewController addURL:[NSURL URLWithString:@"https://github.com/wslcmk"]];
[tweetComposeViewController addImage:[UIImage imageNamed:@"wang"]];
if ([TWTweetComposeViewController canSendTweet]) {
    [self presentViewController:tweetComposeViewController animated:YES completion:nil];
}
}

接下来介绍自定义UIActivity,主要就是重写了以下方法:
+ (UIActivityCategory)activityCategory{
// 决定在UIActivityViewController中显示的位置,最上面是AirDrop,中间是Share,下面是Action
return UIActivityCategoryAction;}

- (NSString *)activityType{
return _type;}

- (NSString *)activityTitle {
return _title;}

- (UIImage *)_activityImage {
//这个得注意,当self.activityCategory = UIActivityCategoryAction时,系统默认会渲染图片,所以不能重写为 - (UIImage *)activityImage {return _image;}
return _image;}

- (NSURL *)activityUrl{
return _url;}

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
return YES;}

- (void)prepareWithActivityItems:(NSArray *)activityItems {
//准备分享所进行的方法,通常在这个方法里面,把item中的东西保存下来,items就是要传输的数据。;}

- (void)performActivity {
//这里就可以关联外面的app进行分享操作了
//也可以进行一些数据的保存等操作
//操作的最后必须使用下面方法告诉系统分享结束了
[self activityDidFinish:YES];}

需要Demo请戳我

亲,赞一下,给个star.gif

相关文章

网友评论

  • 牛牛爱优闲:你好,我想请问一下微信支持纯文字分享吗
  • ae0a9d45cba1:如果不分享网址 单纯分享一个图片到微博 发送给好友 貌似发送不过去诶
    且行且珍惜_iOS:这个就跟微信的分享附件要求有关了
  • WebbWang0323:请问有分享到Facebook的具体demo吗?
    且行且珍惜_iOS:@郡王丶千夜 按照facebook的官官方文档集成呀
    郡王丶千夜:@且行且珍惜_iOS 你说的集成是指把facebook的分享SDK放在工程里就行了吗?还是也要做其他操作?
    且行且珍惜_iOS:@Only_King iOS10之前系统分享可以直接调起Facebook分享,iOS10之后你需要自己集成Facebook官方分享sdk
  • 取个帅气白勺昵称吧:楼主有尝试过分享url视频么?
    且行且珍惜_iOS:@取个帅气白勺昵称吧 没遇到过,微信可能不支持传视频的URL吧,你换成别的URL试试
    取个帅气白勺昵称吧:我遇到了一个问题,视频先完成下载,再分享出去,发现分享到QQ可以,但微信发送不成功,请问有遇到过类似问题吗
  • Lietlight:不能分享到Facebook,根本就打不开,是为什么
    Lietlight:@且行且珍惜_iOS 好的,谢谢指导:blush:
    且行且珍惜_iOS:@Lietlight iOS10之前需要在系统设置中登陆Facebook和twwiter账号才能分享,iOS10之后就不 支持原生分享facebook和twwiter了,需要嵌入官方的sdk才行
  • uncleRX:你好 请问可以正常进行gif分享吗? 我试过转成url,NSData,分享出来都是.png格式
    且行且珍惜_iOS:@uncleRX 这个取决于三方分享渠道是否支持显示gif,或者是否支持自定义分享视图
  • 我还只是个孩子啊:楼主,现在不能直接运行了吗?UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:activities];这里崩溃,报错日志为:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: key cannot be nil'。。这是什么原因啊
    且行且珍惜_iOS:UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];应该是我自定义的UIActivity在iOS11上出了问题,容我查查,你可以先把applicationActivities传nil,就能跑起来了
    且行且珍惜_iOS:@jiangjianga UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];应该是我自定义的UIActivity在iOS11上出了问题,容我查查,你可以先把applicationActivities传nil,就能跑起来了
    jiangjianga:我也是啊,怎么破?
  • 我还只是个孩子啊:如果想分享的图片是一个URL,我需要先下载到本地在哪来分享吗
    且行且珍惜_iOS:@我还只是个孩子啊 应该是分享的内容有问题,,,,,
    我还只是个孩子啊:@且行且珍惜_iOS 我分享到微信,提示“抱歉,获取数据异常,无法分享到微信”,这是什么原因,qq没问题
    且行且珍惜_iOS:@我还只是个孩子啊 是的,,
  • 阿兹尔:楼主 这个分享微信不是有个开关了, 那个开关 能我们自己打开吗
    且行且珍惜_iOS:@阿兹尔 这个没弄过,不太清楚
    阿兹尔:@且行且珍惜_iOS 懂了,那自己可以用原生滴写微信分享吗
    且行且珍惜_iOS:@阿兹尔 应该不行吧,取决于用户,,
  • DDDDeveloper:补充一下,如果不想分享到 Facebook 可以activityCtr.excludedActivityTypes = @[ UIActivityTypePostToFacebook]; 但是不想分享到微信呢,系统没有提供关于微信的类型
    且行且珍惜_iOS:@DDDDeveloper 不止微信,QQ也没提供,这个需要用户自己去更多里面设置是否关闭某个应用的分享功能,,
  • DDDDeveloper:写的非常不错,学习了。但是有个问题,我如果不想给微信分享改如何设置?
  • 阿拉斯加的狗:大哥你的代码一跑就蹦一跑就蹦啊
    阿拉斯加的狗:@且行且珍惜_iOS 可以的 大兄弟
    且行且珍惜_iOS:@阿拉斯加的狗 已经改过了,你再重新下载一下
  • 阿拉斯加的狗:大兄弟 demo跑不起来啊 求支招啊
    且行且珍惜_iOS:已经改过了,你再重新下载一下
  • jocelynting:可以在分享页面里面 隐藏掉分享出来的链接吗
  • LV大树:大大写得牛。
  • 矫炎圻:最后这个图片不错
  • 960d2a7a31bd:刚好用到,谢谢楼主
  • HoQer:系统自带的分享,微信能分享成功吗?安装了APP,但是没有申请微信的开放平台的那些东西。
    HoQer:@且行且珍惜_iOS 好的,谢谢,我找到了文章,学习中。
    且行且珍惜_iOS:@HoQer 可以的
  • Dylan大魔王:楼主写的很好,这里有个原生多图分享demo,可以跳过选择面板,互相学习
    https://github.com/TsnumiDC/TSShareHelper
    且行且珍惜_iOS::+1: :+1: 谢谢,相互学习:clap:
  • 羊驼先生丶:微信多张图片分享怎么实现呢。朋友。
    CoderMrGuo:能分享到自己的app,撸主知道怎么做么
    时光_1e30:你可可以将原生分享的按钮英文字幕设置为中文版吗?
    a83aca5e011f:https://github.com/TsnumiDC/TSShareHelper
    这里有个demo说不定能帮上你
  • d5829f899636:你好,UIActivityViewController 视图中 qq分享按钮没有显示出来是怎么回事呢?
    且行且珍惜_iOS:@meifang2016 是需要在更多里边打开QQ分享开关吧
  • 方同学哈:非常感谢
  • 奋斗路上的奋青:我的格式是本地图片+ title + 网址 , 微信分享正常, qq分享时本地图片会被网址里的图片改掉,请问你遇到这个问题了吗?
    且行且珍惜_iOS:@happy奋斗 这个我也不清楚啊,这分享的应该是链接吧,,然后对方根据URL文件下载吧,,
    happy奋斗:你好问一下 怎么发送文件,从网络下载下来的zip文件要分享到,wps里面
    且行且珍惜_iOS:遇到过,本地图片和URL网址不能同时存在,默认会去解析请求网址里的图片,,,
  • 奋斗路上的奋青:qq分享图片被篡改问题怎么解决的?
  • 谢衣丶:可不可以不创建那个分享控制器直接分享?就是说我在界面上放几个社交平台的按钮 我点一下按钮就直接分享出去 不通过那个系统自带的选择平台的控制器
    且行且珍惜_iOS:@谢衣丶 不行就用友盟三方分享呗,,,
    谢衣丶:@且行且珍惜_iOS 嗯 我就是想获取直接分享到各平台的方法 省略掉弹出控制器选平台 愁人啊
    且行且珍惜_iOS:@谢衣丶 应该是必须要创建的,但是你可以不让分享控制器出现啊,如果需要用到系统上的分享事件,就需要调用对应的回调方法了,,
  • 訫若載:大神,能够缩短Activity的弹出时间吗
    且行且珍惜_iOS:@訫若載 什么意思?是想让它弹出后自动消失吗?
  • 96fa23ceb313:请问一下 能在分享多张图片的时候顺带文字么?
    且行且珍惜_iOS:@CoCo欧尼酱 应该是可以的,,
    :smile:
  • fly大梦想家:啦啦加油
  • Mr_某某某:有demo吗?
    且行且珍惜_iOS:@Mr_某某某 https://github.com/wslcmk/UIActivityViewController.git

本文标题:UIActivityViewController系统原生分享-仿

本文链接:https://www.haomeiwen.com/subject/retfettx.html