IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    shendao发表于 2017-05-05 12:14:07
    love 0

    首先要说的是,为什么如此多的分享平台,可以直接集成各个平台的分享功能,还要来实现系统原生的分享功能。没办法,分享功能被微信大大禁用了,设计诱导用户分享,那就只能绕一个圈将内容分享出去,并且还不会影响现在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];
    iOS通过UIActivityViewController实现原生分享功能
    举例

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

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

    iOS通过UIActivityViewController实现原生分享功能
    平台分享.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可以自定义,上边的图标以及按钮可以自己进行自定义,也可以实现与各大分享平台的对接。暂时没有用到,因此没有具体实现。

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



沪ICP备19023445号-2号
友情链接