iOS

前言

	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)
      
原文地址:https://www.cnblogs.com/QianChia/p/5758589.html