Download - iOS VoIP待ち受けの仕組み
IP電話待ち受けの秘密
About me•Daisuke Murase• Software engineer in KAYAC Inc.• #Perl #C #C++ #Objective-C #JavaScript #CoffeeScript #ActionScript
About me
•新規開発ラボ BM11チーム所属
About me
•新規開発ラボ BM11チーム所属•最近の仕事• Reengo(Facebook電話)• VQチェッカー(モテ声診断)
About me• a.k.a typester• http://github.com/typester• http://search.cpan.org/~typester• http://twitter.com/typester• http://facebook.com/typester
Agenda
• Reengoの紹介• iOSバックグラウンド動作のおさらい• iOSバックグラウンド待ち受けの仕組み• iOSバックグラウンド待ち受けの実装
Reengo実装周り
Reengo実装周り
• 適材適所の技術を採用
Reengo実装周り
• 適材適所の技術を採用• ロジック、通信周りは C (iOS/Android共通)
Reengo実装周り
• 適材適所の技術を採用• ロジック、通信周りは C (iOS/Android共通)• UI は Objective-C、Java
Reengo実装周り
• 適材適所の技術を採用• ロジック、通信周りは C (iOS/Android共通)• UI は Objective-C、Java• サーバーサイドは Perl、Node.js
iOSバックグラウンド動作のおさらい
iOSバックグラウンド動作のおさらい
• バックグラウンド動作は最大10分間
iOSバックグラウンド動作のおさらい
• バックグラウンド動作は最大10分間• 例外• オーディオ再生• 位置情報の取得• VoIP待ち受け
iOSバックグラウンド動作のおさらい
• バックグラウンド動作は最大10分間• Info.plistのUIBackgroundModes• audio• location• voip
iOSバックグラウンド動作のおさらい
• バックグラウンド動作は最大10分間• Info.plistのUIBackgroundModes• audio• location• voip
バックグラウンドVoIP待ち受け
バックグラウンドVoIP待ち受け
1. 待ち受け用のソケットをつくる
2. そのソケットに対しVoIPフラグを立てる
3. そのソケットはiOSが管理を代行してくれる
4. KeepAliveハンドラで接続をチェック
VoIPフラグ?
それぞれのクラスにフラグを立てるメソッドが存在する
• NSInputStream、NSOutputStream• NSURLRequest• CFReadStreamRef、CFWriteStreamRef
VoIPフラグ?
[stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];
KeepAliveハンドラ
UIApplicationのsetKeepAliveTimeout:handler:で登録
[[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ // ここで接続を確認 }];
KeepAliveハンドラ
UIApplicationのsetKeepAliveTimeout:handler:で登録
[[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ // ここで接続を確認 }];
KeepAliveハンドラ
UIApplicationのsetKeepAliveTimeout:handler:で登録
[[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ // ここで接続を確認 }];
Cでロジック書いてたらどうすんの?
Cでロジック書いてたらどうすんの?CFStreamCreatePairWithSocketでファイルディスクリプタからNSStreamを作ることができる
Cでロジック書いてたらどうすんの?CFStreamCreatePairWithSocketでファイルディスクリプタからNSStreamを作ることができる
int fd = socket(AF_INET, SOCK_STREAM, 0);
NSInputStream* stream; CFStreamCreatePairWithSocket( kCFAllocatorDefault, fd, (CFReadStreamRef*)&stream, NULL);
Cでロジック書いてたらどうすんの?CFStreamCreatePairWithSocketでファイルディスクリプタからNSStreamを作ることができる
int fd = socket(AF_INET, SOCK_STREAM, 0);
NSInputStream* stream; CFStreamCreatePairWithSocket( kCFAllocatorDefault, fd, (CFReadStreamRef*)&stream, NULL);
待ち受けサンプル実装http://github.com/typester/voip-socket-test
•付属のserver.plが待ち受けサーバー•AppDelegate.mの #define HOST とかを自分のサーバーアドレスに変更
•アプリ立ち上げて、サーバーのSTDINに何か入力するとその内容がローカルPush通知される
•http://unknownplace.org/memo/2011/01/28/1/
デモ
完