使用UIActivityViewController自定義分享的方式,
以下代碼創建一個UIActivityViewController,可以用AirDrop、郵件、QQ、微信分享,AirDrop分享是數據傳輸,其他三項是文本分享,可以在實現了UIActivityItemSource協議的item類中控制,
// 創建UIActivityViewController,並呈現 -(void)createAndShowActivityViewController { // 構造自定義Activities,只選擇系統的 mail 和 airDrop 類型 NSArray *activities = @[[QQActivity new], [WeChatActivity new]]; NSArray *excludedActivityTypes = @[UIActivityTypePostToFacebook, UIActivityTypePostToTwitter, UIActivityTypePostToWeibo, UIActivityTypeMessage, //UIActivityTypeMail, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr, UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo]; // 構造待發送的數據項 SharedItem *item = [[SharedItem alloc] initWithData:self.data andLink:@"http://www.baidu.com?pid=12j12kjdlsaj&d=jsdlkjfch9802"]; //構建UIActivityViewController UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[item] applicationActivities:activities]; activityViewController.excludedActivityTypes = excludedActivityTypes; activityViewController.completionHandler = ^(NSString *activityType, BOOL completed){ // UIActivityViewController 退出時調用此Block // 無論是否成功,直接退出 [self.delegate backToMainView]; }; [self presentViewController:activityViewController animated:YES completion:nil]; }
只貼出微信的Activity類
#import <UIKit/UIKit.h> @interface WeChatActivity : UIActivity @end #import "WeChatActivity.h" @implementation WeChatActivity -(NSString*)activityType { //相當於 UIActivityTypeAirDrop, 可以用來判斷是什么Activity類型 return @"com.hsun.ShareViaWeChat"; } -(NSString*)activityTitle { // 顯示的Title return @"微信"; } -(UIImage*)activityImage { // 顯示的圖標,ios8及以后是彩色,大小可以查看此方法的文檔 return [UIImage imageNamed:@"weixin"]; } -(void)prepareWithActivityItems:(NSArray *)activityItems { //在此做操作,items就是要傳輸的數據,可以在此直接調用微信的api NSLog(@"%@",activityItems); } +(UIActivityCategory)activityCategory { // 決定在UIActivityViewController中顯示的位置,最上面是AirDrop,中間是Share,下面是Action return UIActivityCategoryShare; } -(void)performActivity { // 沒有自定義的UIViewController才會調用此方法。在這里可以做一些操作,需要在最后消除掉UIActivityviewController [self activityDidFinish:YES]; } -(BOOL)canPerformWithActivityItems:(NSArray *)activityItems { // 可以根據item的不同類型決定是否可以讓行為服務操作 return YES; } @end
對應的Item類(在此可以控制不同的Activity做不同的數據傳輸)
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface SharedItem : NSObject<UIActivityItemSource> -(instancetype)initWithData:(NSData*)data andLink:(NSString*)link; @end #import "SharedItem.h" @interface SharedItem () @property (nonatomic, strong) NSData *data; @property (nonatomic, strong) NSString *link; @end @implementation SharedItem -(instancetype)initWithData:(NSData *)data andLink:(NSString *)link { self = [super init]; if (self) { _data = data; _link = link; } return self; } -(instancetype)init { @throw [NSException exceptionWithName:@"Do not use" reason:@"Please use initWithData:andLink to initiate." userInfo:nil]; return nil; } #pragma mark - UIActivityItemSource -(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { return [NSData data]; } -(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { // 如果是通過 AirDrop,直接返回NSData if ([activityType isEqualToString:UIActivityTypeAirDrop]) { return self.data; } // 其他都是返回鏈接 return self.link; } -(NSString*)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType { return @"分享數據"; } -(NSString*)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType { // 如果是通過 AirDrop,直接返回NSData if ([activityType isEqualToString:UIActivityTypeAirDrop]) { return @"com.hsun.customUTI.hsundata"; } // 其他都是返回鏈接 return nil; }
