呼叫目录分机的呼叫者 ID 中的 UserDefaults

Posted

技术标签:

【中文标题】呼叫目录分机的呼叫者 ID 中的 UserDefaults【英文标题】:UserDefaults in Call Directory Extension's Caller ID 【发布时间】:2018-05-23 17:13:52 【问题描述】:

故事是这样的:

在主应用程序中: - 一些数字是从我的网络服务中获取的。这些数字附加到 NSUserDefaults。

在呼叫目录分机中:

从 UserDefaults 中检索:

private func retrievePhoneNumbersToIdentifyAndLabels() -> (phoneNumbers: [CXCallDirectoryPhoneNumber], labels: [String]) 

    let defaults = UserDefaults.init(suiteName: GROUP_NAME)

    let phones = defaults?.array(forKey: "phoneArray") as! [CXCallDirectoryPhoneNumber]
    let names = defaults?.array(forKey: "nameArray") as! [String]

    return (phones,names)
     

这是呼叫目录扩展的功能:

private func addAllIdentificationPhoneNumbers(to context: CXCallDirectoryExtensionContext) 

    let (phoneNumbers, labels) = retrievePhoneNumbersToIdentifyAndLabels()

       print(phoneNumbers)
       print(labels)

    for (phoneNumber, label) in zip(phoneNumbers, labels) 
        context.addIdentificationEntry(withNextSequentialPhoneNumber: phoneNumber, label: label)
    

问题:当我尝试在我的设备上的设置中启用呼叫阻止和识别时,它会出现“启用分机错误”错误。而且,在 Xcode 的调试器中,

[用户默认值] 无法读取 CFPrefsPlistSource 中的值(域:GROUP_NAME,用户:kCFPreferencesAnyUser,ByHost:是,容器:(null),需要刷新的内容:是):仅将 kCFPreferencesAnyUser 与容器一起使用允许系统容器,从 cfprefsd 分离

但这里是故事的有趣部分:

在这些问题之后,不知何故,上述函数中的打印函数运行正常。 我的意思是,它可以将电话号码和标签保存到 UserDefaults,也可以从 UserDefaults 中读取。澄清一下,我可以在我的扩展程序中访问 UserDefaults。 没有问题。

注意:当然,主应用程序和呼叫目录扩展的应用程序组都已设置,并且电话号码具有正确的类型别名,即 Int64。此外,电话号码按升序排序。

【问题讨论】:

Sharing UserDefaults between extensions的可能重复 感谢您的回复,但我希望您能更好地阅读我写的内容。 @TomE 【参考方案1】:

确保您不会意外损坏数据。共享数据文件意味着可能有多个进程同时尝试使用一个文件。 ios 上的沙盒意味着这是一种罕见的情况,但这并不意味着可以忽略它。您可能需要使用“NSFileCoordinator”

你可以在这个地址找到更多的解释信息:enter link description here

【讨论】:

【参考方案2】:

我遇到了同样的问题。 您必须在 Ad-Hoc 或 Release 模式下对其进行测试! 好像在调试模式下它有时不起作用!

【讨论】:

以上是关于呼叫目录分机的呼叫者 ID 中的 UserDefaults的主要内容,如果未能解决你的问题,请参考以下文章

医院呼叫系统基于FPGA的简易医院呼叫系统实现

ICU探视对讲

如何使用呼叫目录扩展来识别我的应用程序中的来电?

根据呼叫日志状态层次结构计算类别中的唯一客户

附加不适用于唯一的呼叫 ID

SQL COUNT()/ LEFT JOIN?