• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - CNContact UnifiedContact 与 Mac OS Sierra 中断

[复制链接]
菜鸟教程小白 发表于 2022-12-13 14:11:09 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

自从我切换到 Mac OS Sierra 和 XCode 8 后,使用unifiedContactsMatchingPredicate:keysToFetch:error: 或unifiedContactWithIdentifier:keysToFetch:error: 的代码不再正确运行。

返回错误:错误域:CNErrorDomain 代码:200 说明记录不存在,或者记录更新失败。

所有代码在 Mac OS 10.11 和 XCode 7 上都可以正常工作,授予对通讯簿的读取权限,并且我正在寻找的 CNContact 确实存在。

我在 iOS 10 上遇到了相同的行为,我通过在 plist 文件中添加一个 NSContactsUsageDescription 键来解决这个问题(在 iOS 10 之前这是可选的,但不再是)。我在我的 mac OS plist 文件中做了同样的事情,但没有运气。

任何线索发生了什么以及在哪里搜索?

编辑:使用一些代码:

我写了 2 个新项目,一个用 Objective-C,一个用 Swift。它们都给出相同的结果。

- (void)applicationDidFinishLaunchingNSNotification *)aNotification {
// Insert code here to initialize your application

CNContactStore  *contactStore   = [[CNContactStore alloc] init] ;
NSPredicate     *predicate      = [CNContact predicateForContactsMatchingName"TEST_CONTACT"] ;
NSError         *error          = nil ;

NSArray         *keys           = @[
                                    CNContactGivenNameKey,
                                    CNContactFamilyNameKey
                                    ] ;

NSArray         *contacts       = [contactStore unifiedContactsMatchingPredicate:predicate
                                                                     keysToFetch:keys
                                                                           error:&error] ;
NSLog(@"%d contacts found : %@",[contacts count],contacts) ;

}

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Insert code here to initialize your application

    let contactStore    = CNContactStore()
    let predicate       = CNContact.predicateForContacts(matchingName: "TEST_CONTACT")


    let keys            = [CNContactGivenNameKey,CNContactFamilyNameKey]

    do
    {
        let contacts        = try contactStore.unifiedContacts(matching: predicate,
                                                               keysToFetch: keys as [CNKeyDescriptor])
        print(contacts)
    }
    catch
    {
        print("caught an error")
    }

}

结果显示在控制台中:

2016-09-27 17:19:48.797029 TestCNContact.swift[13675:3502046] [core] __42-[ACAccountStore accountsWithAccountType:]_block_invoke_2 (208) "Error returned from daemon: <private>"

2016-09-27 17:19:48.798105 TestCNContact.swift[13675:3502046] [核心] __42-[ACAccountStore accountsWithAccountType:]_block_invoke_2 (208) “从守护进程返回错误:” [] 2016-09-27 17:19:49.631876 TestCNContact.swift[13675:3502047] [错误] 警告:动态访问器在解析类“ABCDInfo”上的选择器“uniqueId”时未能找到实体 ABCDInfo 的“uniqueId”的 @property 实现。你还记得在@implementation 中声明它@dynamic 或@synthesized 吗? 2016-09-27 17:19:52.637627 TestCNContact.swift [13675:3502047] [错误] 警告:动态访问器在解析类“ABCDAddressBookSource”上的选择器“serialNumber”时未能找到实体 ABCDAddressBookSource 的“serialNumber”的 @property 实现。你还记得在@implementation 中声明它@dynamic 或@synthesized 吗? 2016-09-27 17:19:52.739108 TestCNContact.swift [13675:3502068] [错误] 警告:动态访问器在解析类“ABCDAddressBookSource”上的选择器“uniqueId”时无法找到实体 ABCDAddressBookSource 的“uniqueId”的 @property 实现。你还记得在@implementation 中声明它@dynamic 或@synthesized 吗?



Best Answer-推荐答案


我找到了解决办法!!!

Apple 用以下声明回答了我的雷达: “Contacts 现在要求使用它的任何人都必须使用 uses-contacts 权利进行代码签名。”

所以我所做的就是对我的应用程序进行沙盒处理,并授予“联系人访问”权限。一切都恢复正常了。

enter image description here

Apple 似乎将不再接受非沙盒应用程序来访问联系人(或位置或日历)。

关于ios - CNContact UnifiedContact 与 Mac OS Sierra 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39688021/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap