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