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)
苹果工程师给出的解释:


好,内容大概就这么多,记录一下,希望对各位有帮助。
浙公网安备 33010602011771号