あまのじゃくなHikaruappです。
誰もやらないであろう、Coretelepnonyの一部が非推奨になりCallkitとして生まれ変わった、そのCallkitを使って通話の状態を取得してみた。
swiftをやるやると言っておきながら、今回もObjective-Cです。
それでは、行きます
検証環境
Mac OS X 10.11.6
Xcode 8.0
Call kitで通話の状態を取得する
CoreTelephonyにも通話状態を取得する機能がありました。
これ結構癖があって、メインスレッド以外でnewしたり、通話中にnewするとリークする始末、誰も使っていなかったと思われ放置プレイ状態。
そんな状態からCallkitで完璧に生まれ変わりました。
嬉しい!
取得するステータスはガラリと変わった
Coretelephony
CoreTelephonyのステータスは4つ
CORETELEPHONY_EXTERN NSString * const CTCallStateDialing CORETELEPHONY_EXTERN NSString * const CTCallStateIncoming CORETELEPHONY_EXTERN NSString * const CTCallStateConnected CORETELEPHONY_EXTERN NSString * const CTCallStateDisconnected
非推奨なので、そうでしたか程度で・・・。
Callkit
Call kitのステータスは4つ
@property (nonatomic, readonly, assign, getter=isOutgoing) BOOL outgoing; @property (nonatomic, readonly, assign, getter=isOnHold) BOOL onHold; @property (nonatomic, readonly, assign) BOOL hasConnected; @property (nonatomic, readonly, assign) BOOL hasEnded;
YES/NOで振り分けろ!て感じですね。
現在通話しているのは、着信か発信かは outgoingでわかったりします。
まぁ、面白いので色々と実験してみてください。
iOSのAPIは作り手の考えを読み解くと凄く使い易いです。
では、使ってみましょう
使い方は2種類
1.現在の状態を知る
2.通話の状態が変化した時の状態を知る
1.現在の状態を知る
// 現在の値の取得 - (void)callstateNow { if ([self.callObserver.calls count] == 0) { [self callStateValue:nil]; } else { for (CXCall *call in self.callObserver.calls) { [self callStateValue:call]; } } } #pragma mark - Callkit State - (void)callStateValue:(CXCall *)call { NSLog(@"hasEnded %@", call.hasEnded? @"YES":@"NO"); NSLog(@"isOutgoing %@", call.isOutgoing? @"YES":@"NO"); NSLog(@"isOnHold %@", call.isOnHold? @"YES":@"NO"); NSLog(@"hasConnected %@", call.hasConnected? @"YES":@"NO"); // 切断 if (call == nil || call.hasEnded == YES) { NSLog(@"CXCallState : Disconnected"); } // 発信 if (call.isOutgoing == YES && call.hasConnected == NO) { NSLog(@"CXCallState : Dialing"); } // 着信 if (call.isOutgoing == NO && call.hasConnected == NO && call.hasEnded == NO && call != nil) { NSLog(@"CXCallState : Incoming"); } // 電話中 if (call.hasConnected == YES && call.hasEnded == NO) { NSLog(@"CXCallState : Connected"); } }
2.通話の状態が変化した時、その状態を知る
- (instancetype)init { self = [super init]; if (self) { // 電話状態変化通知の設定 _callObserver = [CXCallObserver new]; [_callObserver setDelegate:self queue:dispatch_get_main_queue()]; } return self; } #pragma mark - CXCallObserverDelegate - (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call{ [self callStateValue:call]; } #pragma mark - Callkit State - (void)callStateValue:(CXCall *)call { NSLog(@"hasEnded %@", call.hasEnded? @"YES":@"NO"); NSLog(@"isOutgoing %@", call.isOutgoing? @"YES":@"NO"); NSLog(@"isOnHold %@", call.isOnHold? @"YES":@"NO"); NSLog(@"hasConnected %@", call.hasConnected? @"YES":@"NO"); // 切断 if (call == nil || call.hasEnded == YES) { NSLog(@"CXCallState : Disconnected"); } // 発信 if (call.isOutgoing == YES && call.hasConnected == NO) { NSLog(@"CXCallState : Dialing"); } // 着信 if (call.isOutgoing == NO && call.hasConnected == NO && call.hasEnded == NO && call != nil) { NSLog(@"CXCallState : Incoming"); } // 電話中 if (call.hasConnected == YES && call.hasEnded == NO) { NSLog(@"CXCallState : Connected"); } }
delegateの設定をして、メインスレッドを指定してみました。
まとめ
APIのヘッダーを見ながらCallkitの使い方を調べていると、swiftを意識したAPIになっているように感じました。
世の中はswiftなんだな、とつくづく思いObjective-Cの記事でいいのか?
と、思いながら誰が使うんだ?と言う記事を書いている私はウキウキだったりもします。
サンプルコード
プロジェクトファイル – github
コメント