iOS通过UIActivityViewController实现原生分享功能

96
作者 RainyHand
2016.09.23 15:18 字数 736

首先要说的是,为什么如此多的分享平台,可以直接集成各个平台的分享功能,还要来实现系统原生的分享功能。没办法,分享功能被微信大大禁用了,设计诱导用户分享,那就只能绕一个圈将内容分享出去,并且还不会影响现在APP的功能(分享就会得到报酬 ),UIActivityViewController就出来了,这是系统所带的原生的分享功能,在相册中我们肯定经常使用,可以将图片视频直接分享至我们需要的平台,或者保存至系统的剪切板,备忘录等。
1.简单实现

 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];

举例


模拟器截图所有没有微信图标。

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


平台分享.png


第二个参数是一个UIActivity对象的数组,代表了应用程序支持的自定义服务。这个参数可以是nil。
3.
当弹出视图框的时候,我们发现上边很多图标是我们用不到,我们可以将用不到的图标去掉,用到的函数是

 activityVC.excludedActivityTypes = @[UIActivityTypePostToFacebook,UIActivityTypePostToTwitter, UIActivityTypePostToWeibo,UIActivityTypeMessage,UIActivityTypeMail,UIActivityTypePrint,UIActivityTypeCopyToPasteboard,UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll,UIActivityTypeAddToReadingList,UIActivityTypePostToFlickr,UIActivityTypePostToVimeo,UIActivityTypePostToTencentWeibo,UIActivityTypeAirDrop,UIActivityTypeOpenInIBooks];

以上是将能去掉的都隐藏,以上都是系统默认的功能。
实现到这我们发现,其实这个功能可以分为两大类,操作和分享,在分享类中,我们可以分享到我们三方平台,还可以分享到系统的相册等平台,在操作类中,我们可以发现我们可以将文字等保存至剪贴板,消息等。
4.分享之后的回调
回调有两个函数,先说第一个

 UIActivityViewControllerCompletionHandler myBlock = ^(NSString *activityType,BOOL completed) { 

 NSLog(@"activityType :%@", activityType); 

 if (completed)  {   

 NSLog(@"completed");
  }  
else  {
   NSLog(@"cancel"); 
 } 

completionHandler,当post结束之后(无论是done还是cancell)该blog都会被调用
 activityVC.completionHandler = myBlock;

还有一个回调

typedef void (^UIActivityViewControllerCompletionWithItemsHandler)(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError);

returnedItems是一个包含NSExtensionItem对象的数组;activityError指出出错原因
当我们分享成功或者分项取消的时候,都活调用block函数
activityType:是分享到什么平台,如果是系统的平台,会打印系统枚举类中的名字,微信等三方平台会打印com.tencent.xin.sharetimeline
成功后completed为YES否则为NO。我们在成功后或者失败后调用我们需要执行的代码。
5.补充
UIActivity可以自定义,上边的图标以及按钮可以自己进行自定义,也可以实现与各大分享平台的对接。暂时没有用到,因此没有具体实现。

简单的实现功能就是如此,学习中,与君共勉。

系统原生开发