Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Getting started with Handoff

4,767 views

Published on

yidev #16で発表した資料です.

Published in: Technology
  • Be the first to comment

Getting started with Handoff

  1. 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. 2. 自己紹介 2tchの中の人 • iOS好きです • 2tch(2ちゃんねるビューア) • iOS SDK Hacksなど • 研究 • コンピュータビジョン • 機械学習 • 研究・開発 • 画像検索サービス • 車向けのサービスやハードウェア
  3. 3. Demo 2tch version 6.3.1
  4. 4. What is Handoff? 継続って訳すのやめて欲しい
  5. 5. Handoffの種類 • Safariを呼ぶ • URLを渡すだけ • ネイティブアプリケーション • 受信側にコードが必要 • インストールされていれば自動起動する • Safariからネイティブアプリケーションを呼ぶ • 署名した対応アプリ一覧JSONが必要
  6. 6.
  7. 7. 準備 • 対応ハードウェアを買う • 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世代)
  8. 8. 準備 • iCloudに登録する • Bluetoothをオンにする • Wi-Fiをオンにする
  9. 9. 準備 • iCloudに登録する • Bluetoothをオンにする • Wi-Fiをオンにする
  10. 10. Demo Safariで試す
  11. 11. ネイティブアプリからSafariへ • とっても簡単 • NSUserActivityクラス • - webpageURL
  12. 12. 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
  13. 13. [_activity becomeCurrent];
  14. 14. [_activity invalidate];
  15. 15. ネイティブアプリケーション • Info.plist • NSUserActivityTypesに受け取る識別子を追加 • 逆ドメイン形式 • com.sonson.HandoffSample • UIApplicationDelegate(NSApplicationDelegate) • application:willContinueUserActivityWithType: • application:didFailToContinueUserActivityWithType:error: • application:continueUserActivity:restorationHandler: • OSXの場合 • 署名必須(Developer IDでもよいみたい)
  16. 16. NSUserActivity _activity = [[NSUserActivity alloc] initWithActivityType:@"com.sonson.OSX.HandoffSample"]; _activity.title = @"Browsing"; _activity.userInfo = @{@"ImageSize":@(_imageBinary.length)}; [_activity becomeCurrent];
  17. 17. 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; }
  18. 18. ViewController restoration • UIResponder • - 新しいデリゲートメソッド • - restoreUserActivityState: • void(^)(NSArray *restorableObjects) • restoreするUIResponderのサブクラスをつっこむ • 自動的にrestoreUserActivityState:が呼ばれる • 引数はNSUserActivityオブジェクト
  19. 19. 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
  20. 20. うまくいかない? Bug? • 対応機種ですか? • iCloudは同じアカウントになっていますか? • NSUserActivityのインスタンスはありますか? • 他の機器とHandoffが混線していませんか?
  21. 21. Further more, Handoff Communicate with.…… • ブラウザからHandoff経由でアプリを起動する • Webページ閲覧中にiOSデバイスのアプリを起動 • 3つのデータ送受信 • userInfo • iCloud • NSStream
  22. 22. Further more, Handoff SafariからのHandoff • iOS側のentitlementにサーバのドメインを追加 • JSONを作る • JSONに署名する • iOSの持つリストに入ってる認証局の証明書が必要 • 実はApple自身が認証局になってる • なのでAppleの開発者の署名でおk • httpsで通信できるサーバにJSONを置く • ルートに置く必要がある
  23. 23. Further more, Handoff 大きなデータはどうするか? • userInfo • NSArray, NSData, NSDate, NSDictionary, NSNull, NSNumber, NSSet, NSString, NSURL • iCloud • UIDocumentが自動的にNSUserActivityを生成 • CFBundleDocumentTypes • NSUbiquitousDocumentUserActivityType • NSStream • 簡単
  24. 24. 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];
  25. 25. 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; }
  26. 26. 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 }
  27. 27. Demo Handoff from Safari Send a picture via NSStream
  28. 28. まとめ You get to try it. • Handoff • 使えるデバイスは限定される • SafariにURLを渡すHandoff • ネイティブアプリケーション同士のHandoff • Safariから渡すHandoff • Handoffの通信方法
  29. 29. 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

×