自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS 8出色的跨應(yīng)用通信效果:解讀Action擴(kuò)展

譯文
移動(dòng)開發(fā) iOS
用程序擴(kuò)展最初于WWDC 2014大會(huì)上正式亮相,這是一種將iOS應(yīng)用程序功能擴(kuò)展至系統(tǒng)其它組成部分的途徑、而且能夠?qū)崿F(xiàn)更為出色的跨應(yīng)用通信效果。

應(yīng)用程序擴(kuò)展最初于WWDC 2014大會(huì)上正式亮相,這是一種將iOS應(yīng)用程序功能擴(kuò)展至系統(tǒng)其它組成部分的途徑、而且能夠?qū)崿F(xiàn)更為出色的跨應(yīng)用通信效果。

舉例為說,大家可以利用Today擴(kuò)展創(chuàng)建出能夠顯示在通知中心之內(nèi)的功能部件、Sharing擴(kuò)展則幫助用戶將信息共享至社交網(wǎng)絡(luò)當(dāng)中,而Action擴(kuò)展的作用在于允許用戶執(zhí)行當(dāng)前內(nèi)容——包括將其以不同方式顯示或者對(duì)內(nèi)容作出更改。在今天的上手指南當(dāng)中,我們將了解如何從零開始創(chuàng)建一項(xiàng)Action擴(kuò)展。

雖然這篇文章并不會(huì)對(duì)大家的知識(shí)儲(chǔ)備提出太多硬性要求,但我還是建議讀者朋友能夠首先閱讀一些相關(guān)資料,從而在本文指導(dǎo)之后得以更輕松地掌握更多擴(kuò)展創(chuàng)建知識(shí)。

WWDC大會(huì)演講:為iOS及OS X創(chuàng)建擴(kuò)展——第一部分與第二部分

應(yīng)用程序擴(kuò)展編程指南

1. 我們要?jiǎng)?chuàng)建什么?

我們將要?jiǎng)?chuàng)建一項(xiàng)名為“Read it”的簡(jiǎn)單Action擴(kuò)展。這項(xiàng)擴(kuò)展將把文本內(nèi)容作為輸入信息,并利用AVFoundation框架中的語音合成API將其朗讀出來。我認(rèn)為整個(gè)流程非常適合作為本教程的核心內(nèi)容,因?yàn)樵谔幚懋?dāng)中我們無需引入任何第三方依賴性、也不會(huì)產(chǎn)生其它難以處理的問題。

以下為我們?cè)趧?chuàng)建結(jié)束之后所得到的擴(kuò)展功能效果。大家可以點(diǎn)擊此處從GitHub上下載到本教程中的創(chuàng)建結(jié)果。

2. 創(chuàng)建一項(xiàng)Action擴(kuò)展

第一步:項(xiàng)目設(shè)置

首先要做的是啟動(dòng)Xcode 6.1或者更高版本,而后創(chuàng)建一個(gè)新項(xiàng)目。在Xcode的File菜單當(dāng)中選擇New > Project…,然后從模板列表當(dāng)中選擇Single View Application。

點(diǎn)擊Next并為我們的項(xiàng)目設(shè)定一個(gè)SampleActionExtensionApp名稱。輸入一個(gè)Organization Identifier并將Devices類型設(shè)置為iPhone。在本教程當(dāng)中,我們將使用的編程語言為Objective-C。

第二步:添加目標(biāo)

在完成了以上項(xiàng)目創(chuàng)建工作之后,大家接下來可以為Action擴(kuò)展添加一個(gè)目標(biāo)了。從File菜單下選擇New > Target…。在左側(cè)面板當(dāng)中,從iOS選項(xiàng)處選擇Application Extension,并在選定Action Extension后點(diǎn)擊Next。

現(xiàn)在將Product Name設(shè)置為ReadItAction。此外還需要注意其它一些選項(xiàng),特別是Action Type。我們稍后再就這一話題進(jìn)行深入探討?,F(xiàn)在點(diǎn)擊Finish以創(chuàng)建Action擴(kuò)展。

現(xiàn)在系統(tǒng)會(huì)詢問大家是否打算激活這套R(shí)eadItAction項(xiàng)目。暫時(shí)點(diǎn)擊Cancel,因?yàn)槲覀冎髸?huì)通過運(yùn)行內(nèi)容應(yīng)用來安裝這一Action擴(kuò)展、而非直接加以激活。

Action類型

Action擴(kuò)展共分為兩種類型,其一配備用戶界面、另一種則不配備用戶界面。大家可能會(huì)覺得奇怪——不配備用戶界面的Action擴(kuò)展到底有什么實(shí)實(shí)在在的好處?下面就讓我為大家作出解釋。

不具備用戶界面的Action擴(kuò)展以內(nèi)容變更為目標(biāo)作用于當(dāng)前項(xiàng)目。舉例來說,一項(xiàng)Action擴(kuò)展能夠去除相片當(dāng)中的紅眼現(xiàn)象,而且其完全無需用戶界面作為配合。內(nèi)容性應(yīng)用隨后可以對(duì)這部分經(jīng)過變更的內(nèi)容加以運(yùn)用,在以上實(shí)例中即為完成了修正的相片素材。

配備用戶界面的Action擴(kuò)展則可以表現(xiàn)為全屏形式或者格式表形式。Action擴(kuò)展目標(biāo)模板采用的是全屏幕形式,因此我們也將在接下來的創(chuàng)建過程中將其作為設(shè)計(jì)思路。

第三步:用戶界面的實(shí)現(xiàn)

現(xiàn)在我們已經(jīng)完成了基礎(chǔ)性設(shè)置流程,也就是做好了創(chuàng)建用戶界面的各項(xiàng)準(zhǔn)備工作。下面我們將從應(yīng)用程序內(nèi)容開始入手。

首先點(diǎn)擊Project Navigator當(dāng)中SampleActionExtensionApp組之下的Main.storyboard。在右側(cè)面板當(dāng)中,選擇File Inspector并取消對(duì)Use size classes的勾選。請(qǐng)注意,如果大家打算創(chuàng)建的是一款真正的應(yīng)用程序且不需要對(duì)iPad提供支持,那么使用size classes(即尺寸類)可能會(huì)是最好的選擇。

下面打開Object Library,并將文本視圖與工具欄拖拽至該視圖當(dāng)中。在右側(cè)的Size Inspectoron中將文本視圖的框體設(shè)定為{x:8, y:20, width:304, height:288}。而對(duì)于工具欄,我們同樣在Size Inspector中對(duì)其進(jìn)行設(shè)置,具體參數(shù)為{x:0, y:308, width:320, height:44}。

工具欄當(dāng)中應(yīng)當(dāng)包含一個(gè)欄按鈕。將其選定,而后在Attributes Inspector當(dāng)中將其Style設(shè)置為Plain,并將其Identifier設(shè)置為Action。

作為收尾工作,我們需要將文本視圖當(dāng)中的默認(rèn)文本內(nèi)容移除并替換為“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.(點(diǎn)擊action按鈕以調(diào)用活動(dòng)視圖控制器。而后選擇‘Read it’操作,這段文本將由我們的示例Action擴(kuò)展朗讀出來。)”

視圖控制器的用戶界面顯示效果現(xiàn)在應(yīng)當(dāng)如下圖所示:

當(dāng)然,我們也可以將內(nèi)容應(yīng)用程序保留為空白。畢竟我們的目標(biāo)在于構(gòu)建一套示例性應(yīng)用程序擴(kuò)展,因此該應(yīng)用本身并不需要真正的執(zhí)行功能。不過我個(gè)人希望向大家展示從應(yīng)用程序內(nèi)部實(shí)現(xiàn)活動(dòng)控制器調(diào)用有多么輕松,相信各位也能夠借此了解如何將更多其它Action擴(kuò)展納入自己的應(yīng)用當(dāng)中。

在點(diǎn)擊工具欄當(dāng)中的按鈕時(shí),一套活動(dòng)視圖控制器將會(huì)顯示出來,而我們則能夠從這里對(duì)自己的Action擴(kuò)展進(jìn)行調(diào)用。選擇這種方式的另一個(gè)理由在于,如果大家打算將自己的擴(kuò)展發(fā)布到App Store當(dāng)中,那么其必須要作為一款真正應(yīng)用程序的組成部分、而應(yīng)用當(dāng)然得擁有功能才可以順利通過蘋果官方的審批。

第四步:當(dāng)前活動(dòng)視圖控制器

接下來,我們需要將一部分代碼添加到ViewController.m當(dāng)中。首先在視圖控制器的類擴(kuò)展當(dāng)中為文本視圖創(chuàng)建一套外觀,具體代碼如下所示。

  1. @interface ViewController () 
  2.   
  3. @property (nonatomic, weak) IBOutlet UITextView *textView; 
  4.   
  5. @end 

創(chuàng)建一項(xiàng)名為actionButtonPressed的action,在這里我們將對(duì)UIActivityViewController實(shí)例進(jìn)行初始化與顯示、并將其提供給用戶。

  1. - (IBAction)actionButtonPressed:(id)sender { 
  2.     UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[self.textView.text] 
  3.                                                                              applicationActivities:nil]; 
  4.     [self presentViewController:activityVC animated:YES completion:nil]; 

讓我們?cè)僬f回Main.storyboard,通過點(diǎn)擊Control并將文本視圖外觀方案從View Controller Scene下的View Controller對(duì)象中將其拖拽至文本視圖內(nèi)、然后在彈出的菜單中選擇textView,這就實(shí)現(xiàn)了文本視圖外觀與文本視圖的對(duì)接。

為了與action方法實(shí)現(xiàn)對(duì)接,我們需要在工具當(dāng)中選擇該欄按鈕并打開Connections Inspector。將其從Sent actions下的selector當(dāng)中拖拽至View Controller對(duì)象,而后在彈出的菜單內(nèi)選擇actionButtonPressed:。

到這里應(yīng)用程序的用戶界面已經(jīng)設(shè)計(jì)完成并且正式交付使用,下面我們可以繼續(xù)進(jìn)行Action擴(kuò)展創(chuàng)建工作了。

第五步:用戶界面的實(shí)現(xiàn)

在Project Navigator當(dāng)中,展開ReadItAction組并點(diǎn)擊MainInterface.storyboard。大家應(yīng)該會(huì)注意到,該故事板并非空白、其中已經(jīng)包含有一部分用戶界面組件。我們可以對(duì)其中一部分加以利用,但具體的圖象視圖卻幫不上什么忙。因此選定該圖象視圖并通過按下Delete鍵將其移除。

接下來打開Object Library并在下方的導(dǎo)航欄中添加一套文本視圖。將其框體變更為{x: 8, y: 72, width: 304, height: 300}。最后,雙擊該導(dǎo)航欄的標(biāo)題視圖并將標(biāo)題內(nèi)容設(shè)定為“Text reader”。

第六步:ActionViewControlle的實(shí)現(xiàn)

到了這一步,我們需要搞定Action擴(kuò)展的實(shí)現(xiàn)工作。在Project Navigator當(dāng)中選擇ActionViewController.m,并對(duì)其實(shí)施以下幾項(xiàng)變更。

下面的導(dǎo)入語句會(huì)將一條導(dǎo)入語句添加到AVFoundation框架當(dāng)中,這樣我們就能將其語音合成API運(yùn)用在自己的Action擴(kuò)展當(dāng)中了。

1 @import AVFoundation;

在ActionViewController類的類擴(kuò)展當(dāng)中,移除其中的imageView外觀并添加到我們之前曾經(jīng)添加至文本視圖當(dāng)中的新外觀。

  1. @interface ActionViewController () 
  2.   
  3. @property (nonatomic, strong) IBOutlet UITextView *textView; 
  4.   
  5. @end 

除此之外,我們還需要對(duì)ActionViewController類中的viewDidLoad方法作出以下幾項(xiàng)變更。

  1. 30 - (void)viewDidLoad { 
  2.     [super viewDidLoad]; 
  3.       
  4.     //從擴(kuò)展背景信息中獲取我們打算處理的項(xiàng)目。 
  5.     // 在我們的Action extension當(dāng)中, 我們只需要一個(gè)輸入項(xiàng)目(即文本),因此我們使用數(shù)組中的第一個(gè)項(xiàng)目。 
  6.     NSExtensionItem *item = self.extensionContext.inputItems[0]; 
  7.     NSItemProvider *itemProvider = item.attachments[0]; 
  8.       
  9.     if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePlainText]) { 
  10.           
  11.         // 這是一段純文本! 
  12.         __weak UITextView *textView = self.textView; 
  13.           
  14.         [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePlainText options:nil completionHandler:^(NSString *item, NSError *error) { 
  15.               
  16.             if (item) { 
  17.                 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
  18.                       
  19.                     [textView setText:item]; 
  20.                       
  21.                     //設(shè)置語音合成并加以啟動(dòng) 
  22.                     AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init]; 
  23.                     AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:textView.text]; 
  24.                     [utterance setRate:0.1]; 
  25.                     [synthesizer speakUtterance:utterance]; 
  26.                 }]; 
  27.             } 
  28.         }]; 
  29.     } 

整個(gè)實(shí)現(xiàn)過程還是非常容易理解的。在viewDidLoad當(dāng)中,我們得到了輸入文本內(nèi)容、將其分配給文本視圖、而后再創(chuàng)建一個(gè)能夠?qū)⑵淅首x出來的語音合成對(duì)象。

第七步:配置Action擴(kuò)展

雖然我們已經(jīng)接近整個(gè)項(xiàng)目創(chuàng)建流程的尾聲,但仍有一些需要著重關(guān)注的細(xì)節(jié)問題。首先,我們需要將故事板中的文本視圖與我們此前已經(jīng)創(chuàng)建完成的外觀方案相對(duì)接。

打開MainInterface.storyboard并將文本視圖與Image場(chǎng)景相對(duì)接,正如我們之前在Main.storyboard當(dāng)中完成的操作一樣。

接下來我們還需要為Action擴(kuò)展指定所能支持的數(shù)據(jù)類型。在這一次的實(shí)例當(dāng)中,我們只需要支持純文本數(shù)據(jù)即可。展開Supporting Files組并選擇Info.plist。在Info.plist當(dāng)中,遵循NSExtension > NSExtensionAttributes > NSExtensionActivationRule導(dǎo)航流程,最后將NSExtensionActivationRule的類型由String變更為Dictionary。

在已經(jīng)展開的dictionary當(dāng)中,點(diǎn)擊旁邊的+號(hào)按鈕,從而添加一個(gè)新的子級(jí)鍵。將其名稱設(shè)置為NSExtensionActivationSupportsText,類型設(shè)定成Boolean,而值則取為YES。這樣一來,我們就能確保自己的Action擴(kuò)展只在輸入項(xiàng)目包含文本內(nèi)容時(shí)才會(huì)顯示出來。

仍然是在Info.plist當(dāng)中,我們要將Bundle Display Name變更為Read It。這樣看起來會(huì)更加清晰。下圖所示為Info.plist文件當(dāng)中相關(guān)部分的設(shè)置結(jié)果:

第八步

作為畫龍點(diǎn)睛之筆,大家可以為Action擴(kuò)展添加一個(gè)圖標(biāo)。在Project Navigator當(dāng)中,選擇該項(xiàng)目并在目標(biāo)之下選定ReadItAction目標(biāo)。在App Icons and Launch Images部分中的General標(biāo)簽下點(diǎn)擊App Icons Source旁邊的Use Asset Catalog。根據(jù)提示,我們接下來需要點(diǎn)擊Migrate。而后慎用至資產(chǎn)目錄并將以下圖標(biāo)拖拽至iPhone App iOS 7,8 60pt 2x位置。

[[127275]]

完成應(yīng)用程序的構(gòu)建與運(yùn)行步驟,看看一切是否像我們預(yù)期的那樣運(yùn)轉(zhuǎn)正常。不過還有一個(gè)需要關(guān)注的問題:如果聲音圖標(biāo)沒有被正常顯示在Action擴(kuò)展之內(nèi),大家需要確保主Images.xcassets文件已經(jīng)被正確復(fù)制到了擴(kuò)展目標(biāo)當(dāng)中。

要完成這項(xiàng)操作,我們需要在Project Navigator當(dāng)中選定該項(xiàng)目并從Targets列表當(dāng)中選擇ReadItAction目標(biāo)。打開屏幕頂端的Build Phases標(biāo)簽并展開Copy Bundle Resources步驟。如果Images.xcassets文件并未出現(xiàn)在資源列表當(dāng)中,那么點(diǎn)擊其中的小加號(hào)將其手動(dòng)添加到列表之內(nèi)。

3. 運(yùn)行及測(cè)試

最后要做的就是運(yùn)行應(yīng)用程序并嘗試其各功能的起效情況。以下顯示的兩幅截圖為運(yùn)行當(dāng)中的擴(kuò)展外觀。大家也可以嘗試通過記事本應(yīng)用調(diào)用該活動(dòng)視圖控制器,并讓我們的擴(kuò)展讀取之前曾經(jīng)記錄過的文本內(nèi)容。除此之外,我們不妨在相片應(yīng)用當(dāng)中打開活動(dòng)列表,這時(shí)大家會(huì)發(fā)現(xiàn)自己的擴(kuò)展并沒有被列中其中。沒錯(cuò),這正好符合我們之前為其設(shè)置的激活規(guī)則。

總結(jié)

在今天的教程當(dāng)中,大家了解了如何構(gòu)建一套簡(jiǎn)單的Action擴(kuò)展。我們還涉及到了一些基礎(chǔ)性知識(shí),即如何運(yùn)用AVFoundation框架當(dāng)中的語音合成API。如果大家有舉創(chuàng)建出更多擴(kuò)展方案,也可以點(diǎn)擊此處查看由Cesar Tessarin帶來的Today擴(kuò)展創(chuàng)建指南。

如果大家對(duì)本文內(nèi)容還抱有任何疑問或者建議,請(qǐng)?jiān)谙路降脑u(píng)論欄中與我們分享。

英文原文:http://code.tutsplus.com/tutorials/ios-8-how-to-build-a-simple-action-extension--cms-2279

 

責(zé)任編輯:chenqingxiang 來源: 51CTO
相關(guān)推薦

2017-06-27 11:13:51

互聯(lián)網(wǎng)

2012-09-24 10:12:38

戴爾

2009-12-16 11:08:32

架構(gòu)師程序員

2014-07-11 09:33:24

iOS 8動(dòng)作擴(kuò)展

2013-08-21 09:50:19

Windows 8

2014-07-24 10:06:56

ContinuityiOS 8Yosemite

2012-12-26 11:15:53

兒童應(yīng)用移動(dòng)應(yīng)用平板

2013-08-30 09:54:58

企業(yè)移動(dòng)應(yīng)用

2013-12-26 10:17:17

郵件服務(wù)器軟件反垃圾

2010-08-06 16:07:55

Flex通信

2012-02-13 10:32:00

iOS應(yīng)用設(shè)計(jì)趨勢(shì)

2015-04-23 09:05:48

蘋果風(fēng)云人物

2023-11-13 09:28:20

跨組件組件化

2009-05-13 08:50:13

Novell技術(shù)解讀

2011-09-10 10:06:31

愛普生針式打印機(jī)

2011-07-29 10:01:21

IOS 跑馬燈

2011-09-20 09:34:09

Windows Ser微軟虛擬化

2012-08-17 09:14:13

Windows 8操作系統(tǒng)

2009-02-17 09:22:14

ActionMVCASP.NET

2009-02-16 10:05:11

ActionMVCASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)