iOS 8出色的跨應用通信效果:解讀Action擴展
譯文應用程序擴展最初于WWDC 2014大會上正式亮相,這是一種將iOS應用程序功能擴展至系統其它組成部分的途徑、而且能夠實現更為出色的跨應用通信效果。
舉例為說,大家可以利用Today擴展創建出能夠顯示在通知中心之內的功能部件、Sharing擴展則幫助用戶將信息共享至社交網絡當中,而Action擴展的作用在于允許用戶執行當前內容——包括將其以不同方式顯示或者對內容作出更改。在今天的上手指南當中,我們將了解如何從零開始創建一項Action擴展。
雖然這篇文章并不會對大家的知識儲備提出太多硬性要求,但我還是建議讀者朋友能夠首先閱讀一些相關資料,從而在本文指導之后得以更輕松地掌握更多擴展創建知識。
WWDC大會演講:為iOS及OS X創建擴展——第一部分與第二部分
應用程序擴展編程指南
1. 我們要創建什么?
我們將要創建一項名為“Read it”的簡單Action擴展。這項擴展將把文本內容作為輸入信息,并利用AVFoundation框架中的語音合成API將其朗讀出來。我認為整個流程非常適合作為本教程的核心內容,因為在處理當中我們無需引入任何第三方依賴性、也不會產生其它難以處理的問題。
以下為我們在創建結束之后所得到的擴展功能效果。大家可以點擊此處從GitHub上下載到本教程中的創建結果。
2. 創建一項Action擴展
第一步:項目設置
首先要做的是啟動Xcode 6.1或者更高版本,而后創建一個新項目。在Xcode的File菜單當中選擇New > Project…,然后從模板列表當中選擇Single View Application。
點擊Next并為我們的項目設定一個SampleActionExtensionApp名稱。輸入一個Organization Identifier并將Devices類型設置為iPhone。在本教程當中,我們將使用的編程語言為Objective-C。
第二步:添加目標
在完成了以上項目創建工作之后,大家接下來可以為Action擴展添加一個目標了。從File菜單下選擇New > Target…。在左側面板當中,從iOS選項處選擇Application Extension,并在選定Action Extension后點擊Next。
現在將Product Name設置為ReadItAction。此外還需要注意其它一些選項,特別是Action Type。我們稍后再就這一話題進行深入探討?,F在點擊Finish以創建Action擴展。
現在系統會詢問大家是否打算激活這套ReadItAction項目。暫時點擊Cancel,因為我們之后會通過運行內容應用來安裝這一Action擴展、而非直接加以激活。
Action類型
Action擴展共分為兩種類型,其一配備用戶界面、另一種則不配備用戶界面。大家可能會覺得奇怪——不配備用戶界面的Action擴展到底有什么實實在在的好處?下面就讓我為大家作出解釋。
不具備用戶界面的Action擴展以內容變更為目標作用于當前項目。舉例來說,一項Action擴展能夠去除相片當中的紅眼現象,而且其完全無需用戶界面作為配合。內容性應用隨后可以對這部分經過變更的內容加以運用,在以上實例中即為完成了修正的相片素材。
配備用戶界面的Action擴展則可以表現為全屏形式或者格式表形式。Action擴展目標模板采用的是全屏幕形式,因此我們也將在接下來的創建過程中將其作為設計思路。
第三步:用戶界面的實現
現在我們已經完成了基礎性設置流程,也就是做好了創建用戶界面的各項準備工作。下面我們將從應用程序內容開始入手。
首先點擊Project Navigator當中SampleActionExtensionApp組之下的Main.storyboard。在右側面板當中,選擇File Inspector并取消對Use size classes的勾選。請注意,如果大家打算創建的是一款真正的應用程序且不需要對iPad提供支持,那么使用size classes(即尺寸類)可能會是最好的選擇。
下面打開Object Library,并將文本視圖與工具欄拖拽至該視圖當中。在右側的Size Inspectoron中將文本視圖的框體設定為{x:8, y:20, width:304, height:288}。而對于工具欄,我們同樣在Size Inspector中對其進行設置,具體參數為{x:0, y:308, width:320, height:44}。
工具欄當中應當包含一個欄按鈕。將其選定,而后在Attributes Inspector當中將其Style設置為Plain,并將其Identifier設置為Action。
作為收尾工作,我們需要將文本視圖當中的默認文本內容移除并替換為“Tap the action button to invoke activity view controller. Then select 'Read it' action and this text will be read by our sample Action extension.(點擊action按鈕以調用活動視圖控制器。而后選擇‘Read it’操作,這段文本將由我們的示例Action擴展朗讀出來。)”
視圖控制器的用戶界面顯示效果現在應當如下圖所示:
當然,我們也可以將內容應用程序保留為空白。畢竟我們的目標在于構建一套示例性應用程序擴展,因此該應用本身并不需要真正的執行功能。不過我個人希望向大家展示從應用程序內部實現活動控制器調用有多么輕松,相信各位也能夠借此了解如何將更多其它Action擴展納入自己的應用當中。
在點擊工具欄當中的按鈕時,一套活動視圖控制器將會顯示出來,而我們則能夠從這里對自己的Action擴展進行調用。選擇這種方式的另一個理由在于,如果大家打算將自己的擴展發布到App Store當中,那么其必須要作為一款真正應用程序的組成部分、而應用當然得擁有功能才可以順利通過蘋果官方的審批。
第四步:當前活動視圖控制器
接下來,我們需要將一部分代碼添加到ViewController.m當中。首先在視圖控制器的類擴展當中為文本視圖創建一套外觀,具體代碼如下所示。
- @interface ViewController ()
- @property (nonatomic, weak) IBOutlet UITextView *textView;
- @end
創建一項名為actionButtonPressed的action,在這里我們將對UIActivityViewController實例進行初始化與顯示、并將其提供給用戶。
- - (IBAction)actionButtonPressed:(id)sender {
- UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[self.textView.text]
- applicationActivities:nil];
- [self presentViewController:activityVC animated:YES completion:nil];
- }
讓我們再說回Main.storyboard,通過點擊Control并將文本視圖外觀方案從View Controller Scene下的View Controller對象中將其拖拽至文本視圖內、然后在彈出的菜單中選擇textView,這就實現了文本視圖外觀與文本視圖的對接。
為了與action方法實現對接,我們需要在工具當中選擇該欄按鈕并打開Connections Inspector。將其從Sent actions下的selector當中拖拽至View Controller對象,而后在彈出的菜單內選擇actionButtonPressed:。
到這里應用程序的用戶界面已經設計完成并且正式交付使用,下面我們可以繼續進行Action擴展創建工作了。
第五步:用戶界面的實現
在Project Navigator當中,展開ReadItAction組并點擊MainInterface.storyboard。大家應該會注意到,該故事板并非空白、其中已經包含有一部分用戶界面組件。我們可以對其中一部分加以利用,但具體的圖象視圖卻幫不上什么忙。因此選定該圖象視圖并通過按下Delete鍵將其移除。
接下來打開Object Library并在下方的導航欄中添加一套文本視圖。將其框體變更為{x: 8, y: 72, width: 304, height: 300}。最后,雙擊該導航欄的標題視圖并將標題內容設定為“Text reader”。
第六步:ActionViewControlle的實現
到了這一步,我們需要搞定Action擴展的實現工作。在Project Navigator當中選擇ActionViewController.m,并對其實施以下幾項變更。
下面的導入語句會將一條導入語句添加到AVFoundation框架當中,這樣我們就能將其語音合成API運用在自己的Action擴展當中了。
1 @import AVFoundation;
在ActionViewController類的類擴展當中,移除其中的imageView外觀并添加到我們之前曾經添加至文本視圖當中的新外觀。
- @interface ActionViewController ()
- @property (nonatomic, strong) IBOutlet UITextView *textView;
- @end
除此之外,我們還需要對ActionViewController類中的viewDidLoad方法作出以下幾項變更。
- 30 - (void)viewDidLoad {
- [super viewDidLoad];
- //從擴展背景信息中獲取我們打算處理的項目。
- // 在我們的Action extension當中, 我們只需要一個輸入項目(即文本),因此我們使用數組中的第一個項目。
- NSExtensionItem *item = self.extensionContext.inputItems[0];
- NSItemProvider *itemProvider = item.attachments[0];
- if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePlainText]) {
- // 這是一段純文本!
- __weak UITextView *textView = self.textView;
- [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePlainText options:nil completionHandler:^(NSString *item, NSError *error) {
- if (item) {
- [[NSOperationQueue mainQueue] addOperationWithBlock:^{
- [textView setText:item];
- //設置語音合成并加以啟動
- AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init];
- AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:textView.text];
- [utterance setRate:0.1];
- [synthesizer speakUtterance:utterance];
- }];
- }
- }];
- }
- }
整個實現過程還是非常容易理解的。在viewDidLoad當中,我們得到了輸入文本內容、將其分配給文本視圖、而后再創建一個能夠將其朗讀出來的語音合成對象。
第七步:配置Action擴展
雖然我們已經接近整個項目創建流程的尾聲,但仍有一些需要著重關注的細節問題。首先,我們需要將故事板中的文本視圖與我們此前已經創建完成的外觀方案相對接。
打開MainInterface.storyboard并將文本視圖與Image場景相對接,正如我們之前在Main.storyboard當中完成的操作一樣。
接下來我們還需要為Action擴展指定所能支持的數據類型。在這一次的實例當中,我們只需要支持純文本數據即可。展開Supporting Files組并選擇Info.plist。在Info.plist當中,遵循NSExtension > NSExtensionAttributes > NSExtensionActivationRule導航流程,最后將NSExtensionActivationRule的類型由String變更為Dictionary。
在已經展開的dictionary當中,點擊旁邊的+號按鈕,從而添加一個新的子級鍵。將其名稱設置為NSExtensionActivationSupportsText,類型設定成Boolean,而值則取為YES。這樣一來,我們就能確保自己的Action擴展只在輸入項目包含文本內容時才會顯示出來。
仍然是在Info.plist當中,我們要將Bundle Display Name變更為Read It。這樣看起來會更加清晰。下圖所示為Info.plist文件當中相關部分的設置結果:
第八步
作為畫龍點睛之筆,大家可以為Action擴展添加一個圖標。在Project Navigator當中,選擇該項目并在目標之下選定ReadItAction目標。在App Icons and Launch Images部分中的General標簽下點擊App Icons Source旁邊的Use Asset Catalog。根據提示,我們接下來需要點擊Migrate。而后慎用至資產目錄并將以下圖標拖拽至iPhone App iOS 7,8 60pt 2x位置。
完成應用程序的構建與運行步驟,看看一切是否像我們預期的那樣運轉正常。不過還有一個需要關注的問題:如果聲音圖標沒有被正常顯示在Action擴展之內,大家需要確保主Images.xcassets文件已經被正確復制到了擴展目標當中。
要完成這項操作,我們需要在Project Navigator當中選定該項目并從Targets列表當中選擇ReadItAction目標。打開屏幕頂端的Build Phases標簽并展開Copy Bundle Resources步驟。如果Images.xcassets文件并未出現在資源列表當中,那么點擊其中的小加號將其手動添加到列表之內。
3. 運行及測試
最后要做的就是運行應用程序并嘗試其各功能的起效情況。以下顯示的兩幅截圖為運行當中的擴展外觀。大家也可以嘗試通過記事本應用調用該活動視圖控制器,并讓我們的擴展讀取之前曾經記錄過的文本內容。除此之外,我們不妨在相片應用當中打開活動列表,這時大家會發現自己的擴展并沒有被列中其中。沒錯,這正好符合我們之前為其設置的激活規則。
總結
在今天的教程當中,大家了解了如何構建一套簡單的Action擴展。我們還涉及到了一些基礎性知識,即如何運用AVFoundation框架當中的語音合成API。如果大家有舉創建出更多擴展方案,也可以點擊此處查看由Cesar Tessarin帶來的Today擴展創建指南。
如果大家對本文內容還抱有任何疑問或者建議,請在下方的評論欄中與我們分享。
英文原文:http://code.tutsplus.com/tutorials/ios-8-how-to-build-a-simple-action-extension--cms-2279