玩轉iOS開發:iOS 8 新特性《Share Extension》

CainLuo發表於2019-02-11

作者感言

在前陣子我寫了另外一篇文章也是關於iOS 8新特性的, 叫做玩轉iOS開發:iOS 8 新特性《Today Extension》, 這裡面講解就是iOS 8其中一個特性, 由於工作比較忙, 所以一直在拖著, 沒有繼續往下研究, 現在終於有時間抽出來可以研究一下

最後: 如果你有更好的建議或者對這篇文章有不滿的地方, 請聯絡我, 我會參考你們的意見再進行修改, 聯絡我時, 請備註Share Extension, 祝大家學習愉快~謝謝~

Cain(羅家輝)

zhebushimengfei@qq.com: 聯絡方式

350116542: 騰訊QQ


簡介

什麼是Share Extension? 在iOS 8的時候, 蘋果開放了幾個新特性, 其中一個就是Share Extension, 大家可以開啟蘋果自己自帶的瀏覽器Safari, 隨便選中一個網站, 點選分享, 就會出現一個分享介面, 中間的那條iCon欄目就是系統自帶的Share Extension(如圖所示), 說白了就是把Safari的網站地址分享出去罷了, 所以說Share Extension其實就是系統自帶的社會化SDK罷了, 說那麼多道理, 還不如直接上程式碼~

1


建立新工程

首先我們需要先建立一個新的工程, 由於Share Extension不是一個獨立的應用, 它是需要依賴於主程式, 建立新工程的順序我就省略了, 這裡的新工程叫做ShareExtensionDemo.

2


建立Share Extension

建立完新工程之後, 我們現在來建立Share ExtensionToday Extension一樣, 系統是有自帶的模板給我們自己選擇

3

4

5

6


配置主應用

現在新工程和Share Extension已經建立完成, 現在我們可以在主應用當中調起Share Extension來看看效果, 這裡我為了方便, 所以使用的是StoryBoard.

拖一個UIButtonStoryBoard, 改名為Share, 然後關聯Action事件到ViewController, 新增對應的程式碼.

7

8

9

10

- (IBAction)ShareAction:(UIButton *)sender {

    NSString *string = @"您好";

    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[string]
                                                                                     applicationActivities:nil];

    [self presentViewController:activityController
                       animated:YES
                     completion:nil];
}複製程式碼

現在讓我們來看看對應的效果吧~~

11

12

13

現在我們看到了Share Extension展示出來的效果, 但醬紫還是不夠的, 繼續繼續~


配置Share Extension

在配置Share Extension之前, 我們需要看看裡面的幾個方法, 不然我們完全都是蒙圈的

14

// 如果是return No, 那麼傳送按鈕就無法點選, 如果return YES, 那麼傳送按鈕就可以點選
- (BOOL)isContentValid {
    // Do validation of contentText and/or NSExtensionContext attachments here
    return YES;
}複製程式碼
// 傳送按鈕的Action事件
- (void)didSelectPost {
    // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.

    // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
    [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}複製程式碼
// 這個方法是用來返回items的一個方法, 而且返回值是陣列
- (NSArray *)configurationItems {
    // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
    return @[];
}複製程式碼

配置NSExtension

我們知道了上面那幾個方法之後, 現在來配置一下我們可傳送的內容規則, 這些規則分別是

iOS擴充套件外掛支援媒體型別配置鍵 描述 說明
NSExtensionActivationSupportsAttachmentsWithMaxCount 附件最多限制: 20 附件包括下面的File、Image和Movie三大類,單一、混選總量不超過20
NSExtensionActivationSupportsAttachmentsWithMinCount 附件最多限制: 上面非零時default=1 預設至少選擇1個附件,[Share Extension]中才顯示擴充套件外掛圖示
NSExtensionActivationSupportsWebURLWithMaxCount Web連結最多限制: default=0 預設不支援分享超連結,例如[Safari]
NSExtensionActivationSupportsFileWithMaxCount 檔案最多限制: 20 單一、多選均不超過20
NSExtensionActivationSupportsWebPageWithMaxCount Web頁面最多限制: default=0 預設不支援Web頁面分享,例如[Safari]
NSExtensionActivationSupportsImageWithMaxCount 圖片最多限制: 20 單一、多選均不超過20
NSExtensionActivationSupportsVideoWithMaxCount 視訊最多限制: 20 單一、多選均不超過20
NSExtensionActivationSupportsText 文字型別: default=0 預設不支援文字分享,例如[備忘錄]

其實這個表格在官網文件都是可以找到的~~

15


Share Extension邏輯

填寫限制字數長度的邏輯

首先我們來填寫一個東東, 就是限制Share Extension的可輸入字數長度, 然後新增一個分享路徑

這裡特別需要強調一點哈, 因為requestb.in/1hx20w61這個連結是需要自己去手動申請的, 而且是居然時效性的, 如果失效了, 那就自己去requestb.in再申請一個就好了.

// 限制字數, 最多隻能輸入40個
static NSInteger const maxCharactersAllowed = 40;
// 這是一個測試連線, 並不是固定的, 你可以去http://requestb.in申請, 然後替換到你最新申請的連線即可
static NSString *uploadURL = @"http://requestb.in/1hx20w61";複製程式碼

宣告完了字數長度, 我們需要去- (BOOL)isContentValid方法中實現

- (BOOL)isContentValid {

    NSInteger length = self.contentText.length;

    self.charactersRemaining = @(maxCharactersAllowed - length);

    return self.charactersRemaining.integerValue < 0 ? NO : YES;
}複製程式碼

填寫上傳資訊的邏輯

在這裡我用原生的網路請求進行請求傳送, 大家也可以去使用AFNetWorking, Swift的話可以去使用另外一個網路請求框架Alamofire, 作者都是同一個大神

在寫邏輯之前, 我們需要開啟App的一個Group功能, 並且填寫對應的引數, 不然沒法傳送資料.

16

17

同樣的, Share Extension也需要同樣的操作, 這裡就不做重複的操作了, 現在我們繼續來填寫對應的網路操作邏輯

18

首先, 我們需要封裝一個返回NSURLRequest的方法

/**
 *  返回一個NSURLRequest方法, 需要傳入一個NSString物件
 *
 *  @param string 需要傳送出去的字串
 *
 *  @return NSURLRequest
 */
- (NSURLRequest *)urlRequestWithString:(NSString *)string {

    NSURL *url = [NSURL URLWithString:uploadURL];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];

    request.HTTPMethod = @"POST";

    NSMutableDictionary *jsonObject = [NSMutableDictionary dictionary];

    jsonObject[@"text"] = string;

    NSError *jsonError;
    NSData *jsonData;

    jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:&jsonError];

    if (jsonData) {

        request.HTTPBody = jsonData;
    } else {

        NSLog(@"JSON Error: %@", jsonError.localizedDescription);
    }

    return request;
}複製程式碼

然後在- (void)didSelectPost點選事件中去呼叫

- (void)didSelectPost {

    NSString *configName = @"com.shareExtension.ShareExtensionDemo.BackgroundSessionConfig";

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configName];

    sessionConfig.sharedContainerIdentifier = @"group.ShareExtension";

    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig];

    NSURLRequest *urlRequest = [self urlRequestWithString:self.contentText];

    NSURLSessionTask *task = [session dataTaskWithRequest:urlRequest];

    [task resume];

    [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}複製程式碼

這樣子就完事了, 由於我這裡不知道為啥用模擬器一直沒法進行網路請求, 只能用真機測試了, 不知道是不是我配置的問題, 如果有知道的大神麻煩請告知一聲, 謝謝啦~~現在我們再來重複一下剛開始的操作, 傳送請求到指定的URL裡去.

19

20

醬紫我們就搞定了Share Extension, 灰常的簡單


自定義UI

這裡補充一點, 其實Share Extension說白了就是一個UIViewController, 所以你可以根據你的喜好來進行UI定製, 詳細資料大家可以去蘋果官網或者Google搜搜, 百度的話, 你們懂得


補充篇文章

這裡再補充篇文章, 關於Share Extension的, 是用Swift寫的, 裡面有一些問題, 會導致NSURLRequest返回為nil, 大家單步除錯一下就知道為什麼了

iOS8 Day-by-Day– Day2 — 分享應用擴充套件


GitHub地址

Share Extension工程地址: github.com/CainRun/Sha…

相關文章