1. 程式人生 > >玩轉iOS開發:《使用系統自帶的UIActivityViewController和UIActivity進行內容分享》

玩轉iOS開發:《使用系統自帶的UIActivityViewController和UIActivity進行內容分享》

目錄

簡介

這段時間有很多朋友都問我關於怎麼去整合ShareSDK或者友盟社會化分享SDK的問題, 其實我想說, Apple一開始就提供了一個類, 供我們去使用分享了, 在iOS 6之後更加增強了這個類, 使我們不再需要整合第三方的, 而且還支援自定義分享的item.

作者感言

在我寫這篇文章的時候, 雖然國內有一堆文章介紹UIActivityViewControllerUIActivity, 但都是零零散散的, 哪怕我FQ出去看YouTube, 或者是著名的黑鬍子部落格, 都沒有詳細的講解怎麼去自定義所需的UIActivity, 最後基本上翻遍了谷歌, 才找到了所需的.

最後:


如果你有更好的建議或者對這篇文章有不滿的地方, 請聯絡我, 我會參考你們的意見再進行修改, 聯絡我時, 請備註UIActivityViewController 如果覺得好的話, 希望大家也可以打賞一下~嘻嘻~祝大家學習愉快~謝謝~

Cain(羅家輝)
聯絡方式: [email protected]
騰訊QQ: 350116542

建立新工程

1

2

建立一個繼承與UIActivityViewController的類

3

4

建立一個繼承與UIActivity的類

5

這時候我們就要來給這個自定義的UIActivity類寫上我們需要的內容, 首先我們可以去到系統提供的UIActivity

標頭檔案看API, 獲取我們所需的API.

6

配置UIActivity和UIActivityViewController

下面是我寫好的自定義WeiboActivity API

7

#import "WeiboActivity.h"

@implementation WeiboActivity

- (NSString *)activityType {
    
    return @"CustomWeiboActivity";
}

- (NSString *)activityTitle {
    
    return @"新浪微博";
}

- (UIImage *)activityImage {
    
    return [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];
}

- (void)performActivity {
    [self activityDidFinish:YES];
}

@end

下面是我寫好的自定義UIActivityController

8

#import "UIActivityController.h"
#import "WeiboActivity.h"

#define CAL_GET_OBJECT(objc) if (objc) return objc

@interface UIActivityController ()

@property (nonatomic, strong) WeiboActivity *weiboActivity;

@end

@implementation UIActivityController

- (instancetype)initAspActivityControllerWithContent:(NSArray *)activityContent {
    
    NSArray *activitys = @[self.weiboActivity];
    
    if (self = [super initWithActivityItems:activityContent applicationActivities:activitys]) {
        
        self.excludedActivityTypes = @[UIActivityTypePostToFacebook,
                                       UIActivityTypePostToTwitter,
                                       UIActivityTypePostToWeibo,
                                       UIActivityTypeMail,
                                       UIActivityTypePrint,
                                       UIActivityTypeCopyToPasteboard,
                                       UIActivityTypeAssignToContact,
                                       UIActivityTypeSaveToCameraRoll,
                                       UIActivityTypeAddToReadingList,
                                       UIActivityTypePostToFlickr,
                                       UIActivityTypePostToVimeo,
                                       UIActivityTypePostToTencentWeibo,
                                       UIActivityTypeAirDrop,
                                       UIActivityTypeOpenInIBooks];
    }
    
    return self;
}

- (WeiboActivity *)weiboActivity {
    
    CAL_GET_OBJECT(_weiboActivity);
    
    _weiboActivity = [[WeiboActivity alloc] init];
    
    return _weiboActivity;
}

@end

這裡和大家說說excludedActivityTypes這個屬性, 這個屬性其實是一個數組屬性, 代表的是, 如果我們不需要系統的服務就可以給它賦值, 這樣子UIActivityViewController就不會顯示對應的服務, 我這裡預設全部幹掉, 一個服務都不需要, 當然如果需要幹掉我們自定義的UIActivity, 也可以在這裡寫上.

還有一點, 就是我們給UIActivityViewController賦值自定義的UIActivity

PS: 注意一點, 這個賦值只能在initWithActivityItems: applicationActivities:這個方法的applicationActivities:賦值, 而且只能在初始化的時候賦值, 一旦賦值之後就不能再修改了.

9

調起UIActivityViewController

最重要的地方來了, 就是調起我們自定義的UIActivityController.

首先我們要在Main.storyboard中拖一個UIButton, 然後新增對應的程式碼.

10

#import "ViewController.h"
#import "UIActivityController.h"

@interface ViewController ()

@property (nonatomic, strong) UIActivityController *activityController;

@end

@implementation ViewController

- (IBAction)popActivityController:(UIButton *)sender {
    
    [self presentViewController:self.activityController animated:YES completion:nil];
}

- (UIActivityController *)activityController {
    
    NSString *shareTitle = @"分享的標題";
    UIImage *shareImage = [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];
    
    if (!_activityController) {
        
        _activityController = [[UIActivityController alloc] initAspActivityControllerWithContent:@[shareTitle, shareImage]];
    }
    
    return _activityController;
}

@end

最後我們執行一下看看效果

11

發現什麼都沒有, 肯定在噴我, 覺得我是在耍你們, 哈哈, 其實在這裡我們少了一個方法沒有新增, 回到我們自定義的WeiboActivity中, 新增上就OK了

12

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
    
    if (activityItems.count > 0) {
        
        return YES;
    }
    
    return NO;
}

再來執行看看效果

13

好了, item出來了, 但好像有什麼不對, 圖示呢???!!! 為啥是灰色的? 樓主你耍我, 我要去爆你菊花!!!!!

別緊張, 在系統預設的UIActivityViewController中, 下面這部分是屬於系統服務, 預設只會顯示一個輪廓, 並不會顯示整張圖片, 下面我們把自定義的WeiboActivity顯示圖片的方法改改就好了.

14

- (UIImage *)_activityImage {
    
    return [UIImage imageNamed:@"ShareBundle.bundle/share_icon_1"];
}

15

好了, 我的菊花保住了, 圖標出來了, 把我嚇了一身冷汗

圖標出來了, 我們就要給這個item新增點選事件了, 做什麼好呢, 總不可能讓我去導個微信微博等SDK進來演示, 畢竟還要去申請AppIDAppKey呢, 我們來個彈框吧~~~

我一般喜歡寫個Block把點選事件丟擲去做處理, 這次我也不例外~~

16

- (void)performActivity {
    [self activityDidFinish:YES];
    
    if (self.weiboBlock) {
        self.weiboBlock();
    }
}

17

- (WeiboActivity *)weiboActivity {
    
    CAL_GET_OBJECT(_weiboActivity);
    
    _weiboActivity = [[WeiboActivity alloc] init];
    
    [_weiboActivity setWeiboBlock:^{
        
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"新浪微博"
                                                            message:@"分享至新浪微博"
                                                           delegate:nil
                                                  cancelButtonTitle:@"好的"
                                                  otherButtonTitles:nil, nil];
        
        [alertView show];
    }];

    return _weiboActivity;
}

PS: 由於我這裡是做示範, 所以使用UIAlertView, 如果大家要在專案中使用的話, 儘量使用UIAlertController.

最終效果

18

GitHub工程地址

工程地址: https://github.com/CainRun/ActivityControllerDemo

結束語

好啦, 教程到這裡就結束了, 謝謝大家的耐心觀看