2015年4月2日木曜日

iOS Extensionの作り方講座(Action Extension編)

はじめに

Extensionというのは、1つのアプリの範囲を超えた機能を実装するための仕組みです。iOS8以降から利用できるようになった機能の一つです。

例えば、Extensionを使って以下のような機能が実装できるようになります。
・Safariで見つけた画像を、独自の画像コレクションアプリに取り込む
・カスタムキーボードアプリを作成して、他のアプリの入力UIとして使用する
・iPhone通知センターのTodayビューに独自のウィジェットを追加する

以上のように、Extensionは他のアプリと連携する機能の実装や、iPhoneの標準機能の拡張を実現するための仕組みです。Extensionを利用することでアプリ同士の密な連携が取れるようになるので、iPhoneそのもののカスタマイズ性が上がりアプリユーザにとっても嬉しい仕組みです。
Extensionを開発するためには、Extensionのベースとなるアプリが必ず必要になります。ベースとなるiOSアプリをApp StoreからインストールしたときにExtensionも一緒にインストールされます。

前回の記事を読んだ方は気づいたかもしれませんが、
以前紹介したApple Watch向けアプリも実はExtensionの一種です。

これからExtensionを利用した開発が増えていくことが予想されます。
今回は、Extensonに慣れるための簡単なサンプルアプリの作成チュートリアルを行います。

対象

iOSアプリを少しでも作成したことのある人
Extensionを全く利用したことがない人
開発言語はSwift
Xcode 6.2

作成するもの

今回は以下のExtensionを作成します。
・Safariブラウザを閲覧しているときに、閲覧しているページと同じページを独自アプリで開くExtension

使用するExtension

今回はAction Extensionを利用します。
Extensionは特定の拡張機能を実装するのに特化した仕組みなため、あらかじめ利用できるExtensionの種類が定められています。

Action Extensionというのはホストアプリ(今回の場合はSafari)のコンテンツを操作・表示するためのExtensionです。Extensionの中でも特に汎用性の高い機能です。

今回のExtensionではSafariブラウザで開いているページのURLをExtension経由でゲストアプリ(つまり独自アプリ)に教えてあげることで、同じページを開かせます。

作成手順

概要

作成手順を示します。
1. iPhoneアプリを作成する(Extensionのベースとなるアプリです。)
2. Action Extensionを追加する
3. Web Viewを追加する
4. SafariブラウザからURLを受け取りWeb Viewに表示する

1. iPhoneアプリを作成する

iOSアプリを作成する通常の方法と何も変わりません。

File -> new -> ProjectからiOSアプリを作成します。

TemplateはiOS -> Application -> Single View Applicationとします。
Product NameはAETSampleとします。
言語はSwiftを選択します。Core Dataは使用しません。

2. Action Extensionを追加する

File -> New -> TargetからTargetを追加します。
TemplateはiOS -> Application Extension -> Action Extensionとします。
名前はAETExtensionとします。
言語はSwiftです。
Action Typeはデフォルト値(Presents User Interface)のままです。

Activate Scheme?に対してはActivateと答えましょう。
ExtensionをビルドするためのSchemeが追加されます。

3. WebViewを追加する

AETExtension/MainInterface.storyboardを開きます。
初期状態でUIImageViewのUIが用意されていますが、今回は使用しないためUIImageViewは削除します。
“Done”ボタンを含むNavigation Barは再利用できるのでそのままでOKです。

UIImageViewと同じ場所に置き換えるようにして、UIWebViewを追加しましょう。

さらに、ActionViewControllerファイルにIBOutlet参照を張ります。

4. SafariブラウザからURLを受け取りWeb Viewに表示する

次はActionViewControllerを編集していきます

viewDidLoad内に既にコードが書かれていると思います。
このコードはstoryboardにデフォルトで配置されていたUIImageViewに対するコードです。ホストアプリ(Safariブラウザ)から値を受け取る処理は共通部分が多いので、既存のコードを編集する形で実装していきます。

viewDidLoadを以下のように編集してください。

// ActionViewController
    override func viewDidLoad() {
        super.viewDidLoad()

        // Get the item[s] we're handling from the extension context.

        // For example, look for an image and place it into an image view.
        // Replace this with something appropriate for the type[s] your extension supports.
        for item: AnyObject in self.extensionContext!.inputItems {
            let inputItem = item as NSExtensionItem
            for provider: AnyObject in inputItem.attachments! {
                let itemProvider = provider as NSItemProvider
                if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as NSString) {
                    itemProvider.loadItemForTypeIdentifier(kUTTypeURL as NSString, options: nil, completionHandler: {
                        [weak self] (data, error) in
                        if error != nil {
                            println(error)
                        }
                        if let url = data as NSURL? {
                            println("url: \(url)")
                            self?.webView.loadRequest(NSURLRequest(URL: url))
                        }
                    })
                }
            }
        }
    }
ポイント1
if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeURL as NSString) {
    itemProvider.loadItemForTypeIdentifier(kUTTypeURL as NSString, options: nil, completionHandler: {...})
}

Action Extensionによりホストアプリから受け取る値は様々です。
更にホストアプリから受け取る値は複数存在することもあり、どのような値が来るかは分からないため、受け取った値の種類を判別する必要があります。
既存のコードではUIImageを受け取るためにkUTTypeImageが指定されていました。
今回はURLを受け取るのでkUTTypeURLを指定します。

ポイント2
self?.webView.loadRequest(NSURLRequest(URL: url))

URLタイプの値を受け取ったときにwebViewからURLリクエストを行いwebページを読み込みます。

実装はこれで終了です。

デモ

Xcodeシミュレータで実際に動かしてみましょう。

TargetをAETExtensionに変更します。
Command + control + [でTargetの切り替えが出来ます。
Command + Rで起動しましょう。

起動する際にExtentionを起動するホストアプリを選択する必要があります。
Safariを選択しましょう。

Safariの画面下部のツールバーのアクティビティボタン(真ん中)を選択します。
表示されるバーの中にAETExtensionというボタンがある筈です。
無い場合は下のバーのその他を選択し、AETExtension項目にチェックを入れましょう。

AETExtensionを選択すると、AETSampleアプリが起動し、Safariと同じWebページが表示されます。

補足

できあがったアプリはこちらからダウンロードできます。
https://github.com/takanori-matsumoto-mulodo/AETSample

0 件のコメント :

コメントを投稿