UIActivityViewController 分享视图控制器

前言

  • Objective-C

    1
    NS_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface UIActivityViewController : UIViewController
  • Swift

    1
    @available(iOS 6.0, *) public class UIActivityViewController : UIViewController
  • UIActivity 是 iOS 6.0 开始的一个十分有用的控件,可以十分方便的将文字、图片等内容进行分享,比如分享到微信、新浪微博、发邮件、发短信等。我们不仅可以分享内容出来,也可以在自己的 App 里添加自定义的分享按钮或者隐藏已有的分享按钮来实现定制的功能。

1、系统 activityViewController 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    // 设置分享的内容
    NSString *textToShare = @"请大家登录《iOS云端与网络通讯》服务网站。";
    UIImage *imageToShare = [UIImage imageNamed:@"swift"];
    NSURL *urlToShare = [NSURL URLWithString:@"http://m.baidu.com"];

    // 创建分享视图控制器
    /*
    activityItems: 分享的内容
    applicationActivities: 分享的类型,默认(nil)时为 UIActivity
    */
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
    initWithActivityItems:@[textToShare, imageToShare, urlToShare]
    applicationActivities:nil];

    // 设置不出现的分享按钮
    /*
    Activity 类型又分为 “操作” 和 “分享” 两大类:

    UIActivityCategoryAction 操作:
    UIActivityTypeAirDrop AirDrop AirDrop
    UIActivityTypePrint 打印 Print

    UIActivityTypeSaveToCameraRoll 保存到相册 Save Image
    UIActivityTypeAssignToContact 添加到联系人 AssignToContact
    UIActivityTypeAddToReadingList 添加到 Safari 阅读列表 AddToReadingList
    UIActivityTypeCopyToPasteboard 复制到剪贴板 Copy

    UIActivityCategoryShare 分享:
    UIActivityTypeMail 邮箱 Mail
    UIActivityTypeMessage 短信 Message

    UIActivityTypePostToTwitter 分享到 Twitter
    UIActivityTypePostToFacebook 分享到 Facebook
    UIActivityTypePostToVimeo 分享到 Vimeo(视频媒体)
    UIActivityTypePostToFlickr 分享到 Flickr(网络相簿)
    UIActivityTypePostToWeibo 分享到 新浪微博
    UIActivityTypePostToTencentWeibo 分享到 腾讯微博

    添加到此数组中的系统分享按钮项将不会出现在分享视图控制器中
    */
    activityViewController.excludedActivityTypes = @[UIActivityTypeAssignToContact,
    UIActivityTypePrint];

    // 显示分享视图控制器
    [self presentViewController:activityViewController animated:YES completion:nil];

    // 分享完成
    activityViewController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed,
    NSArray *returnedItems, NSError *activityError) {

    // 分享完成或退出分享时调用该方法
    NSLog(@"分享完成");
    };
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    // 设置分享的内容

    let textToShare = "请大家登录《iOS云端与网络通讯》服务网站。"
    let imageToShare: AnyObject = UIImage(named: "swift") as! AnyObject
    let urlToShare: AnyObject = NSURL(string: "http://m.baidu.com") as! AnyObject

    // 创建分享视图控制器
    /*
    activityItems: 分享的内容
    applicationActivities: 分享的类型,默认(nil)时为 UIActivity
    */
    let activityViewController = UIActivityViewController(activityItems: [textToShare, imageToShare, urlToShare],
    applicationActivities: nil)

    // 设置不出现的分享按钮
    /*
    Activity 类型又分为 “操作” 和 “分享” 两大类:

    UIActivityCategoryAction 操作:
    UIActivityTypeAirDrop AirDrop AirDrop
    UIActivityTypePrint 打印 Print

    UIActivityTypeSaveToCameraRoll 保存到相册 Save Image
    UIActivityTypeAssignToContact 添加到联系人 AssignToContact
    UIActivityTypeAddToReadingList 添加到 Safari 阅读列表 AddToReadingList
    UIActivityTypeCopyToPasteboard 复制到剪贴板 Copy

    UIActivityCategoryShare 分享:
    UIActivityTypeMail 邮箱 Mail
    UIActivityTypeMessage 短信 Message

    UIActivityTypePostToTwitter 分享到 Twitter
    UIActivityTypePostToFacebook 分享到 Facebook
    UIActivityTypePostToVimeo 分享到 Vimeo(视频媒体)
    UIActivityTypePostToFlickr 分享到 Flickr(网络相簿)
    UIActivityTypePostToWeibo 分享到 新浪微博
    UIActivityTypePostToTencentWeibo 分享到 腾讯微博

    添加到此数组中的系统分享按钮项将不会出现在分享视图控制器中
    */
    activityViewController.excludedActivityTypes = [UIActivityTypeAssignToContact, UIActivityTypePrint]

    // 显示分享视图控制器
    self.presentViewController(activityViewController, animated: true, completion: nil)

    // 分享完成
    activityViewController.completionWithItemsHandler = { activityType, completed, returnedItems, activityError in

    // 分享完成或退出分享时调用该方法
    print("分享完成")
    }

2、自定义 activityViewController 的创建

  • Objective-C

    • myUIActivity.h

      1
      2
      @interface myUIActivity : UIActivity	
      @end
    • myUIActivity.m

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      /*
      自定义分享按钮
      */

      @implementation myUIActivity

      // 设置分享按钮的类型
      - (NSString *)activityType {

      // 在 completionWithItemsHandler 回调里可以用于判断,一般取当前类名
      return NSStringFromClass([myUIActivity class]);
      }

      // 设置分享按钮的标题
      - (NSString *)activityTitle {

      // 设置显示在分享框里的名称
      return @"myUIActivity";
      }

      // 设置分享按钮的图片
      - (UIImage *)activityImage {

      // 图片自定变为黑白色,默认尺寸为 56 * 56 像素
      return [UIImage imageNamed:@"JHQ0228"];
      }

      // 设置是否显示分享按钮
      - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {

      // 这里一般根据用户是否授权等来决定是否要隐藏分享按钮
      return YES;
      }

      // 预处理分享数据
      - (void)prepareWithActivityItems:(NSArray *)activityItems {

      // 解析分享数据时调用,可以进行一定的处理
      }

      // 执行分享
      - (UIViewController *)activityViewController {

      // 点击自定义分享按钮时调用,跳转到自定义的视图控制器
      return nil;
      }

      // 执行分享
      - (void)performActivity {

      // 点击自定义分享按钮时调用
      }

      // 完成分享
      - (void)activityDidFinish:(BOOL)completed {

      // 分享视图控制器退出时调用
      }

      @end
    • ViewController.m

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      // 设置分享的内容
      NSString *textToShare = @"请大家登录《iOS云端与网络通讯》服务网站。";
      UIImage *imageToShare = [UIImage imageNamed:@"swift"];
      NSURL *urlToShare = [NSURL URLWithString:@"http://m.baidu.com"];

      // 设置分享的类型
      myUIActivity *myActivity = [[myUIActivity alloc] init];

      // 创建分享视图控制器
      UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
      initWithActivityItems:@[textToShare, imageToShare, urlToShare]
      applicationActivities:@[myActivity]];

      // 设置不出现的分享按钮
      /*
      添加到此数组中的系统分享按钮项将不会出现在分享视图控制器中
      */
      activityViewController.excludedActivityTypes = @[UIActivityTypeAssignToContact,
      UIActivityTypePrint,
      UIActivityTypeAssignToContact,
      UIActivityTypeAddToReadingList,
      UIActivityTypeCopyToPasteboard];

      // 显示分享视图控制器
      [self presentViewController:activityViewController animated:YES completion:nil];

      // 分享完成
      activityViewController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed,
      NSArray *returnedItems, NSError *activityError) {

      // 分享完成或退出分享时调用该方法
      NSLog(@"分享完成");
      };
  • Swift

    • myUIActivity.swift

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      /*
      自定义分享按钮
      */
      class myUIActivity: UIActivity

      // 设置分享按钮的类型
      override func activityType() -> String? {

      // 在 completionWithItemsHandler 回调里可以用于判断,一般取当前类名
      return NSStringFromClass(myUIActivity.self)
      }

      // 设置分享按钮的标题
      override func activityTitle() -> String? {

      // 设置显示在分享框里的名称
      return "myUIActivity"
      }

      // 设置分享按钮的图片
      override func activityImage() -> UIImage? {

      // 图片自定变为黑白色,默认尺寸为 56 * 56 像素
      return UIImage(named: "JHQ0228")
      }

      // 设置是否显示分享按钮
      override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {

      // 这里一般根据用户是否授权等来决定是否要隐藏分享按钮
      return true
      }

      // 预处理分享数据
      override func prepareWithActivityItems(activityItems: [AnyObject]) {

      // 解析分享数据时调用,可以进行一定的处理
      }

      // 执行分享
      override func activityViewController() -> UIViewController? {

      // 点击自定义分享按钮时调用,跳转到自定义的视图控制器
      return nil
      }

      // 执行分享
      override func performActivity() {

      // 点击自定义分享按钮时调用
      }

      // 完成分享
      override func activityDidFinish(completed: Bool) {

      // 分享视图控制器退出时调用
      }
    • ViewController.swift

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      // 设置分享的内容
      let textToShare = "请大家登录《iOS云端与网络通讯》服务网站。"
      let imageToShare: AnyObject = UIImage(named: "swift") as! AnyObject
      let urlToShare: AnyObject = NSURL(string: "http://m.baidu.com") as! AnyObject

      // 设置分享的类型
      let myActivity = myUIActivity()

      // 创建分享视图控制器
      let activityViewController = UIActivityViewController(activityItems: [textToShare, imageToShare, urlToShare],
      applicationActivities: [myActivity])

      // 设置不出现的分享按钮
      /*
      添加到此数组中的系统分享按钮项将不会出现在分享视图控制器中
      */
      activityViewController.excludedActivityTypes = [UIActivityTypeAssignToContact,
      UIActivityTypePrint,
      UIActivityTypeAssignToContact,
      UIActivityTypeAddToReadingList,
      UIActivityTypeCopyToPasteboard]

      // 显示分享视图控制器
      self.presentViewController(activityViewController, animated: true, completion: nil)

      // 分享完成
      activityViewController.completionWithItemsHandler = { activityType, completed, returnedItems, activityError in

      // 分享完成或退出分享时调用该方法方法
      print("分享完成")
      }

3、手动执行分享操作

  • Objective-C

    • 打开 URL

      1
      2
      // 调用 Safari 浏览器打开,系统支持的 URL scheme 包括:mailto://、tel://、sms://、and maps://
      [[UIApplication sharedApplication] openURL:activityItems[2]];
    • 添加到 Safari 阅读列表

      1
      2
      3
      4
      // 需要包含头文件 #import <SafariServices/SafariServices.h>
      [[SSReadingList defaultReadingList] addReadingListItemWithURL:activityItems[2]
      title:@"百度"
      previewText:@"百度一下,你就知道" error:nil];
    • 保存到相册

      1
      UIImageWriteToSavedPhotosAlbum(activityItems[1], nil, nil, nil);
    • 发送短信

      1
      2
      3
      4
      5
      6
      7
      // 需要包含头文件 #import <MessageUI/MessageUI.h> ,遵守协议 <UINavigationControllerDelegate>

      MFMessageComposeViewController *messageVC = [[MFMessageComposeViewController alloc] init];
      messageVC.delegate = self;
      messageVC.recipients = @[@"mattt@nshipster•com"];
      messageVC.body = @"Lorem ipsum dolor sit amet";
      [self presentViewController:messageVC animated:YES completion:nil];
    • 发送邮件

      1
      2
      3
      4
      5
      6
      7
      // 需要包含头文件 #import <MessageUI/MessageUI.h>

      MFMailComposeViewController *mailVC = [[MFMailComposeViewController alloc] init];
      [mailVC setToRecipients:@[@"mattt@nshipster•com"]];
      [mailVC setSubject:@"Hello"];
      [mailVC setMessageBody:@"Lorem ipsum dolor sit amet" isHTML:NO];
      [self presentViewController: mailVC animated:YES completion:nil];
    • 发送推文

      1
      2
      3
      4
      5
      // 需要包含头文件 #import <Twitter/Twitter.h>

      TWTweetComposeViewController *tweetVC = [[TWTweetComposeViewController alloc] init];
      [tweetVC setInitialText:@"Lorem ipsum dolor sit amet."];
      [self presentViewController: tweetVC animated:YES completion:nil];
  • Swift

    • 打开 URL

      1
      2
      // 调用 Safari 浏览器打开,系统支持的 URL scheme 包括:mailto://、tel://、sms://、and maps://
      UIApplication.sharedApplication().openURL(activityItems[2] as! NSURL)
    • 添加到 Safari 阅读列表

      1
      2
      3
      4
      5
      // 需要包含头文件 import SafariServices
      SSReadingList.defaultReadingList().addReadingListItemWithURL(activityItems[2] as! NSURL,
      title: "百度",
      previewText: "百度一下,你就知道",
      error: nil)
    • 保存到相册

      1
      UIImageWriteToSavedPhotosAlbum(activityItems[1] as! UIImage, nil, nil, nil);
    • 发送短信

      1
      2
      3
      4
      5
      6
      7
      // 需要包含头文件 import MessageUI ,遵守协议 UINavigationControllerDelegate

      var messageVC = MFMessageComposeViewController()
      messageVC.delegate = self
      messageVC.recipients = ["mattt@nshipster•com"]
      messageVC.body = "Lorem ipsum dolor sit amet"
      self.presentViewController(messageVC, animated:true, completion:nil)
    • 发送邮件

      1
      2
      3
      4
      5
      6
      7
      // 需要包含头文件 import MessageUI

      var mailVC = MFMailComposeViewController()
      mailVC.setToRecipients(["mattt@nshipster•com"])
      mailVC.setSubject("Hello")
      mailVC.setMessageBody("Lorem ipsum dolor sit amet", isHTML:false)
      self.presentViewController(mailVC, animated:true, completion:nil)
文章目录
  1. 1. 前言
  2. 2. 1、系统 activityViewController 的创建
  3. 3. 2、自定义 activityViewController 的创建
  4. 4. 3、手动执行分享操作
隐藏目录