iOS 通过UIActivityViewController实现更多分享服务
初始化
接着我们在Button的触发方法里面开始操作UIActivityViewController
来提供服务。首先,我们需要初始化一个UIActivityViewController
的实例,UIActivityViewController
提供了一个初始化方法:
- (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivities NS_DESIGNATED_INITIALIZER;
excludedActivityTypes
UIActivityViewController
相比于UIDocumentInteractionController
优势除了可以添加额外的自定义服务,它还提供了非常好的原生服务的定制化功能。我们可以完全根据自己的需求,控制UIActivityViewController
提供的系统服务的显示,比如我不想展示AirDrop
这个功能,而这点在UIDocumentInteractionController
是做不到的。想做到这一点,就需要使用到UIActivityViewController
提供的一个属性:
@property(nullable, nonatomic, copy) NSArray<NSString *> *excludedActivityTypes; // default is nil. activity types listed will not be displayed
正如注释中提到的,excludedActivityTypes
这个属性包含了所有不想在UIActivityViewController
中展示的Item服务。excludedActivityTypes
是一个字符串数组,所包含的内容必须是系统提供的UIActivity
的activityType
字符串,而系统提供的字符串如下:
NSString *const UIActivityTypePostToFacebook;
NSString *const UIActivityTypePostToTwitter;
NSString *const UIActivityTypePostToWeibo;
NSString *const UIActivityTypeMessage;
NSString *const UIActivityTypeMail;
NSString *const UIActivityTypePrint;
NSString *const UIActivityTypeCopyToPasteboard;
NSString *const UIActivityTypeAssignToContact;
NSString *const UIActivityTypeSaveToCameraRoll;
NSString *const UIActivityTypeAddToReadingList;
NSString *const UIActivityTypePostToFlickr;
NSString *const UIActivityTypePostToVimeo;
NSString *const UIActivityTypePostToTencentWeibo;
NSString *const UIActivityTypeAirDrop;
AirDrop
功能,我们把UIActivityTypeAirDrop
添加到excludedActivityTypes
里面:activity.excludedActivityTypes = @[UIActivityTypeAirDrop];
#import "UIViewController+Extension.h"
//#import "DZNPolyActivity.h"
@implementation UIViewController (Extension)
+ (UIViewController* )topViewController {
UIViewController* vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
while (1) {
if ([vc isKindOfClass:[UINavigationController class]]) {
vc = [(UINavigationController* )vc topViewController];
continue;
} else if ([vc isKindOfClass:[RESideMenu class]]) {
vc = [(RESideMenu* )vc contentViewController];
continue;
}
break;
}
return vc;
}
+ (void)showActivityWithURL:(NSURL* )url completion:(void (^)(void))completion {
[[self topViewController] showActivityWithURL:url completion:completion];
}
- (void)showActivityWithURL:(NSURL* )url completion:(void (^)(void))completion {
if (url) {
NSArray* activityItems = @[url];
UIActivityViewController *activityVC =
[[UIActivityViewController alloc] initWithActivityItems:activityItems
applicationActivities:nil];
activityVC.excludedActivityTypes = @[UIActivityTypePrint,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo];
[self presentViewController:activityVC animated:TRUE completion:nil];
}
}
@end
/////////////////////////////////////////////////////////////////////////
- (IBAction)onShareButtonPressed:(id)sender {
YDSDKArticleModelEx* aModel = [self article];
[UIViewController showActivityWithURL:aModel.url.url completion:nil];
}