App Extensions in iOS
李 俊河
本プレゼンは2015年3月に発表したものです
• App Extensionsとは?
• Extension Pointの種類
• App Extensionsの基礎知識 1. App ExtensionsのLife Cycle2. App Extensionsのデータ通信
- App Groups- Embedded Framework- NSUserDefaultsの場合- CoreDataの場合
• 注意事項
iOS8 & OS X - Yosemiteから追加された技術であり
App Extensionsとは?
共有・通知センター・キーボードなどiOSシステムの特定領域と紐付いてその領域の機能を拡張させ
ます
App Extensionsとは?
そのそれぞれの領域をExtension Pointと言います
App Extensionsとは?
Extension Pointの種類については後で説明します
App Extensionsとは?
その前に二つの言葉の意味について説明します
App Extensionsとは?
Host appとContaining app
App Extensionsとは?
まずはHost appから
App Extensionsとは?
ユーザー自らApp Extensionsを選択できるようになっているアプリのことを言います
App Extensionsとは?
Safari , Photo(基本の「写真」アプリ)などを表します
App Extensionsとは?
次はContaining appについて
App Extensionsとは?
App Extensionsが含まれているアプリのことを表します
App Extensionsとは?
ちなみにContaining appには
App Extensionsとは?
いくらでもApp Extensionsを含められるそうです(確認はしていません)
App Extensionsとは?
それではExtension Pointの種類について説明します
App Extensionsとは?
• Extension Pointは大きく分けて7種類が存在します
Extension Pointの種類
Today
Share
Action
Photo Editing
Finder Sync
Document Provider
Custom Keyboard
Extension Pointの種類
Today
• アプリを起動せずにそのアプリの一部の機能を簡単に使えるようにするExtension
• 「ウィジェット」とも呼びます
Extension Pointの種類
Share
• Host appに存在する ボタンを押し、情報をSNSなどで他ユーザーと共有するExtension
Extension Pointの種類
Action
• Host app上で表示される コンテンツを操作・表示する Extension
Extension Pointの種類
Photo Editing(iOS Only)
• 写真(iOS基本アプリ)で 写真や動画をカスタム編集するExtension
Photo Editing(iOS Only)
• 写真(iOS基本アプリ)で 写真や動画をカスタム編集するExtension
• 写真アプリ内部から該当するExtensionを選択してカスタム編集できるようにする
Extension Pointの種類
Finder Sync(OS X Only)
• フォルダ/ファイルの同期状態をFinder上に表示するExtension
Extension Pointの種類
Document provider(iOS Only)
• Containing appの内部ファイルをHost appが操作できるようにするExtension
Extension Pointの種類
Document provider(iOS Only)
• Containing appの内部ファイルをHost appが操作できるようにするExtension
• Import / Export / Open / Moveの操作ができる
• それぞれの操作は自前で実装する必要がある
Extension Pointの種類
Custom Keyboard(iOS Only)
• キーボードをカスタマイズしていろんなアプリ上で使える Extension
Extension Pointの種類
–Johnny Appleseed
1. ユーザーがApp Extensionを選択
App Extensionsの基礎知識
App ExtensionsのLife Cycle
–Johnny Appleseed
2. システムがApp Extensionを実行
App Extensionsの基礎知識
App ExtensionsのLife Cycle
–Johnny Appleseed
3. App Extensionのコードが走る
App Extensionsの基礎知識
App ExtensionsのLife Cycle
–Johnny Appleseed
4. システムがApp Extensionを終了
App Extensionsの基礎知識
App ExtensionsのLife Cycle
Host appとContaining appは直接通信することができません
App Extensionsのデータ通信
App Extensionsの基礎知識
なのでその間をApp Extensionが繋ぐ方法で通信ができます
App Extensionsのデータ通信
App Extensionsの基礎知識
詳しい説明の前に
App Extensionsのデータ通信
App Extensionsの基礎知識
Host app ↔ App Extension ↔ Containing appの間に データ通信を行うための二つ準備が必要です
App Extensionsのデータ通信
App Extensionsの基礎知識
準備 1. App Groups
App Extensionsのデータ通信
App Extensionsの基礎知識
App GroupsApp ExtensionとContaining appが互いのデータを一つの
Group Idを持つ共用コンテナーの中で書き込むことで通信できるようになります
App Extensionsの基礎知識
App Groups
iOS DevCenterから「App groups」を作ります
App Extensionsの基礎知識
App Groups実際のプロジェクトからは
Targets→Capabilities→App GroupsをONに
App Extensionsの基礎知識
App Extensionsの基礎知識
App Groupsその後表示されるApp Groupsを確認してチェックしますとそのTargetに当たる「.entitlements」ファイルが作成されます
App Extensionsの基礎知識
App Groups
App Extension側のTargetにも同じ作業をすると完了です
準備 2. EmbeddedFramework
App Extensionsの基礎知識
App Extensionsのデータ通信
App Extensionsの基礎知識
EmbeddedFramework
App ExtensionとContaining appが 共通したクラスやリソースを使う場合に必要です
App Extensionsの基礎知識
EmbeddedFramework
File→New→Targetを選択
App Extensionsの基礎知識
EmbeddedFrameworkFramework&Library → Cocoa Touch Framework 選択
App Extensionsの基礎知識
EmbeddedFrameworkProduct Nameに名前を入れてFinishします
App Extensionsの基礎知識
EmbeddedFramework実際のTargetsにはこのように表示されます
App Extensionsの基礎知識
EmbeddedFrameworkGeneral → Deployment Info → App Extensionsの Allow app extension API only 項目にチェック
App Extensionsの基礎知識
EmbeddedFrameworkプロジェクト上のTarget → General → Embedded BinariesとLinked Frameworks and Librariesにさっき作りましたEmbeddedFrameworkが存在するか確認し、存在しない場合は追加します
App Extensionsの基礎知識
EmbeddedFrameworkApp ExtensionsのTargetにも同様に確認します (Linked Frameworks and Librariesだけ)
App Extensionsの基礎知識
EmbeddedFramework共用するクラスの.hファイルをEmbeddedFramework TargetのBuild Phases→ Headers→Projectに追加します
App Extensionsの基礎知識
EmbeddedFramework共用するクラスの.mファイルはEmbeddedFramework TargetのBuild Phases→ Compile Sourcesに追加します
App Extensionsの基礎知識
EmbeddedFramework共用するクラスの中でEmbeddedFrameworkの外部に公開するクラスは.hファイルをHeaders→ProjectからHeaders→Publicへ移動し
App Extensionsの基礎知識
EmbeddedFramework
EmbeddedFrameworkを作る時一緒に生成された.hファイル (この場合ではEmbeddedDB.h)の下に下記のように書きます
App Extensionsの基礎知識
EmbeddedFramework
実際利用するクラスでは@importで宣言すると使えます
これで準備が完了しましたので
App Extensionsの基礎知識
App Extensionsのデータ通信
実際の共用コンテナーを使ってみます
App Extensionsの基礎知識
App Extensionsのデータ通信
まずは大人気のNSUserDefaultsを使用する場合から
App Extensionsの基礎知識
App Extensionsのデータ通信
initWithSuiteName:でAppGroups Idを指定してインスタンスを生成
App Extensionsの基礎知識
NSUserDefaultsの場合
その後オブジェクトを作ったり呼び出したりする場合は普通のNSUserDefaultsと同じです
App Extensionsの基礎知識
NSUserDefaultsの場合
次はCoreDataの場合
App Extensionsの基礎知識
App Extensionsのデータ通信
実際のDBファイルを利用する指定先を containerURLForSecurityApplicationGroupIdentifier:に
AppGroups Idを指定すると使えます
App Extensionsの基礎知識
CoreDataの場合
実際の保存先はprivate/var…に存在するappGroups専用の フォルダに指定されるため脱獄をしない限りは大丈夫です
App Extensionsの基礎知識
App Extensionsのデータ通信
最後にExtensionを使う時の幾つかの注意事項があります
注意事項
1. iOS8から使用できます(iOS7はできません)
注意事項
理由はEmbeddedFrameworkと関係している上で
注意事項
App ExtensionがiOS8からサポートするためです
注意事項
2. Extensionを入れる予定のアプリには 64ビット(arm64)対応が必須です
注意事項
3. App Extension上で使用できないAPIが存在します
注意事項
ヘッダーにNS_EXTENSION_UNAVAILABLEなどの 説明(マクロ)が付いているAPIは使用できません
注意事項
4. カメラとマイクを使用できません
注意事項
5. BG上で長時間タスクを起動することができません (フラットフォームにより違いがあるようです)
注意事項
6. AirDropを使いデータ通信をすることができません
注意事項
注意事項
代わりにUIActivityViewControllerクラスを利用して 既存アプリと一緒にAirDropを使うのは可能だそうです
レファレンスhttps://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/AppExtensions/AppExtensions.html
http://www.raywenderlich.com/83809/ios-8-today-extension-tutorial
http://qiita.com/monoqlo/items/6ed93f0d2e719acd9474
http://www.cnet.com/how-to/how-to-set-up-ios-8-action-extensions-in-safari/
http://dev.classmethod.jp/smartphone/ios8-photo-kit-9/
http://qiita.com/takebayashi/items/f29617d56ceed9ee7e9d
http://www.macstories.net/mac/extensibility-and-automation-changes-in-os-x-yosemite/
http://www.slideshare.net/ssuser9c7e21/document-provider
https://itunes.apple.com/jp/app/morse-code-telegraph-keyboard/id921290705?mt=8
http://dev.classmethod.jp/references/ios-8-app-extension-5/
http://dev.classmethod.jp/references/ios-8-app-extension-6/
http://dev.classmethod.jp/references/ios-8-action-extension/
http://swift-studying.com/blog/swift/?p=508
http://dev.classmethod.jp/references/ios-8-embedded-framework/
http://techblog.yahoo.co.jp/ios/today-widget/
http://stackoverflow.com/questions/24641768/accessing-core-data-sql-database-in-ios-8-extension-sharing-data-between-app-an
https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/index.html