SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
UIKit 
Getting started with Handoff 
How can I do it? 
Yuichi Yoshida 
Chief engineer, DENSO IT Laboratory, Inc. 
#yidev20140927 
@sonson_twit 
© 2014 Yuichi Yoshida, all rights reserved. Redistribution or public display not permitted without written permission from Yuichi Yoshida.
自己紹介 
2tchの中の人 
• iOS好きです 
• 2tch(2ちゃんねるビューア) 
• iOS SDK Hacksなど 
• 研究 
• コンピュータビジョン 
• 機械学習 
• 研究・開発 
• 画像検索サービス 
• 車向けのサービスやハードウェア
Demo 
2tch version 6.3.1
What is Handoff? 
継続って訳すのやめて欲しい
Handoffの種類 
• Safariを呼ぶ 
• URLを渡すだけ 
• ネイティブアプリケーション 
• 受信側にコードが必要 
• インストールされていれば自動起動する 
• Safariからネイティブアプリケーションを呼ぶ 
• 署名した対応アプリ一覧JSONが必要
?
準備 
• 対応ハードウェアを買う 
• MacBook Air (Mid 2011以降) 
• MacBook Pro (Mid 2012以降) 
• Retina MacBook Pro (全機種) 
• iMac (Late 2012以降) 
• Mac Mini (Mid 2011以降) 
• Mac Pro (Late 2013以降) 
• http://www.ipadmod.netより 
• iOS 
• iPhone 5以降、iPad(第4世代)、iPad Air、iPad mini、iPad 
mini Retinaディスプレイモデル、iPod touch(第5世代)
準備 
• iCloudに登録する 
• Bluetoothをオンにする 
• Wi-Fiをオンにする
準備 
• iCloudに登録する 
• Bluetoothをオンにする 
• Wi-Fiをオンにする
Demo 
Safariで試す
ネイティブアプリからSafariへ 
• とっても簡単 
• NSUserActivityクラス 
• - webpageURL
NSUserActivity 
@interface ViewController () { 
NSUserActivity *_activity; 
} 
@end 
@implementation ViewController 
- (void)viewDidLoad { 
[super viewDidLoad]; 
_activity 
= [[NSUserActivity alloc] 
initWithActivityType:@"com.sonson.HandoffSample"]; 
_activity.webpageURL 
= [NSURL URLWithString:@"http://www.apple.com"]; 
_activity.title = @"Browsing"; 
[_activity becomeCurrent]; 
} 
@end
[_activity becomeCurrent];
[_activity invalidate];
ネイティブアプリケーション 
• Info.plist 
• NSUserActivityTypesに受け取る識別子を追加 
• 逆ドメイン形式 
• com.sonson.HandoffSample 
• UIApplicationDelegate(NSApplicationDelegate) 
• application:willContinueUserActivityWithType: 
• application:didFailToContinueUserActivityWithType:error: 
• application:continueUserActivity:restorationHandler: 
• OSXの場合 
• 署名必須(Developer IDでもよいみたい)
NSUserActivity 
_activity 
= [[NSUserActivity alloc] 
initWithActivityType:@"com.sonson.OSX.HandoffSample"]; 
_activity.title 
= @"Browsing"; 
_activity.userInfo 
= @{@"ImageSize":@(_imageBinary.length)}; 
[_activity becomeCurrent];
UIApplicationDelegate 
- (BOOL)application:(NSApplication *)application 
willContinueUserActivityWithType:(NSString *)activityType { 
if ([activityType isEqualToString:@"com.sonson.OSX.HandoffSample"]) 
return YES; 
return NO; 
} 
- (BOOL)application:(NSApplication *)application 
continueUserActivity:(NSUserActivity *)userActivity 
restorationHandler:(void(^)(NSArray *restorableObjects))handler { 
// Obtained information from userInfo. 
NSNumber *imageSize = userActivity.userInfo[@"ImageSize"]; 
handler(@[]); // restore view controllers 
return YES; 
}
ViewController restoration 
• UIResponder 
• - 新しいデリゲートメソッド 
• - restoreUserActivityState: 
• void(^)(NSArray *restorableObjects) 
• restoreするUIResponderのサブクラスをつっこむ 
• 自動的にrestoreUserActivityState:が呼ばれる 
• 引数はNSUserActivityオブジェクト
Restoration 
- (BOOL)application:(UIApplication *)application continueUserActivity: 
(NSUserActivity *)userActivity 
restorationHandler: 
(void(^)(NSArray *restorableObjects))restorationHandler { 
// get or create view controller objects. 
id viewControllerA = nil; // left pain 
id viewControllerB = nil; // right pain 
// start to restore 
restorationHandler(@[viewControllerA, viewControllerB]); 
return YES; 
} 
@implementation ViewControllerAClass 
- (void)restoreUserActivityState:(NSUserActivity *)activity { 
// restore left pain view using NSUserActivity object 
} 
@end 
@implementation ViewControllerBClass 
- (void)restoreUserActivityState:(NSUserActivity *)activity { 
// restore right pain view using NSUserActivity object 
} 
@end
うまくいかない? 
Bug? 
• 対応機種ですか? 
• iCloudは同じアカウントになっていますか? 
• NSUserActivityのインスタンスはありますか? 
• 他の機器とHandoffが混線していませんか?
Further more, Handoff 
Communicate with.…… 
• ブラウザからHandoff経由でアプリを起動する 
• Webページ閲覧中にiOSデバイスのアプリを起動 
• 3つのデータ送受信 
• userInfo 
• iCloud 
• NSStream
Further more, Handoff 
SafariからのHandoff 
• iOS側のentitlementにサーバのドメインを追加 
• JSONを作る 
• JSONに署名する 
• iOSの持つリストに入ってる認証局の証明書が必要 
• 実はApple自身が認証局になってる 
• なのでAppleの開発者の署名でおk 
• httpsで通信できるサーバにJSONを置く 
• ルートに置く必要がある
Further more, Handoff 
大きなデータはどうするか? 
• userInfo 
• NSArray, NSData, NSDate, NSDictionary, NSNull, 
NSNumber, NSSet, NSString, NSURL 
• iCloud 
• UIDocumentが自動的にNSUserActivityを生成 
• CFBundleDocumentTypes 
• NSUbiquitousDocumentUserActivityType 
• NSStream 
• 簡単
Further more, Handoff 
送信側 
_activity 
= [[NSUserActivity alloc] 
initWithActivityType:@"com.sonson.OSX.HandoffSample"]; 
_activity.title 
= @"Browsing"; 
_activity.userInfo 
= @{@"ImageSize":@(_imageBinary.length)}; 
_activity.supportsContinuationStreams = YES; 
_activity.delegate = self; 
[_activity becomeCurrent];
Further more, Handoff 
受信側 
- (BOOL)application:(NSApplication *)application 
continueUserActivity:(NSUserActivity *)userActivity 
restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler { 
[userActivity getContinuationStreamsWithCompletionHandler: 
^(NSInputStream *inputStream, NSOutputStream *outputStream, NSError *error) { 
if (error == nil) { 
_inputStream = inputStream; 
_outputStream = outputStream; 
[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
forMode:NSDefaultRunLoopMode]; 
[_outputStream open]; 
[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
forMode:NSDefaultRunLoopMode]; 
[_inputStream open]; 
// communicate... 
} 
else { 
// error handling 
} 
}]; 
return YES; 
}
Further more, Handoff 
NSUserActivityDelegate 
- (void)userActivity:(NSUserActivity *)userActivity 
didReceiveInputStream:(NSInputStream *)inputStream 
outputStream:(NSOutputStream *)outputStream { 
_outputStream = outputStream; 
[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
forMode:NSDefaultRunLoopMode]; 
[_outputStream open]; 
// send data 
}
Demo 
Handoff from Safari 
Send a picture via NSStream
まとめ 
You get to try it. 
• Handoff 
• 使えるデバイスは限定される 
• SafariにURLを渡すHandoff 
• ネイティブアプリケーション同士のHandoff 
• Safariから渡すHandoff 
• Handoffの通信方法
More Information 
Yuichi Yoshida 
http://github.com/sonsongithub/ 
@sonson_twit 
sonson.jp 
http://sonson.jp 
Apple Handoff プログラミングガイド 
https://developer.apple.com/jp/devcenter/ios/library/ 
documentation/HandoffProgrammingGuide.pdf

Weitere ähnliche Inhalte

Was ist angesagt?

SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!Kazumi IWANAGA
 
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」snicker_jp
 
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)rina0521
 
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたい
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたいはじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたい
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたいKazumi IWANAGA
 
障害発生時に抑えておきたい基礎知識
障害発生時に抑えておきたい基礎知識障害発生時に抑えておきたい基礎知識
障害発生時に抑えておきたい基礎知識Kei IWASAKI
 
Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~
Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~
Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~ikikko
 
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成Tomoki Oyamatsu
 
Spring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbcSpring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbcToshiaki Maki
 
Azure Web Apps と Azure Mobile Apps
Azure Web Apps とAzure Mobile AppsAzure Web Apps とAzure Mobile Apps
Azure Web Apps と Azure Mobile Apps Masaki Yamamoto
 
はじめての Rails アプリ開発
はじめての Rails アプリ開発はじめての Rails アプリ開発
はじめての Rails アプリ開発n-fukidome
 
Smart fxでのsocketio活用事例
Smart fxでのsocketio活用事例Smart fxでのsocketio活用事例
Smart fxでのsocketio活用事例剛志 森田
 
Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具Kazuyuki Miyake
 
アプリ開発&チーム管理で 役立った拡張機能
アプリ開発&チーム管理で役立った拡張機能アプリ開発&チーム管理で役立った拡張機能
アプリ開発&チーム管理で 役立った拡張機能Masaki Suzuki
 
開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能Masaki Suzuki
 

Was ist angesagt? (20)

SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!
 
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
 
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
SoftLayerにゅうもん(2016/03/04 SoftLayer勉強会)
 
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたい
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたいはじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたい
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたい
 
Ojag20120811
Ojag20120811Ojag20120811
Ojag20120811
 
障害発生時に抑えておきたい基礎知識
障害発生時に抑えておきたい基礎知識障害発生時に抑えておきたい基礎知識
障害発生時に抑えておきたい基礎知識
 
KINECT de DEPLOY
KINECT de DEPLOYKINECT de DEPLOY
KINECT de DEPLOY
 
React meetup 3_eight
React meetup 3_eightReact meetup 3_eight
React meetup 3_eight
 
さくらのクラウドアップデート情報2016年7月版
さくらのクラウドアップデート情報2016年7月版さくらのクラウドアップデート情報2016年7月版
さくらのクラウドアップデート情報2016年7月版
 
[Dots.]taiga
[Dots.]taiga[Dots.]taiga
[Dots.]taiga
 
OpenShift のある生活
OpenShift のある生活OpenShift のある生活
OpenShift のある生活
 
Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~
Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~
Infrastructure as code ~ ツールスタック / ヌーラボの事例 ~
 
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
 
Spring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbcSpring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbc
 
Azure Web Apps と Azure Mobile Apps
Azure Web Apps とAzure Mobile AppsAzure Web Apps とAzure Mobile Apps
Azure Web Apps と Azure Mobile Apps
 
はじめての Rails アプリ開発
はじめての Rails アプリ開発はじめての Rails アプリ開発
はじめての Rails アプリ開発
 
Smart fxでのsocketio活用事例
Smart fxでのsocketio活用事例Smart fxでのsocketio活用事例
Smart fxでのsocketio活用事例
 
Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具Face APIで開発する時に使っている7つの道具
Face APIで開発する時に使っている7つの道具
 
アプリ開発&チーム管理で 役立った拡張機能
アプリ開発&チーム管理で役立った拡張機能アプリ開発&チーム管理で役立った拡張機能
アプリ開発&チーム管理で 役立った拡張機能
 
開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能開発チーム管理で役立ったVSCode拡張機能
開発チーム管理で役立ったVSCode拡張機能
 

Andere mochten auch

#yidev 横浜 iPhone 勉強会 - 第16回 オープニング
#yidev 横浜 iPhone 勉強会 - 第16回 オープニング#yidev 横浜 iPhone 勉強会 - 第16回 オープニング
#yidev 横浜 iPhone 勉強会 - 第16回 オープニングTomohiro Kumagai
 
Uiテスト@yidev
Uiテスト@yidevUiテスト@yidev
Uiテスト@yidevYusuke Kita
 
Watch kit解説と実際のtips
Watch kit解説と実際のtipsWatch kit解説と実際のtips
Watch kit解説と実際のtips篤 富田
 
Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集Yuichi Yoshida
 
Getting started with CloudKit
Getting started with CloudKitGetting started with CloudKit
Getting started with CloudKitYuichi Yoshida
 
HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料
HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料
HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料アシアル株式会社
 
Developing better debug_components
Developing better debug_componentsDeveloping better debug_components
Developing better debug_componentsTomoaki Imai
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
クライアント側でつかまえて
クライアント側でつかまえてクライアント側でつかまえて
クライアント側でつかまえてKaora Shibacaki
 
UIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐUIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐYuichi Yoshida
 

Andere mochten auch (11)

#yidev 横浜 iPhone 勉強会 - 第16回 オープニング
#yidev 横浜 iPhone 勉強会 - 第16回 オープニング#yidev 横浜 iPhone 勉強会 - 第16回 オープニング
#yidev 横浜 iPhone 勉強会 - 第16回 オープニング
 
Uiテスト@yidev
Uiテスト@yidevUiテスト@yidev
Uiテスト@yidev
 
Watch kit解説と実際のtips
Watch kit解説と実際のtipsWatch kit解説と実際のtips
Watch kit解説と実際のtips
 
Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集Handoffは動かない〜これから役立たないバッドノウハウ集
Handoffは動かない〜これから役立たないバッドノウハウ集
 
Debug Hacks - 第4回つくらぐ勉強会
Debug Hacks - 第4回つくらぐ勉強会Debug Hacks - 第4回つくらぐ勉強会
Debug Hacks - 第4回つくらぐ勉強会
 
Getting started with CloudKit
Getting started with CloudKitGetting started with CloudKit
Getting started with CloudKit
 
HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料
HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料
HTML5×Monacaプログラミング教育事例セミナー・ワークショップ資料
 
Developing better debug_components
Developing better debug_componentsDeveloping better debug_components
Developing better debug_components
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
クライアント側でつかまえて
クライアント側でつかまえてクライアント側でつかまえて
クライアント側でつかまえて
 
UIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐUIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐ
 

Ähnlich wie Getting started with Handoff

勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発Kazuki Nakajima
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdkKazuki Nakajima
 
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフラインWebフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフラインShumpei Shiraishi
 
関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」Noritada Shimizu
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDCNobuhiro Sue
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Yoshito Tabuchi
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebKensaku Komatsu
 
次期Office製品群の新しい開発モデルの解説
次期Office製品群の新しい開発モデルの解説次期Office製品群の新しい開発モデルの解説
次期Office製品群の新しい開発モデルの解説kumo2010
 
ボット開発でも DevOps! BotBuilder のテスト手法
ボット開発でも DevOps! BotBuilder のテスト手法ボット開発でも DevOps! BotBuilder のテスト手法
ボット開発でも DevOps! BotBuilder のテスト手法Kenichiro Nakamura
 
JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE 陽平 山口
 
IDaaSにSign in with Appleをつないでみた
IDaaSにSign in with AppleをつないでみたIDaaSにSign in with Appleをつないでみた
IDaaSにSign in with AppleをつないでみたNaohiro Fujie
 
Introduction to application architecture on asp.net mvc
Introduction to application architecture on asp.net mvcIntroduction to application architecture on asp.net mvc
Introduction to application architecture on asp.net mvcAtsushi Fukui
 
Data API + AWS = (CMS どうでしょう 札幌編)
Data API + AWS =  (CMS どうでしょう 札幌編)Data API + AWS =  (CMS どうでしょう 札幌編)
Data API + AWS = (CMS どうでしょう 札幌編)Yuji Takayama
 
iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜Yusuke SAITO
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向Tsutomu Ogasawara
 
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシングAWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング江藤 武司
 

Ähnlich wie Getting started with Handoff (20)

Mobile Web
Mobile WebMobile Web
Mobile Web
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 
Handoff from Safari
Handoff from SafariHandoff from Safari
Handoff from Safari
 
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフラインWebフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
Webフロントエンド開発の最新トレンド - HTML5, モバイル, オフライン
 
関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」
 
iOS WebView App
iOS WebView AppiOS WebView App
iOS WebView App
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWeb
 
次期Office製品群の新しい開発モデルの解説
次期Office製品群の新しい開発モデルの解説次期Office製品群の新しい開発モデルの解説
次期Office製品群の新しい開発モデルの解説
 
ボット開発でも DevOps! BotBuilder のテスト手法
ボット開発でも DevOps! BotBuilder のテスト手法ボット開発でも DevOps! BotBuilder のテスト手法
ボット開発でも DevOps! BotBuilder のテスト手法
 
JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 Technical Deep DIVE
 
IDaaSにSign in with Appleをつないでみた
IDaaSにSign in with AppleをつないでみたIDaaSにSign in with Appleをつないでみた
IDaaSにSign in with Appleをつないでみた
 
Introduction to application architecture on asp.net mvc
Introduction to application architecture on asp.net mvcIntroduction to application architecture on asp.net mvc
Introduction to application architecture on asp.net mvc
 
Data API + AWS = (CMS どうでしょう 札幌編)
Data API + AWS =  (CMS どうでしょう 札幌編)Data API + AWS =  (CMS どうでしょう 札幌編)
Data API + AWS = (CMS どうでしょう 札幌編)
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜iPhoneアプリ開発の歩き方〜Swift編〜
iPhoneアプリ開発の歩き方〜Swift編〜
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向
 
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシングAWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
 

Mehr von Yuichi Yoshida

Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究Yuichi Yoshida
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムYuichi Yoshida
 
Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談Yuichi Yoshida
 
Swift - Result<t>型で結果を返すのは邪道か,王道か
Swift - Result<t>型で結果を返すのは邪道か,王道かSwift - Result<t>型で結果を返すのは邪道か,王道か
Swift - Result<t>型で結果を返すのは邪道か,王道かYuichi Yoshida
 
Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt Yuichi Yoshida
 
キーボードアプリとSketchのススメ
キーボードアプリとSketchのススメキーボードアプリとSketchのススメ
キーボードアプリとSketchのススメYuichi Yoshida
 
UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説Yuichi Yoshida
 
64bit化してみた話
64bit化してみた話64bit化してみた話
64bit化してみた話Yuichi Yoshida
 

Mehr von Yuichi Yoshida (11)

Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究Halide, Darkroom - 並列化のためのソフトウェア・研究
Halide, Darkroom - 並列化のためのソフトウェア・研究
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
 
Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談Swiftで多層型で戻り値を返すことの是非と雑談
Swiftで多層型で戻り値を返すことの是非と雑談
 
Swift - Result<t>型で結果を返すのは邪道か,王道か
Swift - Result<t>型で結果を返すのは邪道か,王道かSwift - Result<t>型で結果を返すのは邪道か,王道か
Swift - Result<t>型で結果を返すのは邪道か,王道か
 
Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt Machine Learning : The high interest credit card of technical debt
Machine Learning : The high interest credit card of technical debt
 
キーボードアプリとSketchのススメ
キーボードアプリとSketchのススメキーボードアプリとSketchのススメ
キーボードアプリとSketchのススメ
 
UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説UZTextView, UZMultilayeredPopoverControllerの解説
UZTextView, UZMultilayeredPopoverControllerの解説
 
64bit化してみた話
64bit化してみた話64bit化してみた話
64bit化してみた話
 
Gitのすすめ
GitのすすめGitのすすめ
Gitのすすめ
 

Kürzlich hochgeladen

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 

Kürzlich hochgeladen (10)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

Getting started with Handoff

  • 1. UIKit Getting started with Handoff How can I do it? Yuichi Yoshida Chief engineer, DENSO IT Laboratory, Inc. #yidev20140927 @sonson_twit © 2014 Yuichi Yoshida, all rights reserved. Redistribution or public display not permitted without written permission from Yuichi Yoshida.
  • 2. 自己紹介 2tchの中の人 • iOS好きです • 2tch(2ちゃんねるビューア) • iOS SDK Hacksなど • 研究 • コンピュータビジョン • 機械学習 • 研究・開発 • 画像検索サービス • 車向けのサービスやハードウェア
  • 4. What is Handoff? 継続って訳すのやめて欲しい
  • 5. Handoffの種類 • Safariを呼ぶ • URLを渡すだけ • ネイティブアプリケーション • 受信側にコードが必要 • インストールされていれば自動起動する • Safariからネイティブアプリケーションを呼ぶ • 署名した対応アプリ一覧JSONが必要
  • 6.
  • 7.
  • 8.
  • 9.
  • 10. 準備 • 対応ハードウェアを買う • MacBook Air (Mid 2011以降) • MacBook Pro (Mid 2012以降) • Retina MacBook Pro (全機種) • iMac (Late 2012以降) • Mac Mini (Mid 2011以降) • Mac Pro (Late 2013以降) • http://www.ipadmod.netより • iOS • iPhone 5以降、iPad(第4世代)、iPad Air、iPad mini、iPad mini Retinaディスプレイモデル、iPod touch(第5世代)
  • 11. 準備 • iCloudに登録する • Bluetoothをオンにする • Wi-Fiをオンにする
  • 12. 準備 • iCloudに登録する • Bluetoothをオンにする • Wi-Fiをオンにする
  • 14. ネイティブアプリからSafariへ • とっても簡単 • NSUserActivityクラス • - webpageURL
  • 15. NSUserActivity @interface ViewController () { NSUserActivity *_activity; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _activity = [[NSUserActivity alloc] initWithActivityType:@"com.sonson.HandoffSample"]; _activity.webpageURL = [NSURL URLWithString:@"http://www.apple.com"]; _activity.title = @"Browsing"; [_activity becomeCurrent]; } @end
  • 16.
  • 19. ネイティブアプリケーション • Info.plist • NSUserActivityTypesに受け取る識別子を追加 • 逆ドメイン形式 • com.sonson.HandoffSample • UIApplicationDelegate(NSApplicationDelegate) • application:willContinueUserActivityWithType: • application:didFailToContinueUserActivityWithType:error: • application:continueUserActivity:restorationHandler: • OSXの場合 • 署名必須(Developer IDでもよいみたい)
  • 20. NSUserActivity _activity = [[NSUserActivity alloc] initWithActivityType:@"com.sonson.OSX.HandoffSample"]; _activity.title = @"Browsing"; _activity.userInfo = @{@"ImageSize":@(_imageBinary.length)}; [_activity becomeCurrent];
  • 21. UIApplicationDelegate - (BOOL)application:(NSApplication *)application willContinueUserActivityWithType:(NSString *)activityType { if ([activityType isEqualToString:@"com.sonson.OSX.HandoffSample"]) return YES; return NO; } - (BOOL)application:(NSApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))handler { // Obtained information from userInfo. NSNumber *imageSize = userActivity.userInfo[@"ImageSize"]; handler(@[]); // restore view controllers return YES; }
  • 22. ViewController restoration • UIResponder • - 新しいデリゲートメソッド • - restoreUserActivityState: • void(^)(NSArray *restorableObjects) • restoreするUIResponderのサブクラスをつっこむ • 自動的にrestoreUserActivityState:が呼ばれる • 引数はNSUserActivityオブジェクト
  • 23. Restoration - (BOOL)application:(UIApplication *)application continueUserActivity: (NSUserActivity *)userActivity restorationHandler: (void(^)(NSArray *restorableObjects))restorationHandler { // get or create view controller objects. id viewControllerA = nil; // left pain id viewControllerB = nil; // right pain // start to restore restorationHandler(@[viewControllerA, viewControllerB]); return YES; } @implementation ViewControllerAClass - (void)restoreUserActivityState:(NSUserActivity *)activity { // restore left pain view using NSUserActivity object } @end @implementation ViewControllerBClass - (void)restoreUserActivityState:(NSUserActivity *)activity { // restore right pain view using NSUserActivity object } @end
  • 24. うまくいかない? Bug? • 対応機種ですか? • iCloudは同じアカウントになっていますか? • NSUserActivityのインスタンスはありますか? • 他の機器とHandoffが混線していませんか?
  • 25. Further more, Handoff Communicate with.…… • ブラウザからHandoff経由でアプリを起動する • Webページ閲覧中にiOSデバイスのアプリを起動 • 3つのデータ送受信 • userInfo • iCloud • NSStream
  • 26. Further more, Handoff SafariからのHandoff • iOS側のentitlementにサーバのドメインを追加 • JSONを作る • JSONに署名する • iOSの持つリストに入ってる認証局の証明書が必要 • 実はApple自身が認証局になってる • なのでAppleの開発者の署名でおk • httpsで通信できるサーバにJSONを置く • ルートに置く必要がある
  • 27. Further more, Handoff 大きなデータはどうするか? • userInfo • NSArray, NSData, NSDate, NSDictionary, NSNull, NSNumber, NSSet, NSString, NSURL • iCloud • UIDocumentが自動的にNSUserActivityを生成 • CFBundleDocumentTypes • NSUbiquitousDocumentUserActivityType • NSStream • 簡単
  • 28. Further more, Handoff 送信側 _activity = [[NSUserActivity alloc] initWithActivityType:@"com.sonson.OSX.HandoffSample"]; _activity.title = @"Browsing"; _activity.userInfo = @{@"ImageSize":@(_imageBinary.length)}; _activity.supportsContinuationStreams = YES; _activity.delegate = self; [_activity becomeCurrent];
  • 29. Further more, Handoff 受信側 - (BOOL)application:(NSApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler { [userActivity getContinuationStreamsWithCompletionHandler: ^(NSInputStream *inputStream, NSOutputStream *outputStream, NSError *error) { if (error == nil) { _inputStream = inputStream; _outputStream = outputStream; [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [_outputStream open]; [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [_inputStream open]; // communicate... } else { // error handling } }]; return YES; }
  • 30. Further more, Handoff NSUserActivityDelegate - (void)userActivity:(NSUserActivity *)userActivity didReceiveInputStream:(NSInputStream *)inputStream outputStream:(NSOutputStream *)outputStream { _outputStream = outputStream; [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [_outputStream open]; // send data }
  • 31. Demo Handoff from Safari Send a picture via NSStream
  • 32. まとめ You get to try it. • Handoff • 使えるデバイスは限定される • SafariにURLを渡すHandoff • ネイティブアプリケーション同士のHandoff • Safariから渡すHandoff • Handoffの通信方法
  • 33. More Information Yuichi Yoshida http://github.com/sonsongithub/ @sonson_twit sonson.jp http://sonson.jp Apple Handoff プログラミングガイド https://developer.apple.com/jp/devcenter/ios/library/ documentation/HandoffProgrammingGuide.pdf