前提・実現したいこと
swiftでcallkitを使ってiPhoneにかかってきた電話を受話せずに○秒後に自動的に切断したい
他言語の開発経験はありますが、swift初心者です。
ネットで探したサンプルコードを元に実装しました。
該当のソースコード
swift5
1import Foundation 2import UIKit 3import CallKit 4 5extension Notification.Name { 6 static let notifyName = Notification.Name("notifyName") 7} 8 9 10class CallKitController: NSObject ,CXCallObserverDelegate{ 11 12 var callObserver = CXCallObserver() 13 private let controller = CXCallController() 14 15 override init() { 16 super.init() 17 callObserver.setDelegate(self, queue: DispatchQueue.main) 18 print("コールキットオブザーバーinit") 19 } 20 21 func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) { 22 callStateValue(call: call) 23 } 24 25 func callStateValue(call: CXCall) { 26 27 print("isOutgoing ", call.isOutgoing); 28 print("hasConnected ", call.hasConnected); 29 print("hasEnded ", call.hasEnded); 30 print("isOnHold ", call.isOnHold); 31 32 // 発信 33 if (call.isOutgoing == true && call.hasConnected == false) { 34 print("発信 CXCallState : Dialing"); 35 NotificationCenter.default.post(name: .notifyName, 36 object: nil, 37 userInfo: ["mykind":1] 38 ) 39 } 40 41 // 着信 42 if (call.hasConnected == false && call.hasEnded == false) { 43 print("着信 CXCallState : Incoming"); 44 45 NotificationCenter.default.post(name: .notifyName, 46 object: nil, 47 userInfo: ["mykind":2] 48 ) 49 50 //5秒待って電話を自動で切る 51 Thread.sleep(forTimeInterval: 5.0) 52 endCall(call: call) 53 54 } 55 56 // 受話 57 if (call.hasConnected == true && call.hasEnded == false) { 58 print("受話 CXCallState : Connected"); 59 NotificationCenter.default.post(name: .notifyName, 60 object: nil, 61 userInfo: ["mykind":3] 62 ) 63 } 64 65 // 切断 66 if (call.hasConnected == true && call.hasEnded == true) { 67 print("切断 CXCallState : Disconnected"); 68 NotificationCenter.default.post(name: .notifyName, 69 object: nil, 70 userInfo: ["mykind":4] 71 ) 72 } 73 } 74 75 //電話を切る時の処理 76 func endCall(call: CXCall) { 77 var ret: Int = 5 78 79 let action = CXEndCallAction(call: call.uuid) 80 let transaction = CXTransaction(action: action) 81 controller.request(transaction) { error in 82 if let error = error { 83 print("CXEndCallAction error: (error.localizedDescription)") 84 ret = 6 85 } 86 } 87 88 NotificationCenter.default.post(name: .notifyName, 89 object: nil, 90 userInfo: ["mykind":ret] 91 ) 92 } 93 94} 95
試したこと
上記コードを実行すると、iPhoneに着信があったことを取得してendCallメソッドを実行し
エラーも発生していないことまでは確認できました。
ただ、電話を切ることはできずそのまま着信コールが続きます。
アプリに関係なくiPhoneにかかってきた電話をアプリから電話を切ることは実現可能でしょうか。
補足情報(FW/ツールのバージョンなど)
Xcode11で開発しています。
iPhoneOS 13.3.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/27 00:50