SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
App Extension
2014/6/20

@TachibanaKaoru
この書類は、Apple社が公開している情報を
もとに作成しています。
Agenda
• About
• What is App Extension
• How to make App Extension
• How to share data Container and Extension
• App Group and Shared Container
• How to share codes between Container and Extension
• Information
About
• @TachibanaKaoru
• 渋谷のgenesix(VOYAGE GROUP)という会社で iOS
エンジニアをしています。
• Blog : http://www.toyship.org/
• WWDCの参加は2010が最後でした。
• それ以来行けていません……。
What is App Extension
• iOS8から導入された、アプリ間の連携の仕組み。
• それに加え、Notification Centerに表示するWidget機
能やサードパーティ製キーボードも含まれています
• 今日はそれぞれのApp Extensionの詳細には踏み込ま
ず、App Extension全体に関連する項目を中心にすすめ
ます
What is App Extension
• App Extensions
• Today (iOS/OS X)
• Share (iOS/OS X)
• Action (iOS/OS X)
• Photo Editing (iOS)
• Finder (OS X)
• Storage Provider (iOS)
• Custom keyboard (iOS)
What is App Extension
• App Extensions
• Today (iOS/OS X)
• Share (iOS/OS X)
• Action (iOS/OS X)
• Photo Editing (iOS)
• Finder (OS X)
• Storage Provider (iOS)
• Custom keyboard (iOS)
What is App Extension
• App Extensions
• Today (iOS/OS X)
• Share (iOS/OS X)
• Action (iOS/OS X)
• Photo Editing (iOS)
• Finder (OS X)
• Storage Provider (iOS)
• Custom keyboard (iOS)
What is App Extension
• App Extensions
• Today (iOS/OS X)
• Share (iOS/OS X)
• Action (iOS/OS X)
• Photo Editing (iOS)
• Finder (OS X)
• Storage Provider (iOS)
• Custom keyboard (iOS)
What is App Extension
• App Extensions
• Today (iOS/OS X)
• Share (iOS/OS X)
• Action (iOS/OS X)
• Photo Editing (iOS)
• Finder (OS X)
• Storage Provider (iOS)
• Custom keyboard (iOS)
How to make App Extension
• Extensionは、アプリのターゲットとして追加される
• ExtensionはContaining Appに含まれて単体でリリースす
ることはできない
How to make App Extension
• Extensionは、Contaning Appと同じipaに含まれてリ
リースされますが、Extensionは、Contaning Appアプリ
としては全く別の存在です。
• アプリから利用するサンドボックス、設定、メモリ
空間、のすべてで異なります。
• (ここのデータ共有する方法については後ほど説明し
ます)
How to make App Extension
• Containing App(本体アプリ)にターゲットを追加
• Extensionごとにターゲットのテンプレートがあるの
で、自分の作成したいExtensionを選択
How to make App Extension
• Extensionをターゲットとして追加すると、自動的に
ターゲットのinfo.plistと、Extensionの動作の中心となる
ViewControllerクラスのファイルが作成されます。
• 基本的な動作は、そのViewControllerクラスを拡張する
のみ
How to make App Extension
• Extensionは、Containing App(本体アプリ)とは別プロ
セスとなるため、独自のBundle Identifierを設定します。
• ただし、Containing AppとExtensionのBundle Identifier
は、同じPrefixを持つ必要があります。
• 例:Containing App: org.toyship.chat
• 例:Extension:org.toyship.chat.widget
How to make App Extension
• Extensionで使えないAPIがあります。
• NS_EXTENSION_UNAVAILABLE_IOS
+ (UIApplication *)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based
solutions where appropriate instead.");
!
@property(nonatomic,assign) id<UIApplicationDelegate> delegate;
!
- (void)beginIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS("");
- (void)endIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS("");
- (BOOL)isIgnoringInteractionEvents;
!
@property(nonatomic,getter=isIdleTimerDisabled) BOOL idleTimerDisabled;
!
- (BOOL)openURL:(NSURL*)url NS_EXTENSION_UNAVAILABLE_IOS("");
- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);
How to make App Extension
• UIApplication.h
+ (UIApplication *)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based
solutions where appropriate instead.");
!
@property(nonatomic,assign) id<UIApplicationDelegate> delegate;
!
- (void)beginIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS("");
- (void)endIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS("");
- (BOOL)isIgnoringInteractionEvents;
!
@property(nonatomic,getter=isIdleTimerDisabled) BOOL idleTimerDisabled;
!
- (BOOL)openURL:(NSURL*)url NS_EXTENSION_UNAVAILABLE_IOS("");
- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);
How to make App Extension
• UIApplication-sharedApplicationが使えない
• UIApplication-openURLも使えない
• UIViewControllerの新しいpropertyとして、
NSExtensionContextが追加されていて、Extensionではこ
のオブジェクトが取得できます。
• このクラスが、Hostアプリ-Extensionのデータのやり取
りやopenURLをサポートします。
How to make App Extension
• NSExtensionContext
@interface NSExtensionContext : NSObject
!
// HostアプリからExtensionに渡される入力データ
@property(readonly, copy, NS_NONATOMIC_IOSONLY) NSArray *inputItems;
!
// Hostアプリ側の処理が完了した時によばれる関数。終了時のBlockつき。これがよばれると、
UIViewControllerは終了する。
- (void)completeRequestReturningItems:(NSArray *)items completionHandler:(void(^)(BOOL
expired))completionHandler;
!
// Hostアプリが処理をキャンセルしたときによばれる
- (void)cancelRequestWithError:(NSError *)error;
!
// Asks the host to open an URL on the extension's behalf
- (void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL
success))completionHandler;
!
@end
How to make App Extension
NSExtensionContextで行われるデータの受け渡し
How to make App Extension
• Extension内でNSExtensionContext経由でopenURLを実
行
- (IBAction)openSomething:(id)sender {
[self.extensionContext
openURL:[NSURL URLWithString:@"http://www.apple.com/"]
completionHandler:nil];
!
}
How to make App Extension - Today
• 「Today Extension」ターゲッ
トを追加すると、
UIViewControllerが自動生成さ
れる。
• Storyboardの利用も可能
How to make App Extension - Today
• Today Extensionでは、表示領域が制限される
• Widgetの縦サイズを変更することは可能だが、デバイ
スの縦サイズが上限となっている
• UIScrollViewはおくべきでない
• Today Extensionではキーボード入力が不可となっている
ため、touch/gestureイベントのみで操作できるように実
装する
How to make App Extension - Share
• 「Share Extension」ター
ゲットを追加すると、
SLComposeServiceViewC
ontrollerが自動生成される
• Share用のDialogが用意さ
れているため、実装が容
易
How to make App Extension - Keyboard
• 「Custom Keyboard」ターゲッ
トを追加すると、
UIInputViewControllerが自動生成
される。
• 独自キーボード領域の描画・
処理を行うための
ViewController
How to make App Extension - Keyboard
• UIInputViewControllerで、独自キーを設定
- (void)viewDidLoad {
[super viewDidLoad];
// 独自キーボードボタンを設定する。
UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 100, 100);
[button addTarget:self action:@selector(inputSomething:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
// 「次のキーボードへ」ボタンを設定する。
self.nextKeyboardButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.nextKeyboardButton setTitle:NSLocalizedString(@"Next Keyboard", @"Title for
'Next Keyboard' button") forState:UIControlStateNormal];
[self.nextKeyboardButton sizeToFit];
self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.nextKeyboardButton addTarget:self action:@selector(advanceToNextInputMode)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.nextKeyboardButton];
}
How to make App Extension - Keyboard
• 文字入力はUIInputViewControllerのtextDocumentProxy
メンバー経由で実行する
-(void)inputSomething:(id)sender{
// 好きな文字を入力する
[self.textDocumentProxy insertText:@"🍎 "];
}
How to share data Container and Extension
• Containing App とExtension間のデータをどのように共
有すべきか
• 今までのアプリ間データ共有のKeychainも使えます
が、もっといい仕組みが用意されています。
How to share data Container and Extension
• Shared Container
App Group and Shared Container
• App Groupとは
• iOS8から導入された、アプリ間のデータ共有システ
ム
• App Groupを設定することによって、Shared
Containerが利用可能となる
App Groupの設定
• iOS Dev CenterでGroup IDを設定
• 例:group.org.toyship.chatter
• その後、プロジェクトのCapabilityで App Groupをonにする
• iOS Dev Centerで設定したGroup IDを選択
• Entitlementファイルが自動生成される
• Container AppとExtensionの両方に対して設定してください
App Group and NSUserDefaults
• App Group設定後、NSUserDafaultsでsharedDefaultsが
利用可能となる
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc]
initWithSuiteName:@"group.org.toyship.kaomoji"];
NSString* strValue = [sharedDefaults valueForKey:@"Neko"];
KeychainとApp Groupの比較
• 対応OSバージョンが異なる
• App Groupは8.0以降
• 保存データの柔軟性
• App Groupでは、NSUserDefaults、CoreData、ファイルが対応可能
• 情報を共有できるアプリの範囲が制限できる
• Keychainの場合には、同じベンダーのすべてのアプリで共有できる
ことになるが、App Groupの場合には共有できる範囲を制限できる
How to share codes between Container and
Extension
• Containing AppとExtensionでソースコードを共有する
には
How to share codes between Container and
Extension
• 共用のフレームワークとして、Embedded Frameworks
を作ることができる。
• ただし、このフレームワークはContainer Appと
Extensionの間の共有しかできず、他のアプリなどで
は使えない。
• Extensionで使えないコードはEmbedded Frameworks
の中でも使えない。
Information
• Extensionは、現時点ではまだ不安定な点もあり、実装
をすすめる際にはそれに留意する必要があります
Information - NSLog
• Extensionは別プロセスになっており、DebuggerがAttach
Processできていないため、NSLogが出力されない
• 下記の情報では成功した人もいるようです
• http://stackoverflow.com/questions/24031612/how-to-
debug-ios-8-extensions-with-nslog?rq=1
!
Information - Notify to users
• 実際にExtension実装をしても、ユーザー環境でonにさ
れないとExtensionが使われない。
• on/offの設定がわかりにくく、せっかくExtensionを実
装してもユーザーに気がついてもらえない可能性が
ある。
Fin

Contenu connexe

Tendances

6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方Hiramatsu Ryosuke
 
Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)Yoshiki Ushida
 
Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方Makoto Ito
 
dotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみた
dotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみたdotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみた
dotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみたNobutaka OSHIRO
 
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法アシアル株式会社
 
Using the Fragments(Android)
Using the Fragments(Android)Using the Fragments(Android)
Using the Fragments(Android)Teruaki Kinoshita
 
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことアプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことleverages_event
 
Google Play Developer APIを使ってみた
Google Play Developer APIを使ってみたGoogle Play Developer APIを使ってみた
Google Play Developer APIを使ってみたshinya sakemoto
 
Everyplayで遊んでみよう1
Everyplayで遊んでみよう1Everyplayで遊んでみよう1
Everyplayで遊んでみよう1Makoto Sugano
 
Android pieの新機能紹介
Android pieの新機能紹介Android pieの新機能紹介
Android pieの新機能紹介Akira SUGIMOTO
 

Tendances (14)

6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方6秒動画アプリ Vineの作り方
6秒動画アプリ Vineの作り方
 
Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)
 
Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方Unity In App Purchase (IAP)の使い方
Unity In App Purchase (IAP)の使い方
 
dotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみた
dotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみたdotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみた
dotcle 経験0から Meteor iOS アプリを2ヶ月半で作ってリリースしてみた
 
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法最新UIフレームワーク Onsen UI2でカッコイイWordPress連携アプリを作る方法
最新UIフレームワーク Onsen UI2で カッコイイWordPress連携アプリを作る方法
 
Prott for iOS
Prott for iOSPrott for iOS
Prott for iOS
 
Using the Fragments(Android)
Using the Fragments(Android)Using the Fragments(Android)
Using the Fragments(Android)
 
mBaaS/C4SA howto
mBaaS/C4SA howtomBaaS/C4SA howto
mBaaS/C4SA howto
 
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことアプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のこと
 
Google Play Developer APIを使ってみた
Google Play Developer APIを使ってみたGoogle Play Developer APIを使ってみた
Google Play Developer APIを使ってみた
 
Android Hacks - Hack8
Android Hacks - Hack8Android Hacks - Hack8
Android Hacks - Hack8
 
Everyplayで遊んでみよう1
Everyplayで遊んでみよう1Everyplayで遊んでみよう1
Everyplayで遊んでみよう1
 
Android pieの新機能紹介
Android pieの新機能紹介Android pieの新機能紹介
Android pieの新機能紹介
 
UIElements+UI BuilderでEditor拡張を作ろう
UIElements+UI BuilderでEditor拡張を作ろうUIElements+UI BuilderでEditor拡張を作ろう
UIElements+UI BuilderでEditor拡張を作ろう
 

En vedette

iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までYuki Tanabe
 
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
Swift - Result&lt;t>型で結果を返すのは邪道か,王道かSwift - Result&lt;t>型で結果を返すのは邪道か,王道か
Swift - Result&lt;t>型で結果を返すのは邪道か,王道かYuichi Yoshida
 
RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6Yuta Hoshino
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテストYoichiro Sakurai
 
Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたShigeki Yamato
 
iOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtipsiOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtips今城 善矩
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話shinnosuke kugimiya
 
ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用Fumiya Sakai
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くTakao Sumitomo
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜Takao Sumitomo
 
iOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotipsiOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotipsYusuke Kita
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するTomoki Hasegawa
 
テストの種類とBDD #33testing
テストの種類とBDD #33testingテストの種類とBDD #33testing
テストの種類とBDD #33testingKoji Hasegawa
 
中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>
中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>
中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>株式会社メタップスホールディングス
 
Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化健一 辰濱
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜Shuichi Tsutsumi
 
User Scenario based UI testing with KIF
User Scenario based UI testing with KIFUser Scenario based UI testing with KIF
User Scenario based UI testing with KIFYusuke Kita
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)将之 小野
 

En vedette (20)

iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
 
iOS extension
iOS extensioniOS extension
iOS extension
 
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
Swift - Result&lt;t>型で結果を返すのは邪道か,王道かSwift - Result&lt;t>型で結果を返すのは邪道か,王道か
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
 
RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6RealmとApp Extensionのガイダンス/Realm meetup vol.6
RealmとApp Extensionのガイダンス/Realm meetup vol.6
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 
Google Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみたGoogle Maps を使ったアプリを作ってみた
Google Maps を使ったアプリを作ってみた
 
iOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtipsiOSアプリ開発の現場で訊いてきたtips
iOSアプリ開発の現場で訊いてきたtips
 
KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話KotlinつかってQiitaクライアント作った時の話
KotlinつかってQiitaクライアント作った時の話
 
ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用ハンドメイドカレンダー第15回potatotips用
ハンドメイドカレンダー第15回potatotips用
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗く
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜
 
Unity testtool
Unity testtoolUnity testtool
Unity testtool
 
iOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotipsiOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotips
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化する
 
テストの種類とBDD #33testing
テストの種類とBDD #33testingテストの種類とBDD #33testing
テストの種類とBDD #33testing
 
中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>
中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>
中国アプリ市場に進出する際に必ず知っておきたい情報まとめ<2014年最新版>
 
Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化
 
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜
 
User Scenario based UI testing with KIF
User Scenario based UI testing with KIFUser Scenario based UI testing with KIF
User Scenario based UI testing with KIF
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
 

Similaire à App extension for iOS

小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変えるHiroto Igarashi
 
[20140625]wwdc2014 feedback
[20140625]wwdc2014 feedback[20140625]wwdc2014 feedback
[20140625]wwdc2014 feedbackVOYAGE GROUP
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向Tsutomu Ogasawara
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshopDaisuke Sugai
 
できる!スマホアプリ:Webからはじまるアプリ
できる!スマホアプリ:Webからはじまるアプリできる!スマホアプリ:Webからはじまるアプリ
できる!スマホアプリ:WebからはじまるアプリMasami Yabushita
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebKensaku Komatsu
 
NET MAUI for .NET 7 for iOS, Android app development
 NET MAUI for .NET 7 for iOS, Android app development  NET MAUI for .NET 7 for iOS, Android app development
NET MAUI for .NET 7 for iOS, Android app development Shotaro Suzuki
 
UI/UX に影響の大きい watchOS 2 の新機能 3つ
UI/UX に影響の大きい watchOS 2 の新機能 3つUI/UX に影響の大きい watchOS 2 の新機能 3つ
UI/UX に影響の大きい watchOS 2 の新機能 3つShuichi Tsutsumi
 
Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜
Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜
Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜Shuichi Tsutsumi
 
20150622 Adobe Analytics
20150622 Adobe Analytics20150622 Adobe Analytics
20150622 Adobe AnalyticsKeisuke Anzai
 
Meetup tokyo.20120924
Meetup tokyo.20120924Meetup tokyo.20120924
Meetup tokyo.20120924Kosuke Isobe
 
iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -Toshiyuki Hirata
 
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015Rikitake Oohashi
 
AppleWatch発売!Apple Watch WatchKit勉強会-Notification
AppleWatch発売!Apple Watch WatchKit勉強会-NotificationAppleWatch発売!Apple Watch WatchKit勉強会-Notification
AppleWatch発売!Apple Watch WatchKit勉強会-NotificationHiroaki Kaneda
 

Similaire à App extension for iOS (20)

小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える
 
[20140625]wwdc2014 feedback
[20140625]wwdc2014 feedback[20140625]wwdc2014 feedback
[20140625]wwdc2014 feedback
 
DevLOVE iPhoneアプリ勉強会
DevLOVE iPhoneアプリ勉強会DevLOVE iPhoneアプリ勉強会
DevLOVE iPhoneアプリ勉強会
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
Pivotal Tracker概略
Pivotal Tracker概略Pivotal Tracker概略
Pivotal Tracker概略
 
Wankuma0402
Wankuma0402Wankuma0402
Wankuma0402
 
できる!スマホアプリ:Webからはじまるアプリ
できる!スマホアプリ:Webからはじまるアプリできる!スマホアプリ:Webからはじまるアプリ
できる!スマホアプリ:Webからはじまるアプリ
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWeb
 
NET MAUI for .NET 7 for iOS, Android app development
 NET MAUI for .NET 7 for iOS, Android app development  NET MAUI for .NET 7 for iOS, Android app development
NET MAUI for .NET 7 for iOS, Android app development
 
UI/UX に影響の大きい watchOS 2 の新機能 3つ
UI/UX に影響の大きい watchOS 2 の新機能 3つUI/UX に影響の大きい watchOS 2 の新機能 3つ
UI/UX に影響の大きい watchOS 2 の新機能 3つ
 
Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜
Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜
Audio Unit Extensions 〜オーディオエフェクトのアプリ間共有〜
 
20150622 Adobe Analytics
20150622 Adobe Analytics20150622 Adobe Analytics
20150622 Adobe Analytics
 
Web Intents入門
Web Intents入門Web Intents入門
Web Intents入門
 
Meetup tokyo.20120924
Meetup tokyo.20120924Meetup tokyo.20120924
Meetup tokyo.20120924
 
iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -
 
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015
モバイルファースト時代のクラウドネイティブアーキテクチャ JAWS DAYS 2015
 
AppleWatch発売!Apple Watch WatchKit勉強会-Notification
AppleWatch発売!Apple Watch WatchKit勉強会-NotificationAppleWatch発売!Apple Watch WatchKit勉強会-Notification
AppleWatch発売!Apple Watch WatchKit勉強会-Notification
 
Facebook Night vol. 6
Facebook Night vol. 6Facebook Night vol. 6
Facebook Night vol. 6
 

Plus de toyship

Time for Xcode Behavior
Time for Xcode BehaviorTime for Xcode Behavior
Time for Xcode Behaviortoyship
 
Notifications in iOS10
Notifications in iOS10Notifications in iOS10
Notifications in iOS10toyship
 
Universal Link
Universal LinkUniversal Link
Universal Linktoyship
 
Can we live in a pure Swift world?
Can we live in a pure Swift world?Can we live in a pure Swift world?
Can we live in a pure Swift world?toyship
 
Swift Protocol and Selector
Swift Protocol and SelectorSwift Protocol and Selector
Swift Protocol and Selectortoyship
 
What's new Swift3
What's new Swift3What's new Swift3
What's new Swift3toyship
 
Xcode7時代のアプリ配布
Xcode7時代のアプリ配布Xcode7時代のアプリ配布
Xcode7時代のアプリ配布toyship
 
My first tvOS
My first tvOSMy first tvOS
My first tvOStoyship
 
3D touch for iOS
3D touch for iOS3D touch for iOS
3D touch for iOStoyship
 
Contents blocker on iOS9
Contents blocker on iOS9Contents blocker on iOS9
Contents blocker on iOS9toyship
 
Embedded framework and so on
Embedded framework and so onEmbedded framework and so on
Embedded framework and so ontoyship
 
はじめてのWKInterfaceController
はじめてのWKInterfaceControllerはじめてのWKInterfaceController
はじめてのWKInterfaceControllertoyship
 
サーバーからiOSアプリを変更する
サーバーからiOSアプリを変更するサーバーからiOSアプリを変更する
サーバーからiOSアプリを変更するtoyship
 
Xcode bot
Xcode botXcode bot
Xcode bottoyship
 
AVSpeechSynthesizerとロケール
AVSpeechSynthesizerとロケールAVSpeechSynthesizerとロケール
AVSpeechSynthesizerとロケールtoyship
 

Plus de toyship (15)

Time for Xcode Behavior
Time for Xcode BehaviorTime for Xcode Behavior
Time for Xcode Behavior
 
Notifications in iOS10
Notifications in iOS10Notifications in iOS10
Notifications in iOS10
 
Universal Link
Universal LinkUniversal Link
Universal Link
 
Can we live in a pure Swift world?
Can we live in a pure Swift world?Can we live in a pure Swift world?
Can we live in a pure Swift world?
 
Swift Protocol and Selector
Swift Protocol and SelectorSwift Protocol and Selector
Swift Protocol and Selector
 
What's new Swift3
What's new Swift3What's new Swift3
What's new Swift3
 
Xcode7時代のアプリ配布
Xcode7時代のアプリ配布Xcode7時代のアプリ配布
Xcode7時代のアプリ配布
 
My first tvOS
My first tvOSMy first tvOS
My first tvOS
 
3D touch for iOS
3D touch for iOS3D touch for iOS
3D touch for iOS
 
Contents blocker on iOS9
Contents blocker on iOS9Contents blocker on iOS9
Contents blocker on iOS9
 
Embedded framework and so on
Embedded framework and so onEmbedded framework and so on
Embedded framework and so on
 
はじめてのWKInterfaceController
はじめてのWKInterfaceControllerはじめてのWKInterfaceController
はじめてのWKInterfaceController
 
サーバーからiOSアプリを変更する
サーバーからiOSアプリを変更するサーバーからiOSアプリを変更する
サーバーからiOSアプリを変更する
 
Xcode bot
Xcode botXcode bot
Xcode bot
 
AVSpeechSynthesizerとロケール
AVSpeechSynthesizerとロケールAVSpeechSynthesizerとロケール
AVSpeechSynthesizerとロケール
 

Dernier

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 

Dernier (9)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 

App extension for iOS

  • 3. Agenda • About • What is App Extension • How to make App Extension • How to share data Container and Extension • App Group and Shared Container • How to share codes between Container and Extension • Information
  • 4. About • @TachibanaKaoru • 渋谷のgenesix(VOYAGE GROUP)という会社で iOS エンジニアをしています。 • Blog : http://www.toyship.org/ • WWDCの参加は2010が最後でした。 • それ以来行けていません……。
  • 5. What is App Extension • iOS8から導入された、アプリ間の連携の仕組み。 • それに加え、Notification Centerに表示するWidget機 能やサードパーティ製キーボードも含まれています • 今日はそれぞれのApp Extensionの詳細には踏み込ま ず、App Extension全体に関連する項目を中心にすすめ ます
  • 6. What is App Extension • App Extensions • Today (iOS/OS X) • Share (iOS/OS X) • Action (iOS/OS X) • Photo Editing (iOS) • Finder (OS X) • Storage Provider (iOS) • Custom keyboard (iOS)
  • 7. What is App Extension • App Extensions • Today (iOS/OS X) • Share (iOS/OS X) • Action (iOS/OS X) • Photo Editing (iOS) • Finder (OS X) • Storage Provider (iOS) • Custom keyboard (iOS)
  • 8. What is App Extension • App Extensions • Today (iOS/OS X) • Share (iOS/OS X) • Action (iOS/OS X) • Photo Editing (iOS) • Finder (OS X) • Storage Provider (iOS) • Custom keyboard (iOS)
  • 9. What is App Extension • App Extensions • Today (iOS/OS X) • Share (iOS/OS X) • Action (iOS/OS X) • Photo Editing (iOS) • Finder (OS X) • Storage Provider (iOS) • Custom keyboard (iOS)
  • 10. What is App Extension • App Extensions • Today (iOS/OS X) • Share (iOS/OS X) • Action (iOS/OS X) • Photo Editing (iOS) • Finder (OS X) • Storage Provider (iOS) • Custom keyboard (iOS)
  • 11. How to make App Extension • Extensionは、アプリのターゲットとして追加される • ExtensionはContaining Appに含まれて単体でリリースす ることはできない
  • 12. How to make App Extension • Extensionは、Contaning Appと同じipaに含まれてリ リースされますが、Extensionは、Contaning Appアプリ としては全く別の存在です。 • アプリから利用するサンドボックス、設定、メモリ 空間、のすべてで異なります。 • (ここのデータ共有する方法については後ほど説明し ます)
  • 13. How to make App Extension • Containing App(本体アプリ)にターゲットを追加 • Extensionごとにターゲットのテンプレートがあるの で、自分の作成したいExtensionを選択
  • 14. How to make App Extension • Extensionをターゲットとして追加すると、自動的に ターゲットのinfo.plistと、Extensionの動作の中心となる ViewControllerクラスのファイルが作成されます。 • 基本的な動作は、そのViewControllerクラスを拡張する のみ
  • 15. How to make App Extension • Extensionは、Containing App(本体アプリ)とは別プロ セスとなるため、独自のBundle Identifierを設定します。 • ただし、Containing AppとExtensionのBundle Identifier は、同じPrefixを持つ必要があります。 • 例:Containing App: org.toyship.chat • 例:Extension:org.toyship.chat.widget
  • 16. How to make App Extension • Extensionで使えないAPIがあります。 • NS_EXTENSION_UNAVAILABLE_IOS + (UIApplication *)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead."); ! @property(nonatomic,assign) id<UIApplicationDelegate> delegate; ! - (void)beginIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS(""); - (void)endIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS(""); - (BOOL)isIgnoringInteractionEvents; ! @property(nonatomic,getter=isIdleTimerDisabled) BOOL idleTimerDisabled; ! - (BOOL)openURL:(NSURL*)url NS_EXTENSION_UNAVAILABLE_IOS(""); - (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);
  • 17. How to make App Extension • UIApplication.h + (UIApplication *)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS("Use view controller based solutions where appropriate instead."); ! @property(nonatomic,assign) id<UIApplicationDelegate> delegate; ! - (void)beginIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS(""); - (void)endIgnoringInteractionEvents NS_EXTENSION_UNAVAILABLE_IOS(""); - (BOOL)isIgnoringInteractionEvents; ! @property(nonatomic,getter=isIdleTimerDisabled) BOOL idleTimerDisabled; ! - (BOOL)openURL:(NSURL*)url NS_EXTENSION_UNAVAILABLE_IOS(""); - (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);
  • 18. How to make App Extension • UIApplication-sharedApplicationが使えない • UIApplication-openURLも使えない • UIViewControllerの新しいpropertyとして、 NSExtensionContextが追加されていて、Extensionではこ のオブジェクトが取得できます。 • このクラスが、Hostアプリ-Extensionのデータのやり取 りやopenURLをサポートします。
  • 19. How to make App Extension • NSExtensionContext @interface NSExtensionContext : NSObject ! // HostアプリからExtensionに渡される入力データ @property(readonly, copy, NS_NONATOMIC_IOSONLY) NSArray *inputItems; ! // Hostアプリ側の処理が完了した時によばれる関数。終了時のBlockつき。これがよばれると、 UIViewControllerは終了する。 - (void)completeRequestReturningItems:(NSArray *)items completionHandler:(void(^)(BOOL expired))completionHandler; ! // Hostアプリが処理をキャンセルしたときによばれる - (void)cancelRequestWithError:(NSError *)error; ! // Asks the host to open an URL on the extension's behalf - (void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler; ! @end
  • 20. How to make App Extension NSExtensionContextで行われるデータの受け渡し
  • 21. How to make App Extension • Extension内でNSExtensionContext経由でopenURLを実 行 - (IBAction)openSomething:(id)sender { [self.extensionContext openURL:[NSURL URLWithString:@"http://www.apple.com/"] completionHandler:nil]; ! }
  • 22. How to make App Extension - Today • 「Today Extension」ターゲッ トを追加すると、 UIViewControllerが自動生成さ れる。 • Storyboardの利用も可能
  • 23. How to make App Extension - Today • Today Extensionでは、表示領域が制限される • Widgetの縦サイズを変更することは可能だが、デバイ スの縦サイズが上限となっている • UIScrollViewはおくべきでない • Today Extensionではキーボード入力が不可となっている ため、touch/gestureイベントのみで操作できるように実 装する
  • 24. How to make App Extension - Share • 「Share Extension」ター ゲットを追加すると、 SLComposeServiceViewC ontrollerが自動生成される • Share用のDialogが用意さ れているため、実装が容 易
  • 25. How to make App Extension - Keyboard • 「Custom Keyboard」ターゲッ トを追加すると、 UIInputViewControllerが自動生成 される。 • 独自キーボード領域の描画・ 処理を行うための ViewController
  • 26. How to make App Extension - Keyboard • UIInputViewControllerで、独自キーを設定 - (void)viewDidLoad { [super viewDidLoad]; // 独自キーボードボタンを設定する。 UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(0, 0, 100, 100); [button addTarget:self action:@selector(inputSomething:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; // 「次のキーボードへ」ボタンを設定する。 self.nextKeyboardButton = [UIButton buttonWithType:UIButtonTypeSystem]; [self.nextKeyboardButton setTitle:NSLocalizedString(@"Next Keyboard", @"Title for 'Next Keyboard' button") forState:UIControlStateNormal]; [self.nextKeyboardButton sizeToFit]; self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = NO; [self.nextKeyboardButton addTarget:self action:@selector(advanceToNextInputMode) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.nextKeyboardButton]; }
  • 27. How to make App Extension - Keyboard • 文字入力はUIInputViewControllerのtextDocumentProxy メンバー経由で実行する -(void)inputSomething:(id)sender{ // 好きな文字を入力する [self.textDocumentProxy insertText:@"🍎 "]; }
  • 28. How to share data Container and Extension • Containing App とExtension間のデータをどのように共 有すべきか • 今までのアプリ間データ共有のKeychainも使えます が、もっといい仕組みが用意されています。
  • 29. How to share data Container and Extension • Shared Container
  • 30. App Group and Shared Container • App Groupとは • iOS8から導入された、アプリ間のデータ共有システ ム • App Groupを設定することによって、Shared Containerが利用可能となる
  • 31. App Groupの設定 • iOS Dev CenterでGroup IDを設定 • 例:group.org.toyship.chatter • その後、プロジェクトのCapabilityで App Groupをonにする • iOS Dev Centerで設定したGroup IDを選択 • Entitlementファイルが自動生成される • Container AppとExtensionの両方に対して設定してください
  • 32. App Group and NSUserDefaults • App Group設定後、NSUserDafaultsでsharedDefaultsが 利用可能となる NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.org.toyship.kaomoji"]; NSString* strValue = [sharedDefaults valueForKey:@"Neko"];
  • 33. KeychainとApp Groupの比較 • 対応OSバージョンが異なる • App Groupは8.0以降 • 保存データの柔軟性 • App Groupでは、NSUserDefaults、CoreData、ファイルが対応可能 • 情報を共有できるアプリの範囲が制限できる • Keychainの場合には、同じベンダーのすべてのアプリで共有できる ことになるが、App Groupの場合には共有できる範囲を制限できる
  • 34. How to share codes between Container and Extension • Containing AppとExtensionでソースコードを共有する には
  • 35. How to share codes between Container and Extension • 共用のフレームワークとして、Embedded Frameworks を作ることができる。 • ただし、このフレームワークはContainer Appと Extensionの間の共有しかできず、他のアプリなどで は使えない。 • Extensionで使えないコードはEmbedded Frameworks の中でも使えない。
  • 37. Information - NSLog • Extensionは別プロセスになっており、DebuggerがAttach Processできていないため、NSLogが出力されない • 下記の情報では成功した人もいるようです • http://stackoverflow.com/questions/24031612/how-to- debug-ios-8-extensions-with-nslog?rq=1 !
  • 38. Information - Notify to users • 実際にExtension実装をしても、ユーザー環境でonにさ れないとExtensionが使われない。 • on/offの設定がわかりにくく、せっかくExtensionを実 装してもユーザーに気がついてもらえない可能性が ある。
  • 39. Fin