自定义UIActivity实现系统自带UIActivityViewController分享功能

oait0991 9年前
   <p>有时我们需要调用系统自带分享,可以使用UIActivityViewController:</p>    <p>简单用法代码如下:</p>    <pre>  <code class="language-objectivec">NSMutableArray *items = [[NSMutableArray alloc] init];      [items addObject:@"分享的title"];      [items addObject:[UIImage imageNamed:@"1"]];      [items addObject:@"https://www.baidu.com"];        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];      //NSMutableArray *excludedActivityTypes =  [NSMutableArray arrayWithArray:@[UIActivityTypeAirDrop, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeMail, UIActivityTypePostToTencentWeibo, UIActivityTypeSaveToCameraRoll, UIActivityTypeMessage, UIActivityTypePostTo推ter]];      //activityViewController.excludedActivityTypes = excludedActivityTypes;      [self presentViewController:activityViewController animated:YES completion:nil];      activityViewController.completionWithItemsHandler = ^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){          NSLog(@"%@  ----   %@", activityType, returnedItems);      };</code></pre>    <p>效果图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4946dbe76822c88eece54c62d2d9c3ba.png"></p>    <p>将上面代码两行注释打开效果图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/832a4a61f87ee0544c32fc31e1239317.png"></p>    <p>现在我们要自定义第二行(More行)的显示,必须重写UIActivity,效果图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fe2cfded026c34ced45e005ec08fd9f0.png"></p>    <p>UIActivityViewController</p>    <pre>  <code class="language-objectivec">NS_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface UIActivityViewController : UIViewController</code></pre>    <p>可以看出UIActivityViewController是在iOS 6开始支持,且继UIViewController</p>    <p>初始化方法</p>    <pre>  <code class="language-objectivec">- (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivities</code></pre>    <p>参数:</p>    <p>activityItems :数组内的对象代表的是我们想要操作的数据的一些属性,而且这个数组至少需要一个值,比如我们PDF文档的名称,URL;</p>    <p>applicationActivities :数组指定了泛型,数组内的对象必须是 UIActivity 类型的对象,代表的是iOS系统支持的我们自定义的服务(后边有讲解)</p>    <p>UIActivityViewController 中如果不想显示某些系统自带分享功能,可以使用下面这个属性进行设置,数组中的 UIActivityType 对象就是不显示的item功能</p>    <pre>  <code class="language-objectivec">@property(nullable, nonatomic, copy) NSArray<UIActivityType> *excludedActivityTypes;</code></pre>    <p>UIActivityType 类型有如下:</p>    <pre>  <code class="language-objectivec">UIKIT_EXTERN UIActivityType const UIActivityTypePostTo非死book     NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypePostTo推ter      NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypePostToWeibo        NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;   UIKIT_EXTERN UIActivityType const UIActivityTypeMessage            NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypeMail               NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypePrint              NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypeCopyToPasteboard   NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypeAssignToContact    NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypeSaveToCameraRoll   NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypeAddToReadingList   NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypePostToFlickr       NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypePostToVimeo        NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypePostToTencentWeibo NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypeAirDrop            NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;  UIKIT_EXTERN UIActivityType const UIActivityTypeOpenInIBooks</code></pre>    <p>如果我们不想展示AirDrop功能,我们把 UIActivityTypeAirDrop 添加到 excludedActivityTypes 里面:</p>    <pre>  <code class="language-objectivec">activityViewController.excludedActivityTypes = @[UIActivityTypeAirDrop];</code></pre>    <h3>自定义UIActivity对象</h3>    <p>UIActivity类中的方法说明:</p>    <pre>  <code class="language-objectivec">//分享类型,我们自定义UIActivity有多种类型,如分享微信、朋友圈、微博、QQ等,所以要指定类型,方便我们在performActivity事件中判断用户行为  - (nullable UIActivityType)activityType;  //显示的title  - (nullable NSString *)activityTitle;  //显示的图标  - (nullable UIImage *)activityImage;  //用户的行为事件捕获,可以根据activityTitle判断用户行为  - (void)performActivity;  //在用户选择展示在UIActivityViewController中的自定义服务的图标之后,调用自定义服务处理方法之前的准备工作,都需要在这个方法中指定,比如可以根据数据展示一个界面来获取用户指定的额外数据信息  - (void)prepareWithActivityItems:(NSArray *)activityItems;  //指定可以处理的数据类型,如果可以处理则返回YES  - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems;  //UIActivityViewController中的服务分为了俩种,UIActivityCategoryAction和UIActivityCategoryShare,UIActivityCategoryAction表示在最下面一栏的操作型服务,比如Copy、Print;UIActivityCategoryShare表示在中间一栏的分享型服务,比如一些社交软件   + (UIActivityCategory)activityCategory NS_AVAILABLE_IOS(7_0);</code></pre>    <p>代码实现:</p>    <p>自定义UIActivity对象代码:</p>    <pre>  <code class="language-objectivec">NSString * const ActivityServiceWeixin = @"weixin";  NSString * const ActivityServiceWeixinFriends = @"weixin_friends";  @interface HBShareBaseActivity : UIActivity  @property (nonatomic) NSString *title;  @property (nonatomic) NSString *type;  @property (nonatomic) NSString *urlString;  @property (nonatomic) NSString *shareDescription;  @property (nonatomic) NSString *shareTitle;  @property (nonatomic) UIImage *image;  - (instancetype)initWithTitle:(NSString *)title type:(NSString *)type;  @end    @implementation HBShareBaseActivity  - (instancetype)initWithTitle:(NSString *)title type:(NSString *)type{      if (self = [super init]) {          self.title = title;          self.type = type;      }      return self;  }  - (NSString *)activityTitle{      return self.title;  }  - (NSString *)activityType{      return self.type;  }  - (UIImage *)activityImage{      NSString *weixinImageString = @"ic_share_wechat";      NSString *friendsImageString = @"ic_share_circle";      NSString *imageName = [self.type isEqualToString:ActivityServiceWeixin] ?      weixinImageString: friendsImageString;      NSData *imageData = [NSData dataWithBase64EncodedString:imageName];      return [UIImage imageWithData:imageData scale:2.0];  }  - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{      return YES;  }  - (void)prepareWithActivityItems:(NSArray *)activityItems  {  }  - (void)performActivity{        if ([self.type isEqualToString:ActivityServiceWeixin]) {          NSLog(@"在这里可以实现微信分享代码");      }else{          NSLog(@"在这里可以实现朋友圈分享代码");      }  }  @end</code></pre>    <p>创建ShareTool类,继承自NSObject,使用自定义的HBShareBaseActivity类,代码实现如下:</p>    <pre>  <code class="language-objectivec">@interface ShareTool : NSObject  - (void)shareWithTitle:(NSString *)title description:(NSString *)description url:(NSString *)url image:(UIImage *)image completionHandler:(UIActivityViewControllerCompletionHandler)completionHandler;  @end  @interface ShareTool()  @property (nonatomic, copy) UIActivityViewControllerCompletionHandler completionHandler;  @end  @implementation ShareTool  - (void)shareWithTitle:(NSString *)title description:(NSString *)description url:(NSString *)url image:(UIImage *)image completionHandler:(UIActivityViewControllerCompletionHandler)completionHandler  {      NSMutableArray *items = [[NSMutableArray alloc] init];      [items addObject:title?:@""];      if (image) {          [items addObject:image];      }      if (url) {          [items addObject:url];      }        NSMutableArray *activities = [[NSMutableArray alloc] init];      HBShareBaseActivity *weixinActivity = [[HBShareBaseActivity alloc] initWithTitle:@"微信" type:ActivityServiceWeixin];      HBShareBaseActivity *weixinFriendsActivity = [[HBShareBaseActivity alloc] initWithTitle:@"朋友圈" type:ActivityServiceWeixinFriends];      [@[weixinActivity, weixinFriendsActivity] enumerateObjectsUsingBlock:^(HBShareBaseActivity *activity, NSUInteger idx, BOOL *stop) {          activity.urlString = url;          activity.shareDescription = description;          activity.shareTitle = title;          activity.image = image;      }];      [activities addObjectsFromArray:@[weixinActivity, weixinFriendsActivity]];        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities];      NSMutableArray *excludedActivityTypes =  [NSMutableArray arrayWithArray:@[UIActivityTypeAirDrop, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeMail, UIActivityTypePostToTencentWeibo, UIActivityTypeSaveToCameraRoll, UIActivityTypeMessage, UIActivityTypePostTo推ter]];        activityViewController.excludedActivityTypes = excludedActivityTypes;      AppDelegate *tempAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];      [tempAppDelegate.window.rootViewController presentViewController:activityViewController animated:YES completion:nil];        activityViewController.completionHandler = ^(NSString *activityType, BOOL complted){          if (completionHandler) {              completionHandler(activityType, complted);              self.completionHandler = nil;          }      };  }</code></pre>    <p>在ViewController中调用代码如下:</p>    <pre>  <code class="language-objectivec">[[[ShareTool alloc] init] shareWithTitle:@"分享的title" description:@"描述信息" url:@"http://www.baidu.com" image:[UIImage imageNamed:@"1"] completionHandler:^(UIActivityType  _Nullable activityType, BOOL completed) {         NSLog(@"%@  %d", activityType, completed);     }];</code></pre>    <p>补充:</p>    <p>在UIActivityViewController中给用户展示的服务的图标 activityImage 。关于这里的图标,有非常严格的限制:</p>    <ul>     <li>首先是图标的背景色,这里推荐最好的完全透明的背景色;<br> 官方文档中是这么解释的: "The alpha channel of the image is used as a mask to generate the final image that is presented to the user. Any color data in the image itself is ignored. Opaque pixels have a gradient applied to them and this gradient is then laid on top of a standard background. Thus, a completely opaque image would yield a gradient filled rectangle", 意思大概是,在这里颜色数据会被忽略,而透明图层会被当做mask(蒙版图层),不透明的图片会显示成渐进色填充。</li>     <li>其次是图标的尺寸,在不同的设备需要不同的尺寸,因此需要准备一套图标。 <p style="text-align:center"><img src="https://simg.open-open.com/show/36a59089ec8430451491e254aba51fda.png"></p> 因此上面代码中图片地址: <pre>  <code class="language-objectivec">NSString *weixinImageString = @"ic_share_wechat";  NSString *friendsImageString = @"ic_share_circle";</code></pre> 可以改成下面图片地址(有点长):</li>    </ul>    <pre>  <code class="language-objectivec">NSString *weixinImageString = @"iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4M0FENzkyMUYwNUJFMzExQjM1RkRBMzFGNDZFOTMyQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQjc4MzgxMjVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQjc4MzgxMTVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUwNTg3QTZFMDU1Q0UzMTFCMzVGREEzMUY0NkU5MzJBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjgzQUQ3OTIxRjA1QkUzMTFCMzVGREEzMUY0NkU5MzJBIi8+IDwvcmRmOkRlc2NyaXB0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";  NSString *friendsImageString = @"iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4M0FENzkyMUYwNUJFMzExQjM1RkRBMzFGNDZFOTMyQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQjc4MzgxNjVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQjc4MzgxNTVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUwNTg3QTZFMDU1Q0UzMTFCMzVGREEzMUY0NkU5MzJBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjgzQUQ3OTIxRjA1QkUzMTFCMzVGREEzMUY0NkU5MzJBIi8+IDwvcmRmOkRlc2NyaXB0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";</code></pre>    <p>来自:http://www.jianshu.com/p/d500fb72a079</p>    <p> </p>