LiveCommunicationKit的那些坑

因为CallKit国区不能用,所以替代品LiveCommunicationKit出现。

使用方法很简单,基本和CallKit一样,直接上代码

@available(iOS 17.4, *)
class LiveCommunicationManager: NSObject, ConversationManagerDelegate {
    
    static let shared = LiveCommunicationManager()
    
    var isInvalidate:Bool = false
    var manager: ConversationManager!
    
    
    override init() {
        
    }
    
    func createNew(){
        
        if manager != nil {
            return
        }

        
        let config = ConversationManager.Configuration(
            ringtoneName: "notes_of_the_optimistic",
            iconTemplateImageData: UIImage(named: "AppIcon")?.pngData(), // 图标的 PNG 数据
            maximumConversationGroups: 1, // 最大对话组数
            maximumConversationsPerConversationGroup: 1, // 每个对话组内最大对话数
            includesConversationInRecents: false, // 是否在通话记录中显示
            supportsVideo: false, // 是否支持视频
            supportedHandleTypes: [.generic] // 支持的通话类型
        )
        
        manager = ConversationManager.init(configuration: config)
         
    }
    
    
    func reportIncomingCall(uuid: UUID, callerName: String) {
        
                
        manager.delegate = self
        
        let local = Handle(type: .generic, value: callerName, displayName: callerName)
        let update = Conversation.Update(localMember: local,members: [local],activeRemoteMembers: [local])
        
        Task {
            do {
                try await manager.reportNewIncomingConversation(uuid: uuid, update: update)
                print("成功报告新来电")
            } catch {
                print("报告新来电失败: \(error.localizedDescription)")
            }
        }
        
        
        
    }
    
    func endCall(){
        self.manager.invalidate()
    }
    

    
    func conversationManager(_ manager: ConversationManager, conversationChanged conversation: Conversation) {
        print("会话状态改变了")
       
    }
    
    func conversationManagerDidBegin(_ manager: ConversationManager) {
        print("会话已经开始了")        
    }
    
    func conversationManagerDidReset(_ manager: ConversationManager) {
        print("会话将要清除了")
    }
    
    func conversationManager(_ manager: ConversationManager, perform action: ConversationAction) {
        print("会话接听了")
        endCall()
    }
    
    func conversationManager(_ manager: ConversationManager, timedOutPerforming action: ConversationAction) {
        print("会话超时了")
    }
    
    func conversationManager(_ manager: ConversationManager, didActivate audioSession: AVAudioSession) {
        print("会话激活了")
    }
    
    func conversationManager(_ manager: ConversationManager, didDeactivate audioSession: AVAudioSession) {
        print("会话死亡了")
    }
    
} 

 

主要说一下遇到的坑,在使用PushKit,接收Voip推送后,前台模式没有任何问题,主要问题是在离线状态下,唤醒不了来电界面。代码如下

/// Voip推送
    func pushRegistry(_ registry: PKPushRegistry,
                      didReceiveIncomingPushWith
                      payload: PKPushPayload,
                      for type: PKPushType,
                      completion: @escaping () -> Void) {
        

        if #available(iOS 17.4, *) {
            
            let manager = LiveCommunicationManager.shared
            manager.createNew()
            manager.reportIncomingCall(uuid: UUID(), callerName: "CallKit")
            completion()
            
        } else {
            // Fallback on earlier versions
        }
     
    }

  直到加入这一行代码

            Thread.sleep(forTimeInterval: 0.05)

  

 苹果工程师给出的解释: 

 

 

好,内容大概就这么多,记录一下,希望对各位有帮助。

 

posted on 2025-04-09 15:43  金字塔上D蜗牛  阅读(682)  评论(5)    收藏  举报

导航