作者感言
在前陣子我寫了另外一篇文章也是關於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罷了, 說那麼多道理, 還不如直接上程式碼~
建立新工程
首先我們需要先建立一個新的工程, 由於
Share Extension
不是一個獨立的應用, 它是需要依賴於主程式, 建立新工程的順序我就省略了, 這裡的新工程叫做ShareExtensionDemo
.
建立Share Extension
建立完新工程之後, 我們現在來建立
Share Extension
和Today Extension
一樣, 系統是有自帶的模板給我們自己選擇
配置主應用
現在新工程和
Share Extension
已經建立完成, 現在我們可以在主應用當中調起Share Extension
來看看效果, 這裡我為了方便, 所以使用的是StoryBoard
.拖一個
UIButton
到StoryBoard
, 改名為Share
, 然後關聯Action
事件到ViewController
, 新增對應的程式碼.
- (IBAction)ShareAction:(UIButton *)sender {
NSString *string = @"您好";
UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[string]
applicationActivities:nil];
[self presentViewController:activityController
animated:YES
completion:nil];
}複製程式碼
現在讓我們來看看對應的效果吧~~
現在我們看到了
Share Extension
展示出來的效果, 但醬紫還是不夠的, 繼續繼續~
配置Share Extension
在配置
Share Extension
之前, 我們需要看看裡面的幾個方法, 不然我們完全都是蒙圈的
// 如果是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 | 預設不支援文字分享,例如[備忘錄] |
其實這個表格在官網文件都是可以找到的~~
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功能, 並且填寫對應的引數, 不然沒法傳送資料.
同樣的,
Share Extension
也需要同樣的操作, 這裡就不做重複的操作了, 現在我們繼續來填寫對應的網路操作邏輯
首先, 我們需要封裝一個返回
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
裡去.
醬紫我們就搞定了
Share Extension
, 灰常的簡單
自定義UI
這裡補充一點, 其實
Share Extension
說白了就是一個UIViewController
, 所以你可以根據你的喜好來進行UI定製, 詳細資料大家可以去蘋果官網或者
補充篇文章
這裡再補充篇文章, 關於Share Extension的, 是用Swift寫的, 裡面有一些問題, 會導致
NSURLRequest
返回為nil
, 大家單步除錯一下就知道為什麼了
iOS8 Day-by-Day– Day2 — 分享應用擴充套件
GitHub地址
Share Extension工程地址: github.com/CainRun/Sha…