iOS 知识收集iOS即時通訊開發IOS知识积累

iOS CallKit与PushKit的集成(完结篇)

2018-01-26  本文已影响144人  捡书

声明一下,现在国区的App Store应中国特色社会主义的要求,禁止上架有callkit功能的APP,已有的也要整改,删除callkit功能。

因为篇幅太长,所以把这个分成了三部分,希望读者不要打我。。
上一篇文章讲了PushKit的集成和CallKit的所有主要功能。这篇文章将讲解如何从系统通话记录中直接拨打App的电话。

需要继续完善上一篇文章的代码哦。。
iOS CallKit与PushKit的集成(二)

创建工具类

在第一篇文章中,我们已经导入了Intents.framework,下面开始对他进行操作。
首先创建两个协议,目的是为了加几个属性:

protocol StartCallConvertible {
    var startCallHandle: String? { get }
    var video: Bool? { get }
}

extension StartCallConvertible {
    var video: Bool? {
        return nil
    }
}

@available(iOS 10.0, *)
protocol SupportedStartCallIntent {
    var contacts: [INPerson]? { get }
}

@available(iOS 10.0, *)
extension INStartAudioCallIntent: SupportedStartCallIntent {}
@available(iOS 10.0, *)
extension INStartVideoCallIntent: SupportedStartCallIntent {}

然后对NSUserActivity进行扩展,实现StartCallConvertible协议:

extension NSUserActivity: StartCallConvertible {
    
    var startCallHandle: String? {
        if #available(iOS 10.0, *) {
            guard
                let interaction = interaction,
                let startCallIntent = interaction.intent as? SupportedStartCallIntent,
                let contact = startCallIntent.contacts?.first
                else {
                    return nil
            }
            return contact.personHandle?.value
        }
        
        return nil
    }
    
    var video: Bool? {
        if #available(iOS 10.0, *) {
            guard
                let interaction = interaction,
                let startCallIntent = interaction.intent as? SupportedStartCallIntent
                else {
                    return nil
            }
            
            return startCallIntent is INStartVideoCallIntent
        }
        return nil
    }
}

回到AppDelegate中,实现代理方法:

override func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
        if #available(iOS 10.0, *) {
            guard let handle = userActivity.startCallHandle else {
                log.info("Callkit& Could not determine start call handle from user activity: \(userActivity)")
                return false
            }
            
            guard let video = userActivity.video else {
                log.info("Callkit& Could not determine video from user activity: \(userActivity)")
                return false
            }
            //如果当前有电话,需要根据自己App的业务逻辑判断
            
            //如果没有电话,就打电话,调用自己的打电话方法。
            
            return true
        }
        return false
}

至此,从通话记录中调到自己App打电话的功能就实现啦。

上一篇下一篇

猜你喜欢

热点阅读