ios voip待ち受けの仕組み

Post on 14-Jun-2015

7.232 Views

Category:

Entertainment & Humor

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

• Facebook電話アプリ• iPhone/Android対応• http://reengo.me/

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/

デモ

top related