ios 8 app extension
DESCRIPTION
この資料は発表当時(2014/7/29)のものです。既に仕様が変わっている部分もありますので、ご注意ください。TRANSCRIPT
iOS8 App ExtensionLINE Developer Meetup in Fukuoka #62014.07.29 難波 健雄
自己紹介• 難波 健雄
• LINE Fukuoka iOS Developer
• github.com/groovelab
• no music no life
自己紹介JAZZ やってます
自己紹介福岡城のFacebookページ
はじめに• 動作環境
• Xcode6 beta4
• iOS8 beta4
• iOS SDK 8 beta4
はじめに• 動作環境
• Xcode6 beta4
• iOS8 beta4
• iOS SDK 8 beta4
beta5 で変わるかもしれません
アジェンダ• App Extension
• Extension Point
• Host AppとApp Extension
• Containing AppとApp Extensionの配布
• App Extensionの実装とデバッグ
App Extension• iOS8から新しく追加されたアプリ連携の仕組み
• iOS7まではURLスキームによる連携(別アプリ起動)
• 複数のアプリで同じ機能を使用できる
詳細は App Extension Programming Guide を参照
App Extension同じ機能
例えば、、、
• ブラウザからFacebook・Twitter以外のSNSへ投稿
• 現在のホークスの試合を通知センターで表示
• 画像・動画の編集
• 独自のキーボード
App Extension• すでにGitHubには、たくさんのリポジトリが作られている
• たとえば
• たとえば
• たとえば
• たとえば
App Extension
いま、App Extensionがアツイ!
• すでにGitHubには、たくさんのリポジトリが作られている
Extension Point• AppExtensionには様々な種類がある
Extension Point• AppExtensionには様々な種類がある
• 種類 → Extension Point
Extension Point• Today
• Share
• Action
• Photo Editing
• Document Provider
• Custom Keyboard
iOSのみ
Extension Point• Today
• Share
• Action
• Photo Editing
• Document Provider ← 諸事情により割愛します
• Custom Keyboard
Extension Point• Today
• 通知センターの「今日」に表示
• Widgetとも呼ぶ
Extension Point• Share
• コンテンツの共有
• SNSへの投稿
Extension Point• Action
• コンテンツの編集
• 画像・テキスト
• サンプルコード
• Extension Request Handling
• Safari Plugin
• JavaScriptで実装
Extension Point• Photo Editing
• 写真アプリから連携
• 画像や動画を編集
• サンプルコード
Extension Point• Custom Keyboard
• 独自のキーボードを作成可能
Host AppとApp Extension• App Extensionを呼び出すアプリ → Host App
• Host AppとApp Extensionは別プロセスで動作する
Host AppとApp Extension• Host AppとApp Extensionのデータ受け渡しは
NSExtensionContextインスタンスを利用する
• NSExtensionContext → テキスト・画像などを含む
Containing App• App Extensionの作成方法
1. XcodeでiOSアプリProjectを作成
2. Targetの追加 → Application Extension → Extension Pointを決定
Containing App• App Extensionの作成方法
1. XcodeでiOSアプリProjectを作成 ← Containing App
2. Targetの追加 → Application Extension → Extension Pointを決定
Containing App• App Extensionの作成方法
1. XcodeでiOSアプリProjectを作成 ← Containing App
2. Targetの追加 → Application Extension → Extension Pointを決定
• App Extensionの配布
1. Containing App をAppStoreに登録
2. Containing App をAppStoreからインストール
Containing App• App Extensionの作成方法
1. XcodeでiOSアプリProjectを作成 ← Containing App
2. Targetの追加 → Application Extension → Extension Pointを決定
• App Extensionの配布
1. Containing App をAppStoreに登録
2. Containing App をAppStoreからインストール 同時にAppExtensionもインストールされる
App Extensionの実装• Containing Appにtargetを追加する
ここまでは同じ
App Extensionの実装• Containing Appにtargetを追加する
ここまでは同じ
• Extension Pointによって実装が異なる
• Todayの場合
1. StoryBoardでUIを作成
2. UIに表示するデータを取得する処理を実装
3. 取得したデータをUIにセットする処理を実装
App Extensionのデバッグ1. 追加したtargetをRun ▶
2. どのアプリを起動するか選択 ← Containing AppはNG
3. 起動したアプリからApp Extensionを呼ぶ
4. RunしたAppExtensionがデバッガに接続される
• デバッグコンソール
• NSLog()
• break point
App Extensionのデバッグ1. 追加したtargetをRun ▶
2. どのアプリを起動するか選択 ← Containing AppはNG
3. 起動したアプリからApp Extensionを呼ぶ
4. RunしたAppExtensionがデバッガに接続される
• デバッグコンソール
• NSLog()
• break point
Today Extension• UIViewControllerを継承したTodayViewController
• StoryBoardを使用可能
• UILabel, UIButton
• キーボード入力できないのでUITextFieldは利用不可
• preferredContentSizeでサイズ変更
• viewDidLoad は通知センターを表示するたびに呼ばれる
• NSURLConnectionで外部コンテンツ参照可能
Share Extension• SLComposeServiceViewControllerを継承した
ShareViewController
• デフォルトのUI(ダイアログ)を使用する
• Storyboardは背景に使用される
• configurationItemsでダイアログのフッターにアイテムを追加
• didSelectPostで投稿処理を実装する
Action Extension• UIViewControllerを継承したActionViewController
• StoryBoardを使用可能
• NSExtensionContextを通じて編集するコンテンツを取得・セットする
• done で処理を実装する
Photo Editing Extension• UIViewControllerを継承した
PhotoEditingViewController
• StoryBoardを使用可能
• startContentEditingWithInputで編集するコンテンツを表示
• finishContentEditingWithCompletionHandlerで編集したコンテンツを保存する
Custom Keyboard• UIInputViewControllerを継承した
KeyboardViewController
• StoryBoardを使用できない
• viewDidLoadでUIButtonをaddSubviewしていく
• textDocumentProxyのinsertText にテキストを渡す
実装で注意すること• 使用できないクラス・メソッドがある
• NS_EXTENSION_UNAVAILABLE
• [UIApplication sharedApplication]
• [UIApplication openURL]
• [self.extensionContext openURL: …]
• ↑ContainingAppを起動することは可能
• UIAlertController ← iOS8版UIAlertView
• Todayでは使用できず
実装で注意すること• Containing AppとAppExtensionのデータ共有
• AppGroupを設定することで実現可能
• info.plist で受け付けるコンテンツを制限
• NSExtensionActivationRule
• NSExtensionActivationSupportsText
• NSExtensionActivationSupportsImageWithMaxCount
実装で注意すること• バッドノウハウ (beta4だけ?)
• TodayはiOSシミュレータのほうがデバッグしやすい
• 修正内容を反映させるのにiOSの再起動が必要
• iOSシミュレータを終了 → Run
• Photo Editing、Custom Keyboardは実機のみデバッガを使用できる
• Custom KeyboardはUserDefaultsでContainingAppとデータ共有できない?↑公式ドキュメントにはできると書いてあるので、beta4のバグかも
最後に
LINE Fukuokaでは
開発エンジニアを募集しています
https://linefukuoka.co.jp/career/developer