2015年11月4日 星期三

[iOS] Action Extension 簡易教學

這幾天在研究iOS裡面的Extension。中文資源好像不太多,所以我把一些最近看到的心得陸續寫一下。

今天我要做的簡單教學,是讓APP可以打開Action Sheet,裡面會有一個Read按鈕,當使用者點了Read,APP就會幫你念出APP中的文字內容。




其實Extension最常被使用的地方是:雖然你沒有開啟APP,但你可以讓使用者可以使用某些APP功能或內容,所以通常使用Extension的時候都是因為有些特殊工作需要執行。Extension的種類很多,今天我要介紹的是Action Extension,這個Extension主要的目的是讓使用者查看或操作你APP裡的內容。在實作Extension特別需要注意的一個觀念是:Extension並不是一個APP唷!

好了,我們開始吧!


Step 1. 打開Xcode 新增一個Project,使用Single View Application並取一個自己喜歡的Project名字,我這裡取的是:“ReadExtPractice”





Step 2. 從Target的地方新增一個Target,並選擇Action Extension,一樣自己取一個你喜歡的名字吧!這裡我是叫做"Read"。然後在Activate處先選Cancel吧。






Step 3. 現在就開始來動工做一下簡單的UI吧!這裡我們以iPhone作為例子,就暫且不考慮那些iphone尺寸不同問題拉。先到ReadActionExt裡面Main.storyboard裡點選View Controller,並把 Simulated Metrics裡面的size設定成 iPhone 4.7-inch,就假設他是iPhone6吧。然後加入一個TextView與一個Button,並且把TextView的內文設定為自己想要的內容,如果不知道寫什麼,就跟我寫一樣吧!我的是“Hello, my name is Tung-tung Tsai. Welcome to Use Action Extension. Have a nice day.”並將按鈕的Title換成"Action"。如果不知道元件的size如何設定比較好,可以參考我這裡是設定textview{0, 28, 375, 200},button{112, 250, 150, 40}。






Step 4. 接下來開始寫點code拉。先到ViewController.h裡加入textView這個property並命名為"textView"並加入按鈕的Action命名為"ActionPressed",然後到ViewController.m裡面找到- (IBAction)ActionPressed:(id)sender 這個函數,並在裡面加上這段code,讓使用者點擊按鈕後出現一個Activity Controller。

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





Step 5.  都沒問題後就要開始來處理Action Extension的部分拉!一樣先處理UI,我們到Read裡面打開MainInterface.storyboard,這裡原本會有一個imageView不過我們不需要他,就直接將他Delete吧,然後加上一個TextView,並將Navigation Bar的標題改成"Read Ext"。

然後進入ActionViewController.h裡加入一個property命名為"TextView"連結到剛剛你加到storyboard裡的TextView吧!





Step 6.  打開ActionViewController.m,先在上面@import AVFoundation後,將- (void)viewDidLoad 的code先拿掉並重新寫上:

    NSExtensionItem *item = self.extensionContext.inputItems[0];
    NSItemProvider *itemProvider = item.attachments[0];
    
    if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePlainText]) {

        [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePlainText options:nil completionHandler:^(NSString* item, NSError * error) {
            if (item) {
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    [self.TextView setText:item];
                    
                    //Set Synthesizer and utterence
                    AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc]init];
                    AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:self.TextView.text];
                    [utterance setRate:0.5];
                    [synthesizer speakUtterance:utterance];
                }];
            }
        }];
        
    }



Step 7. 完成上述程式碼就代表他會在Extension被呼叫時讀取原本在TextView裡面的文字並且朗讀出來。但還沒結束,還需要在Read裡面的Info.plist設定一些參數才行。先進入Info.plist,然後打開NSExtension -> NSExtensionAttributes -> NSExtensionActivationRule,將NSExtensionActivationRule的type改為Dictionary,並加入一個新的項目NSExtensionActivationSupportsText,把這個type設為Boolean,並把Value設為YES。



Step 8. 終於完成了,最後到Asset.xcassets裡面把120x120的圖示放進去,並在App icon source裡面設定Icon來源為AppIcon就完成了。







Step 9. 實際執行看看吧!!應該會出現下面的樣子,如果我點選Action,再點選Read就會出現一個新頁面然後開始讀文字內容給你聽嘍!!!!











完成了! 希望這個教學可以幫助你更認識Action Extension嘍!如果有需要這份代碼,可以從Github上面查看。


沒有留言:

張貼留言