現在IOS callkitを実装し、受電した際にcallkitを出力させるような使用になっております。
しかし発電→切電→発電→切電を繰り返すと以下のようなエラーが出力されアプリがクラッシュしてしまいます。(切電時に発生します。)
Error Domain=com.apple.CallKit.error.requesttransaction Code=4 "(null)"
解決方法を探していると同じような問題が発生している資料を見つけたので
当資料を参考にし、CXEndCallActionにセットされているUUIDが実際のUUIDと同じものか確認したのですが、やはり同じもので間違いありませんでした。
Error while requesting a transaction with CXEndCallAction
コードは以下になります。
swift
1//電話を切る時の処理 2@objc func disCallTapped(sender : AnyObject) { 3 let endCallAction = CXEndCallAction(call: UUIDs) 4 print("UUIDs③: (UUIDs)") 5 let transaction2 = CXTransaction(action: endCallAction) 6 7 self.controller.request(transaction2) { (error) in 8 9 if let error = error { 10 print(self.UUIDs) 11 print(error) 12 } else { 13 //ここで電話を終了している! 14 print("=================切電===================") 15 self.mediaConnection?.close() 16 } 17 } 18 } 19//電話をかける時の処理 20@objc func callTapped(sender : AnyObject) { 21 //① 22 guard let peer = self.peer else{ 23 return 24 } 25 //電話をかける場合は「CXStartCallAction」を生成することから始まる。 26 let transaction = CXTransaction(action: CXStartCallAction(call: UUIDs, handle: CXHandle(type: .generic, value: "Gokonテスト"))) 27 self.controller.request(transaction){ error in 28 29 if let error = error { 30 print("Error requesting transaction: (error)") 31 } else { 32 print("Requested transaction successfully") // Error Domain=com.apple.CallKit.error 33 self.call(targetPeerId: self.peerId)//peerId) // ここで電話をかけている! -> callPeerIDSelectDialogでかけたい相手のpeerIdを取得 34 } 35 36 } 37 38 //ユーザーが着信画面から電話を受け取るとここのDelegateが呼びだ出される。 39 func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { 40 print("=================電話を取った時===================") 41 42 action.fulfill() 43 } 44 45//callkitのために追加(通話拒否・終了) 46 func provider(_ provider: CXProvider, perform action: CXEndCallAction) { 47 print("your UUID②: (UUIDs)")//② 48 print("=================電話を切った時===================") 49 self.mediaConnection?.close()//② 50 action.fulfill() 51 } 52 53//発電ボタンを押した時に走っている 54 func setupMediaConnectionCallbacks(mediaConnection:SKWMediaConnection){ 55 print("=================setupMediaConnectionCallbacks(1)===================") 56 // MARK: MEDIACONNECTION_EVENT_STREAM 相手のカメラ、マイク情報を受信したとき 57 mediaConnection.on(SKWMediaConnectionEventEnum.MEDIACONNECTION_EVENT_STREAM, callback: { (obj) -> Void in 58 if let msStream = obj as? SKWMediaStream{ 59 self.remoteStream = msStream 60 DispatchQueue.main.async { 61 print("=================setupMediaConnectionCallbacks(2)===================") 62 } 63 } 64 print("=================setupMediaConnectionCallbacks(3)===================") 65 }) 66 67 // 切断されたとき、電話を切った時に走っているMARK: MEDIACONNECTION_EVENT_CLOSE 68 mediaConnection.on(SKWMediaConnectionEventEnum.MEDIACONNECTION_EVENT_CLOSE, callback: { (obj) -> Void in 69 print("=================MEDIACONNECTION_EVENT_CLOSE(1)===================") 70 if let _ = obj as? SKWMediaConnection{ 71 DispatchQueue.main.async { 72 self.remoteStream = nil 73 self.mediaConnection = nil <= ここで問題のエラーが出力される! 74 print("=================MEDIACONNECTION_EVENT_CLOSE(2)===================") 75 } 76 print("=================MEDIACONNECTION_EVENT_CLOSE(3)===================") 77 let endCallAction = CXEndCallAction(call: self.UUIDs) 78 print("your UUID①: (self.UUIDs)")//① 79 let transaction2 = CXTransaction(action: endCallAction) 80 self.controller.request(transaction2) { (error) in 81 82 if let error = error { 83 print("your UUID①: (self.UUIDs)") 84 print(error) 85 print("=================MEDIACONNECTION_EVENT_CLOSE(4)===================") 86 } else { 87 print("=================MEDIACONNECTION_EVENT_CLOSE(5)===================") 88 } 89 } 90 } 91 }) 92 93 } 94} 95
どなたか本問題の原因、解決方法がご存知の方がいらっしゃれば
お力添えのほどよろしくお願いします。
以下のような記事にも記載されているような action.fulfill()も実装しているつもりですが、
書き漏れや、抜けがあればご教示頂けると幸いです。
CXEndCallAction transactions fails with Incorrect UUID
よろしくお願いします。
あなたの回答
tips
プレビュー