あまのじゃくな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


コメント