UIActivityViewController系統(tǒng)原生分享-仿簡書分享

利用UIActivityViewController實(shí)現(xiàn)系統(tǒng)原生分享,不需要三方SDK,支持自定義分享,可以分享到微博、微信、QQ、信息、郵件、備忘錄、通訊錄、剪貼板、FaceBook.....等等 示例Github

注意:iOS10之前需要在系統(tǒng)設(shè)置中登陸Facebook和twwiter賬號才能分享,iOS10之后就不 支持原生分享facebook和twwiter了,需要嵌入官方的sdk,自定義UIActivity才行。

效果圖,諸位請看:


效果1.gif
效果2.gif

接下來介紹UIActivityViewController:Demo里也注釋的很清楚

1. 創(chuàng)建要分享的數(shù)據(jù)內(nèi)容,加在一個數(shù)組 ActivityItems里。
NSString *textToShare = @"我是且行且珍惜_iOS,歡迎關(guān)注我!";
UIImage *imageToShare = [UIImage imageNamed:@"wang.png"];
NSURL *urlToShare = [NSURL URLWithString:@"https://github.com/wslcmk"];
NSArray *activityItems = @[urlToShare,textToShare,imageToShare];
   //自定義 customActivity繼承于UIActivity,創(chuàng)建自定義的Activity加在數(shù)組Activities中。
   customActivity * custom = [[customActivity alloc] initWithTitie:@"且行且珍惜_iOS" withActivityImage:[UIImage imageNamed:@"wang"] withUrl:urlToShare withType:@"customActivity" withShareContext:activityItems];
NSArray *activities = @[custom];
  • 這里需要注意:不同的 Activity 類型所支持的數(shù)據(jù)類型不同,當(dāng)不支持時,應(yīng)用程序支持的系統(tǒng)服務(wù)按鈕就不會出現(xiàn),比如說打印、添加書簽,,,,
不同的 Activity 類型所支持的數(shù)據(jù)類型.png
/**
2. //創(chuàng)建分享視圖控制器,初始化UIActivityViewController

 ActivityItems  在執(zhí)行activity中用到的數(shù)據(jù)對象數(shù)組。數(shù)組中的對象類型是可變的,并依賴于應(yīng)用程序管理的數(shù)據(jù)。例如,數(shù)據(jù)可能是由一個或者多個字符串/圖像對象,代表了當(dāng)前選中的內(nèi)容。
 
 Activities  是一個UIActivity對象的數(shù)組,代表了應(yīng)用程序支持的自定義服務(wù)。這個參數(shù)可以是nil。
 */

UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:activities];


   // 分享功能(Facebook, Twitter, 新浪微博, 騰訊微博...)需要你在手機(jī)上設(shè)置中心綁定了登錄賬戶, 才能正常顯示。
//關(guān)閉系統(tǒng)的一些Activity類型,不需要的功能關(guān)掉。
 activityVC.excludedActivityTypes = @[UIActivityTypePostToVimeo ];

//Activity 類型又分為“操作”和“分享”兩大類
/*
 UIKIT_EXTERN NSString *const UIActivityTypePostToFacebook     NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToTwitter      NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToWeibo        NS_AVAILABLE_IOS(6_0);    //SinaWeibo
 UIKIT_EXTERN NSString *const UIActivityTypeMessage            NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeMail               NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypePrint              NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeCopyToPasteboard   NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeAssignToContact    NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeSaveToCameraRoll   NS_AVAILABLE_IOS(6_0);
 UIKIT_EXTERN NSString *const UIActivityTypeAddToReadingList   NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToFlickr       NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToVimeo        NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypePostToTencentWeibo NS_AVAILABLE_IOS(7_0);
 UIKIT_EXTERN NSString *const UIActivityTypeAirDrop            NS_AVAILABLE_IOS(7_0);
 */

 3. //判斷系統(tǒng)版本,初始化點(diǎn)擊回調(diào)方法
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
    //初始化Block回調(diào)方法,此回調(diào)方法是在iOS8之后出的,代替了之前的方法
    UIActivityViewControllerCompletionWithItemsHandler myBlock = ^(NSString *activityType,BOOL completed,NSArray *returnedItems,NSError *activityError)
    {
        NSLog(@"activityType :%@", activityType);
        if (completed)
        {
            NSLog(@"completed");
        }
        else
        {
            NSLog(@"cancel");
        }
        
    };
    
    // 初始化completionHandler,當(dāng)post結(jié)束之后(無論是done還是cancell)該blog都會被調(diào)用
    activityVC.completionWithItemsHandler = myBlock;
}else{
    //此Block回調(diào)方法在iOS8.0之后就棄用了,被上面的所取代
    UIActivityViewControllerCompletionHandler myBlock = ^(NSString *activityType,BOOL completed)
    {
        NSLog(@"activityType :%@", activityType);
        if (completed)
        {
            NSLog(@"completed");
        }
        else
        {
            NSLog(@"cancel");
        }
        
    };
    // 初始化completionHandler,當(dāng)post結(jié)束之后(無論是done還是cancell)該blog都會被調(diào)用
    activityVC.completionHandler = myBlock;
}

4. //在展現(xiàn)view controller時,必須根據(jù)當(dāng)前的設(shè)備類型,使用適當(dāng)?shù)姆椒āT趇Pad上,必須通過popover來展現(xiàn)view controller。在iPhone和iPodtouch上,必須以模態(tài)的方式展現(xiàn)。
[self presentViewController:activityVC animated:YES completion:nil];
  • 接下來介紹幾個系統(tǒng)Activity 類型的API,用于自定義title、Image的時候用。
    - (void)SystemAPI{
    //復(fù)制鏈接功能
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    pasteboard.string = @"需要復(fù)制的內(nèi)容";
    
    //用safari打開網(wǎng)址
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://github.com/wslcmk"]];
    
    //保存圖片到相冊
    UIImage *image = [UIImage imageNamed:@"wang"];
    id completionTarget = self;
    SEL completionSelector = @selector(didWriteToSavedPhotosAlbum);
    void *contextInfo = NULL;
    UIImageWriteToSavedPhotosAlbum(image, completionTarget, completionSelector, contextInfo);
    
    
    //添加書簽
    NSURL *URL = [NSURL URLWithString:@"https://github.com/wslcmk"];
    BOOL result = [[SSReadingList defaultReadingList] addReadingListItemWithURL:URL
                                                                          title:@"WSL"
                                                                    previewText:@"且行且珍惜_iOS"
                                                                          error:nil];
    if (result) {
        NSLog(@"添加書簽成功");
    }
    
    
    //發(fā)送短信
    MFMessageComposeViewController *messageComposeViewController = [[MFMessageComposeViewController alloc] init];
    messageComposeViewController.recipients = @[@"且行且珍惜_iOS"];
    //messageComposeViewController.delegate = self;
    messageComposeViewController.body = @"你好,我是且行且珍惜_iOS,請多指教!";
    messageComposeViewController.subject = @"且行且珍惜_iOS";
    
    //發(fā)送郵件
    MFMailComposeViewController *mailComposeViewController = [[MFMailComposeViewController alloc] init];
    [mailComposeViewController setToRecipients:@[@"mattt@nshipster?com"]];
    [mailComposeViewController setSubject:@"WSL"];
    [mailComposeViewController setMessageBody:@"Lorem ipsum dolor sit amet"
                                       isHTML:NO];
    if([MFMailComposeViewController  canSendMail]){
        [self presentViewController:mailComposeViewController animated:YES completion:nil];
    };
    
    //發(fā)送推文
    TWTweetComposeViewController *tweetComposeViewController =
    [[TWTweetComposeViewController alloc] init];
    [tweetComposeViewController setInitialText:@"夢想還是要有的,萬一實(shí)現(xiàn)了呢!-----且行且珍惜_iOS"];
    [tweetComposeViewController addURL:[NSURL URLWithString:@"https://github.com/wslcmk"]];
    [tweetComposeViewController addImage:[UIImage imageNamed:@"wang"]];
    if ([TWTweetComposeViewController canSendTweet]) {
        [self presentViewController:tweetComposeViewController animated:YES completion:nil];
    }
    }

  • 接下來介紹自定義UIActivity,主要就是重寫了以下方法:
    + (UIActivityCategory)activityCategory{
    // 決定在UIActivityViewController中顯示的位置,最上面是AirDrop,中間是Share,下面是Action
    return UIActivityCategoryAction;}

    - (NSString *)activityType{
    return _type;}

    - (NSString *)activityTitle {
    return _title;}

    - (UIImage *)_activityImage {
    //這個得注意,當(dāng)self.activityCategory = UIActivityCategoryAction時,系統(tǒng)默認(rèn)會渲染圖片,所以不能重寫為 - (UIImage *)activityImage {return _image;}
    return _image;}

    - (NSURL *)activityUrl{
    return _url;}

    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
    return YES;}

    - (void)prepareWithActivityItems:(NSArray *)activityItems {
    //準(zhǔn)備分享所進(jìn)行的方法,通常在這個方法里面,把item中的東西保存下來,items就是要傳輸?shù)臄?shù)據(jù)。;}

    - (void)performActivity {
    //這里就可以關(guān)聯(lián)外面的app進(jìn)行分享操作了
    //也可以進(jìn)行一些數(shù)據(jù)的保存等操作
    //操作的最后必須使用下面方法告訴系統(tǒng)分享結(jié)束了
    [self activityDidFinish:YES];}

需要Demo請戳我

親,贊一下,給個star.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容