SlideShare a Scribd company logo
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

More Related Content

What's hot

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連携アプリを作る方法
アシアル株式会社
 
Prott for iOS
Prott for iOSPrott for iOS
Prott for iOS
Seiya Shimokawa
 
Using the Fragments(Android)
Using the Fragments(Android)Using the Fragments(Android)
Using the Fragments(Android)
Teruaki Kinoshita
 
mBaaS/C4SA howto
mBaaS/C4SA howtomBaaS/C4SA howto
mBaaS/C4SA howto
史識 川原
 
アプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のことアプリリリース後に後悔しないための20のこと
アプリリリース後に後悔しないための20のこと
leverages_event
 
Google Play Developer APIを使ってみた
Google Play Developer APIを使ってみたGoogle Play Developer APIを使ってみた
Google Play Developer APIを使ってみた
shinya sakemoto
 
Android Hacks - Hack8
Android Hacks - Hack8Android Hacks - Hack8
Android Hacks - Hack8
Masanori Ohkawara
 
Everyplayで遊んでみよう1
Everyplayで遊んでみよう1Everyplayで遊んでみよう1
Everyplayで遊んでみよう1
Makoto Sugano
 
Android pieの新機能紹介
Android pieの新機能紹介Android pieの新機能紹介
Android pieの新機能紹介
Akira SUGIMOTO
 
UIElements+UI BuilderでEditor拡張を作ろう
UIElements+UI BuilderでEditor拡張を作ろうUIElements+UI BuilderでEditor拡張を作ろう
UIElements+UI BuilderでEditor拡張を作ろう
Unity Technologies Japan K.K.
 

What's hot (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拡張を作ろう
 

Viewers also liked

iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までYuki Tanabe
 
iOS extension
iOS extensioniOS extension
iOS extension
Pin Shih Wang
 
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.6
Yuta 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
 
Unity testtool
Unity testtoolUnity testtool
Unity testtool
大介 束田
 
iOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotipsiOSにおけるUIテスト@potetotips
iOSにおけるUIテスト@potetotips
Yusuke Kita
 
AppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化するAppStore申請を一式まるっと自動化する
AppStore申請を一式まるっと自動化する
Tomoki Hasegawa
 
テストの種類とBDD #33testing
テストの種類とBDD #33testingテストの種類とBDD #33testing
テストの種類とBDD #33testing
Koji 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 KIF
Yusuke Kita
 
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
意外と苦労する、一部の画面のみ ランドスケープ表示を許容する方法 (potatotips 第17回)
将之 小野
 

Viewers also liked (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回)
 

Similar to App extension for iOS

小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える
Hiroto Igarashi
 
[20140625]wwdc2014 feedback
[20140625]wwdc2014 feedback[20140625]wwdc2014 feedback
[20140625]wwdc2014 feedback
VOYAGE 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
 
Pivotal Tracker概略
Pivotal Tracker概略Pivotal Tracker概略
Pivotal Tracker概略
You&I
 
Wankuma0402
Wankuma0402Wankuma0402
Wankuma0402
c-mitsuba
 
できる!スマホアプリ:Webからはじまるアプリ
できる!スマホアプリ:Webからはじまるアプリできる!スマホアプリ:Webからはじまるアプリ
できる!スマホアプリ:WebからはじまるアプリMasami Yabushita
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWeb
Kensaku 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 Analytics
Keisuke Anzai
 
Web Intents入門
Web Intents入門Web Intents入門
Web Intents入門
Shumpei Shiraishi
 
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 2015
Rikitake Oohashi
 
AppleWatch発売!Apple Watch WatchKit勉強会-Notification
AppleWatch発売!Apple Watch WatchKit勉強会-NotificationAppleWatch発売!Apple Watch WatchKit勉強会-Notification
AppleWatch発売!Apple Watch WatchKit勉強会-Notification
Hiroaki Kaneda
 

Similar to 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
 

More from toyship

Time for Xcode Behavior
Time for Xcode BehaviorTime for Xcode Behavior
Time for Xcode Behavior
toyship
 
Notifications in iOS10
Notifications in iOS10Notifications in iOS10
Notifications in iOS10
toyship
 
Universal Link
Universal LinkUniversal Link
Universal Link
toyship
 
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 Selector
toyship
 
What's new Swift3
What's new Swift3What's new Swift3
What's new Swift3
toyship
 
Xcode7時代のアプリ配布
Xcode7時代のアプリ配布Xcode7時代のアプリ配布
Xcode7時代のアプリ配布
toyship
 
My first tvOS
My first tvOSMy first tvOS
My first tvOS
toyship
 
3D touch for iOS
3D touch for iOS3D touch for iOS
3D touch for iOS
toyship
 
Contents blocker on iOS9
Contents blocker on iOS9Contents blocker on iOS9
Contents blocker on iOS9
toyship
 
Embedded framework and so on
Embedded framework and so onEmbedded framework and so on
Embedded framework and so on
toyship
 
はじめてのWKInterfaceController
はじめてのWKInterfaceControllerはじめてのWKInterfaceController
はじめてのWKInterfaceController
toyship
 
サーバーからiOSアプリを変更する
サーバーからiOSアプリを変更するサーバーからiOSアプリを変更する
サーバーからiOSアプリを変更する
toyship
 
Xcode bot
Xcode botXcode bot
Xcode bottoyship
 
AVSpeechSynthesizerとロケール
AVSpeechSynthesizerとロケールAVSpeechSynthesizerとロケール
AVSpeechSynthesizerとロケール
toyship
 

More from 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とロケール
 

Recently uploaded

2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 

Recently uploaded (16)

2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 

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