SlideShare uma empresa Scribd logo
1 de 33
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

Spring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbcSpring Bootキャンプ @関ジャバ #kanjava_sbc
Spring Bootキャンプ @関ジャバ #kanjava_sbc
Toshiaki Maki
 

Mais procurados (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拡張機能
 

Destaque

UIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐUIToolbarの同時タッチを防ぐ
UIToolbarの同時タッチを防ぐ
Yuichi Yoshida
 

Destaque (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の同時タッチを防ぐ
 

Semelhante a 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 sdk
Kazuki Nakajima
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
Nobuhiro Sue
 
次期Office製品群の新しい開発モデルの解説
次期Office製品群の新しい開発モデルの解説次期Office製品群の新しい開発モデルの解説
次期Office製品群の新しい開発モデルの解説
kumo2010
 
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシングAWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
江藤 武司
 

Semelhante a 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 で実現、マイクロサービスのサーバーレスな分散トレーシング
 

Mais de Yuichi Yoshida

Swift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウムSwift 2 (& lldb) シンポジウム
Swift 2 (& lldb) シンポジウム
Yuichi Yoshida
 

Mais de 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のすすめ
 

Último

Último (10)

論文紹介: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
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: 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
 
論文紹介: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...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

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