ios 跨軟件傳輸數(shù)據(jù)之Share Extension的配置與外部數(shù)據(jù)獲仁ッ场(二)

配置Share Extension

設置允許發(fā)送的數(shù)據(jù)類型:text、url扛稽、image吁峻、mp3、mp4在张、pdf用含、word、excel帮匾、ppt


設置支持的數(shù)據(jù)類型

處理Share Extension中的數(shù)據(jù)啄骇。

Share Extension中默認都會有一個數(shù)據(jù)展現(xiàn)的UI界面。該界面繼承SLComposeServiceViewController這個類型辟狈,如:(這是系統(tǒng)幫我們生成的)

#import <UIKit/UIKit.h>
#import <Social/Social.h>

@interface ShareViewController : SLComposeServiceViewController

@end

當然我們也可以自定義新的控制器肠缔,并在Share Extension的plist里做下對應的匹配


設置自定義控制器

處理Share Extension中的數(shù)據(jù)

分享界面頂部包括了標題夏跷、取消(Cancel)按鈕和提交(Post)按鈕。然后下面跟著左邊就是一個文本編輯框明未,右邊就是一個圖片顯示控件槽华。那么,每當用戶點擊取消按鈕或者提交按鈕時趟妥,都會分別觸發(fā)下面的方法:

/**
 *  點擊取消按鈕
 */
- (void)didSelectCancel
{
    [super didSelectCancel];
}

/**
 *  點擊提交按鈕
 */
- (void)didSelectPost
{
    [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}

在這兩個方法里面可以進行一些自定義的操作猫态。一般情況下,當用戶點擊提交按鈕的時候披摄,擴展要做的事情就是要把數(shù)據(jù)取出來亲雪,并且放入一個與Containing App(** 容器程序,盡管蘋果開放了Extension疚膊,但是在iOS中extension并不能單獨存在义辕,要想提交到AppStore,必須將Extension包含在一個App中提交寓盗,并且App的實現(xiàn)部分不能為空,這個包含Extension的App就叫Containing app灌砖。Extension會隨著Containing App的安裝而安裝,同時隨著ContainingApp的卸載而卸載傀蚌。)共享的數(shù)據(jù)介質中(包括NSUserDefault基显、Sqlite偎血、CoreData)衍菱,要跟容器程序進行數(shù)據(jù)交互需要借助AppGroups服務,下面先來看看怎么獲取擴展中的數(shù)據(jù)退唠。

在ShareExtension中箩艺,UIViewController包含一個ExtensionContext這樣的上下文對象窜醉,NSExtensionContext的結構比較簡單,包含一個屬性和三個方法艺谆。其說明如下:


NSExtensionContext結構

類的下面還定義了一些通知酱虎,這些通知都是跟宿主程序的行為相關,在設計擴展的時候可以根據(jù)這些通知來進行對應的操作擂涛。其說明如下:


NSExtensionContext通知

從inputItems中獲取數(shù)據(jù)

inputItems是包含NSExtensionItem類型對象的數(shù)組读串。
NSExtensionItem包含四個屬性:


NSExtensionItem的屬性

對應userInfo結構中的NSExtensionItem屬性的鍵名如下:


userInfo的屬性

為了要取到宿主程序提供的數(shù)組,那么只要關注loadItemTypeIdentifier:options:completionHandler方法的使用即可撒妈。有了上面的了解恢暖,那么接下來就是對inputItems進行數(shù)據(jù)分析并提取了,這里以一個鏈接的分享為例狰右,改寫視圖控制器中的didSelectPost方法杰捂。看下面的代碼:

- (void)didSelectPost
{
    __block BOOL hasExistsUrl = NO;
    [self.extensionContext.inputItems enumerateObjectsUsingBlock:^(NSExtensionItem * _Nonnull extItem, NSUInteger idx, BOOL * _Nonnull stop) {

        [item.attachments enumerateObjectsUsingBlock:^(NSItemProvider * _Nonnull itemProvider, NSUInteger idx, BOOL * _Nonnull stop) {

            if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"])
            {
                [itemProvider loadItemForTypeIdentifier:@"public.url"
                                                options:nil
                                      completionHandler:^(id<NSSecureCoding>  _Nullable item, NSError * _Null_unspecified error) {

                                          if ([(NSObject *)item isKindOfClass:[NSURL class]])
                                          {
                                              NSLog(@"分享的URL = %@", item);
                                          }

                                      }];

                hasExistsUrl = YES;
                *stop = YES;
            }

        }];

        if (hasExistsUrl)
        {
            *stop = YES;
        }

    }];

    // 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];
}

上面的例子中遍歷了extensionContext的inputItems數(shù)組中所有NSExtensionItem對象棋蚌,然后從這些對象中遍歷attachments數(shù)組中的所有NSItemProvider對象嫁佳。匹配第一個包含public.url標識的附件(具體要匹配什么資源挨队,數(shù)量是多少皆有自己的業(yè)務所決定)。

  • 注意:在上面代碼中注釋了[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];這行代碼蒿往,主要是使到視圖控制器不被關閉盛垦,等到實現(xiàn)相應的處理后再進行調用該方法,對分享視圖進行關閉瓤漏。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔬充,隨后出現(xiàn)的幾起案子蝶俱,更是在濱河造成了極大的恐慌,老刑警劉巖饥漫,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榨呆,死亡現(xiàn)場離奇詭異,居然都是意外死亡庸队,警方通過查閱死者的電腦和手機愕提,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皿哨,“玉大人,你說我怎么就攤上這事纽谒≈づ颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵鼓黔,是天一觀的道長央勒。 經常有香客問我,道長澳化,這世上最難降的妖魔是什么崔步? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮缎谷,結果婚禮上井濒,老公的妹妹穿的比我還像新娘。我一直安慰自己列林,他們只是感情好瑞你,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著希痴,像睡著了一般者甲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砌创,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天虏缸,我揣著相機與錄音鲫懒,去河邊找鬼。 笑死刽辙,一個胖子當著我的面吹牛窥岩,可吹牛的內容都是我干的。 我是一名探鬼主播扫倡,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谦秧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撵溃?” 一聲冷哼從身側響起疚鲤,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缘挑,沒想到半個月后集歇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡语淘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年诲宇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惶翻。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡姑蓝,死狀恐怖,靈堂內的尸體忽然破棺而出吕粗,到底是詐尸還是另有隱情纺荧,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布颅筋,位于F島的核電站宙暇,受9級特大地震影響,放射性物質發(fā)生泄漏议泵。R本人自食惡果不足惜占贫,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望先口。 院中可真熱鬧型奥,春花似錦、人聲如沸碉京。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽收夸。三九已至坑匠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卧惜,已是汗流浹背厘灼。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工夹纫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人设凹。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓舰讹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闪朱。 傳聞我的和親對象是個殘疾皇子月匣,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容