はじめに
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 件のコメント :
コメントを投稿