2016-09-25 122 views
2

由於我切換到Mac OS Sierra和XCode 8,使用unifiedContactsMatchingPredicate的代碼:keysToFetch:error:或unifiedContactWithIdentifier:keysToFetch:error:不再正常運行。CNContact unifiedContact與Mac OS Sierra破壞

返回錯誤:錯誤域:CNErrorDomain代碼:200 說明該記錄不存在或記錄更新失敗。

所有的代碼在Mac OS 10.11和XCode 7都可以正常工作,對地址簿的讀取權限被授予,並且我正在尋找的CNContact確實存在。

我與iOS 10有相同的行爲,我通過在plist文件中添加了一個NSContactsUsageDescription鍵(在iOS 10之前是可選的,但不再),解決了這個問題。我在我的Mac OS plist文件中做了同樣的事情,但沒有運氣。

任何線索是怎麼回事,在哪裏尋找?

編輯:一些代碼:

我寫了2個新項目,一個在Objective-C,一個在斯威夫特。他們都給出了相同的結果。

- (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年9月27日17:19:48.798105 TestCNContact.swift [13675:3502046 ] [芯] __42- [ACAccountStore accountsWithAccountType:] _ block_invoke_2(208) 「錯誤從守護進程返回:」 ] 2016年9月27日17:19:49.631876 TestCNContact.swift [13675:3502047] [錯誤]警告:動態存取未能找到 'UNIQUEID' @property實施實體ABCDInfo同時解決選擇 'UNIQUEID' 階級'ABCDInfo'。您是否記得在@implementation中聲明@dynamic或@synthesized? 2016-09-27 17:19:52.637627 TestCNContact.swift [13675:3502047] [error]警告:動態訪問器在解析類ABCDAddressBookSource的選擇器'serialNumber'時未能找到'serialNumber'實體ABCDAddressBookSource的@property實現。 。您是否記得在@implementation中聲明@dynamic或@synthesized? 2016-09-27 17:19:52.739108 TestCNContact.swift [13675:3502068] [error]警告:在解決類ABCDAddressBookSource上的選擇器'uniqueId'時,動態訪問器未能找到'uniqueId'實體ABCDAddressBookSource的@property實現。 。您是否記得在@implementation中聲明@dynamic或@synthesized?

+0

我知道它不會幫助,但我看到macOS上的那些相同的控制檯錯誤消息...沒有任何Xcode開發工作,我正在做。他們就在那裏。 – deitch

+0

@deitch謝謝,我感到孤獨......我沒有找到任何解決方法或解決辦法,我的應用程序被嚴重破壞。我填了一個雷達。 –

+0

我在此發送推文。至少有三個主要版本的OS X/macOS,這些少數特效產品 - soagent,callservicesd,nsurlsession - 將Mac帶到了另一端。真的很可憐 – deitch

回答

2

我找到了解決辦法!

Apple已經回答了我的問題,其中包含以下聲明: 「聯繫人現在要求任何使用它的人都與使用聯繫人權利進行了匹配。」

所以我做的是我沙盒我的應用程序,並授予「聯繫人訪問」權利。一切正常工作再次。

enter image description here

看來蘋果將不再接受非沙盒應用訪問聯繫人(或位置或日曆)。

2

我遇到了同樣的問題,但沙盒不是一個選項,因爲我們想通過Sparkle分發我們的應用程序。

在重新登錄時,我重新閱讀以下聲明:「聯繫人現在要求任何使用它的人都與使用聯繫人權利進行了代碼簽名」,並且想知道如果我擁有包含聯繫人的授權文件會發生什麼列出,但沙箱設置爲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> 

我使用Activity Monitor驗證過我的應用程序沒有沙箱,但仍能夠訪問地址簿。

+0

我認爲這是奇怪的,他們需要在用戶界面中啓用沙箱才能閱讀聯繫人。如果你需要OSX的自由,這是一個更好的解決方案 – Sirens