Fork me on GitHub

サンプルコード

https://github.com/sonsongithub/HandoffSample

iOS, OSXの設定

まず,Handoffの下準備として,iCloud経由でBluetoothデバイスが,同じiCloudアカウントに登録されなければならない. iOSの場合は,以下のように,デバイスからは削除できないBluetoothデバイスが登録されていることが表示されている必要がある. 正しく登録されれば,登録したデバイスがBluetoothのリストの中に表示される. iCloud経由で登録した場合は,デバイスがBluetoothの電波の圏外でかつ普通にペアリングがしたことがなくても,このリストに表示される.

また,OSXの場合は,以下のような画面になり,同様にOSXからもiCloud経由で登録したデバイスを削除できない.

image

OSXとiOSで同じiCloudアカウントにログインし,それぞれのデバイスで同じAppleIDでFaceTimeにサインインしていれば,OSX側のFaceTimeの環境設定ダイアログに以下のように,iPhoneへの着信をMacで受ける機能のチェックボックスが表示される.

image

次に基本的にデフォルトでオンになっているはずだが,Handoffの機能自体もオンにする必要がある.

image

NSUserActivityとSafariベースのシンプルなHandoff

別のデバイスに情報を転送するとき,このNSUserActivityクラスを使う. SafariにURLをHandoffで送信するアプリケーションを作ってみよう. まず,空のビューコントローラベースのアプリケーションのプロジェクト作成する. 次にViewControllerクラスに以下のコードを実装する.

@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

NSUserActivityクラスは,handoffで情報を引き渡すために利用するクラスである. このサンプルでは,識別子をcom.sonson.HandoffTestとしてURLを引き渡す. SafariにURLを引き渡すだけであれば,識別子は何であっても構わない. まず,このプロジェクトを実行し,他のデバイス(このサンプルアプリケーションをインストールしていないもの)でアプリケーション切り替え画面か,ロック画面にしてみる. 正しく,handoffが動作しているならば,以下のような画面になっているはずである.

ここで,NSUserActivityクラスをビューコントローラのプロパティとして,保存しておく. そうしておかないと,NSUserActivityクラスはすぐに解放されてしまうので,Handoffのブロードキャストがすぐに終了してしまう. また,Handoffの発信を止めたい場合,再開したい場合には,それぞれメソッドが用意されている.

 - (void)becomeCurrent;
 - (void)invalidate;

image image

ここで,ロック画面の場合は左下のSafariアイコンを上方向にスワイプ,アプリケーション切り替え画面の場合は,”iPad miniから”のアイコンをタップすると,Safariが起動し,NSUserActivityのwebpageURLで指定したURLが開かれる.このサンプルの場合は,http://www.apple.comがSafariで開かれる.

これでもっともシンプルなブラウジングのHandoffの実装は完了. かなり簡単であることがわかったと思う.

うまくいかないときのバッドノウハウ

ここまでのHandoffの実装がすんなりいった場合は,このセクションは読み飛ばしても構わない. しかしながら,Bluetooth関連の処理やiCloudの連携はうまくいかないのが,Appleの常だ. Handoffで行き詰まった場合のバッドノウハウについて書いてみる.

  1. iOS/OSXでのBluetoothの電源のON/OFFの切り替え
  2. iOS/OSXでのHandoffのON/OFFの切り替え

Handoffがうまく動かなくなったら,まずこの上の二つの操作を試してみよう. 以外にこれですんなり動くようになったりする. しかし・・・これだけでうまくいかないことがあるのも想定内である. 次に,完全にBluetoothのiCloud登録関連を初期化し,再度,登録を行うための手順を紹介する.

  1. OSX - iCloudをサインアウトする
  2. OSX - FaceTimeをサインアウトする
  3. OSX - iMessageをサインアウトする
  4. iOS - iCloudをサインアウトする
  5. iOS - FaceTimeをサインアウトする
  6. iOS - iMessageをサインアウトする
  7. OSXとiOSを再起動(用心深くやる場合)
  8. OSX - iCloudにサインイン
  9. OSX - FaceTimeにサインイン
  10. OSX - iMessageにサインイン
  11. iOS - iCloudにサインイン
  12. iOS - FaceTimeにサインイン
  13. iOS - iMessageにサインイン

この後,Bluetoothのデバイスリストと,FaceTimeの環境設定を確認すると良い. また,FaceTimeとiMessageには必ずしもログインする必要はない.

iOS8が正式リリースされたので,ここまで動かなくなることはないと思うが,以下の資料もご参考までにご覧くだしあ.

Handoffは動かない〜これから役立たないバッドノウハウ集 from Yuichi Yoshida

パート2に続く.