CNContact unifiedContact打破Mac OS Sierra

时间:2016-09-25 14:34:08

标签: ios macos cncontact

由于我切换到Mac OS Sierra和XCode 8,使用unifiedContactsMatchingPredicate的代码:keysToFetch:error:或unifiedContactWithIdentifier:keysToFetch:错误:不再正常运行。

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

所有代码在Mac OS 10.11和XCode 7上运行良好,授予对地址簿的读取权限,并且我正在寻找的CNContact确实存在。

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

有什么线索和搜索地点?

编辑:有一些代码:

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

- (void)applicationDidFinishLaunching:(NSNotification *)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] [core] __42- [ACAccountStore accountsWithAccountType:] _ block_invoke_2(208)&#34;从守护程序返回错误:&#34; [] 2016-09-27 17:19:49.631876 TestCNContact.swift [13675:3502047] [错误]警告:动态访问者未能找到@property实现&#39; uniqueId&#39;对于实体ABCDInfo,同时解析选择器“uniqueId”&#39;在班级&#39; ABCDInfo&#39;。你还记得在@implementation中声明@dynamic或@synthesized吗? 2016-09-27 17:19:52.637627 TestCNContact.swift [13675:3502047] [错误]警告:动态访问者无法找到&#39; serialNumber&#39;的@property实现对于实体ABCDAddressBookSource,同时解析选择器&#39; serialNumber&#39;在班级&#39; ABCDAddressBookSource&#39;。你还记得在@implementation中声明@dynamic或@synthesized吗? 2016-09-27 17:19:52.739108 TestCNContact.swift [13675:3502068] [错误]警告:动态访问者未能找到@property实现&#39; uniqueId&#39;对于实体ABCDAddressBookSource,同时解析选择器&#39; uniqueId&#39;在班级&#39; ABCDAddressBookSource&#39;。您是否记得在@implementation中声明@dynamic或@synthesized?

2 个答案:

答案 0 :(得分:2)

我找到了解决方案!!!

Apple通过以下声明回应了我的雷达: &#34;联系人现在要求使用它的任何人使用uses-contacts权利进行编码。&#34;

所以我做的是我将我的应用程序沙盒化,并授予&#34;联系人访问权限#34;权利。一切都恢复正常。

enter image description here

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

答案 1 :(得分:2)

我遇到了同样的问题,但沙盒不是一个选项,因为我们想通过Sparkle分发我们的应用程序。

在重新阅读时,我重新阅读了声明:“联系人现在要求使用它的任何人都使用uses-contacts权利进行编码。”并且想知道如果我有一个列出了联系人的权利文件会发生什么,但是沙盒设置为false,并且有效。

<dict>
        <key>com.apple.security.app-sandbox</key>
        <false/>
        <key>com.apple.security.personal-information.addressbook</key>
        <true/>
        <key>com.apple.security.personal-information.calendars</key>
        <true/>
</dict>

我使用活动监视器验证我的应用程序没有沙盒,但仍然可以访问地址簿。