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

声明一下,现在国区的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打电话的功能就实现啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 声明一下,现在国区的App Store应中国特色社会主义的要求,禁止上架有callkit功能的APP,已有的也要整...
    捡书阅读 2,339评论 1 3
  • 声明一下,现在国区的App Store应中国特色社会主义的要求,禁止上架有callkit功能的APP,已有的也要整...
    捡书阅读 3,911评论 3 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,420评论 25 708
  • 中国人说茶,多是绿茶,一个热水瓶,一个透明玻璃杯,几泡茶,一杯接着一杯,就是一天,很多中国人对茶的认识,就是这样,...
    如是秋山阅读 388评论 0 0
  • 不忘 十八岁 你也十八岁 我梦有你 你梦也有我 我念 缘有几何 情有几分 我想 爱可否言 恋可否语 待花季 你我再...
    日内瓦湖畔的繁星阅读 166评论 0 1