iOS - UIActivityViewController

简介: 前言 NS_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface UIActivityViewController : UIViewController @available(iOS 6.0, *) public class UIActivityViewController : UIViewControllerUIActivity 是 iOS 6.0 开始的一个十分有用的控件,可以十分方便的将文字、图片等内容进行分享,比如分享到微信、新浪微博、发邮件、发短信等。

前言

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

1、系统 activityViewController 的创建

  • Objective-C

        // 设置分享的内容
        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

        // 设置分享的内容
    
        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

          @interface myUIActivity : UIActivity    
          @end
    • myUIActivity.m

          /*
              自定义分享按钮
          */
      
          @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

          // 设置分享的内容
          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

          /*
              自定义分享按钮
          */
          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

          // 设置分享的内容
          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

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

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

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

          // 需要包含头文件 #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];
    • 发送邮件

          // 需要包含头文件 #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];
    • 发送推文

          // 需要包含头文件 #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

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

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

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

          // 需要包含头文件 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)
    • 发送邮件

          // 需要包含头文件 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)
目录
相关文章
|
iOS开发
iOS开发UI之日期控件的使用(UIDatePicker)
iOS开发UI之日期控件的使用(UIDatePicker)
441 0
|
3月前
|
测试技术 Swift iOS开发
探索iOS自动化测试:使用Swift编写UI测试
【8月更文挑战第31天】在软件开发的海洋中,自动化测试是保证船只不偏离航线的灯塔。本文将带领读者启航,深入探索iOS应用的自动化UI测试。我们将通过Swift语言,点亮代码的灯塔,照亮测试的道路。文章不仅会展示如何搭建测试环境,还会提供实用的代码示例,让理论知识在实践中生根发芽。无论你是新手还是有经验的开发者,这篇文章都将是你技能提升之旅的宝贵指南。
|
机器学习/深度学习 安全 测试技术
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试
阿里云EMAS测试专家有着集团内部多个日活过亿规模APP经验,提供EMAS专家测试,客户只需提交测试需求,从用例设计、脚本录制、海量机型测试、整理测试结果、48小时输出专家测试报告均由阿里云EMAS测试专家一站式服务完成。覆盖功能测试、深度兼容测试、性能测试、UI适配测试以及隐私合规检测等,帮助用户以更低成本获得高质量的全面测试能力,可用于APP正式发版前验收,规避手机APP上线前或发版过程中各类隐患。
518 0
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试
|
jenkins 测试技术 macaca
iOS UI 自动化测试原理以及在 Trip.com 的应用实践
笔者入职 Trip.com 已满一年,回顾这一年的工作历程,约一半的时间都在做 UI 自动化测试相关内容。从而,笔者更深入地研究了 iOS 平台下的自动化测试技术,目前也在负责部门 App 自动化测试平台的搭建和维护。故想借这篇文章一并将所踩过的坑以及学习到的技术,系统且全面地整理出分享给大家。
387 0
iOS UI 自动化测试原理以及在 Trip.com 的应用实践
|
iOS开发
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
iOS开发UI篇 - Quartz 2D简单使用
|
缓存 运维 监控
如何优化iOS系统上的图文评论UI界面
在我们的社交 APP 上,⽤户的动态由精美的照⽚ 、视频和⽂字组成。对于每张照⽚和视频, 我 们都会展示出完整的标题和五个最新评论。由于⽤户喜欢使⽤标题来讲述照⽚背后的故事, 因此它们通常很⻓ 、很复杂, 并且可能包含超链 接和表情符号。渲染如此复杂的⽂本带来了⼀些问题, 它在滚动时造成性能下降。 即使在 iPhone 12 这样的新设备上, 复杂标题的初始⽂本绘制需要⻓达 50 毫秒, ⽽⽂本展示 需要⻓达 30 毫秒, 渲染速度很慢。⽂本问题还是简单问题, 有时我们需要加载更加复杂的图⽚甚⾄视频。所有这些步骤都发⽣在 UI 线程上, 导致app在⽤户滚动时丢帧。
如何优化iOS系统上的图文评论UI界面
|
数据处理 iOS开发 开发者
iOS开发中活动视图控制器UIActivityViewController的应用
iOS开发中活动视图控制器UIActivityViewController的应用
357 0
iOS开发中活动视图控制器UIActivityViewController的应用
|
存储 数据库 开发者
iOS9系列专题五——全新的联系人与联系人UI框架(二)
iOS9系列专题五——全新的联系人与联系人UI框架
393 0
iOS9系列专题五——全新的联系人与联系人UI框架(二)
|
编解码 安全 Linux
flutter 在windows和linux上运行IOS UI模拟器
之前发视频总是有人留言,我用的什么模拟器,今天给大家说一下 我一般用的是device_preview这个插件,这个插件的闲置是只能做UI上的模拟,并没有真正的运行环境。 近似您的应用程序在另一台设备上的外观和性能。
395 0
|
iOS开发 C++
iOS子线程更新UI的两种方法
iOS子线程更新UI的两种方法
524 0