2012-09-24 76 views
14

此代碼工作確定在iOS 5.1和也做在iPhone模擬器與iOS 6,它靜靜地失敗在我的iPhone 4運行iOS 6的工作最終的結果是,我無法將個人添加到「通訊錄」應用。無論是下面的代碼片段工作(日誌如下每個):無法在設備訪問聯繫人源在iOS 6中

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(_addressBook); 
NSLog(@"2 - defaultSource = %@", defaultSource); 

AB:無法查詢編譯語句(ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECT ROWID,名稱,ExternalIdentifier,類型,ConstraintsPath,ExternalModificationTag,ExternalSyncTag,帳戶ID, Enabled,SyncData,MeIdentifier,Capabilities FROM ABStore WHERE Enabled =?;

2012年9月24日11:00:36.731 QR電子名片[193:907] 2 - defaultSource =(CPRecord:0x1f59fd50 ABStore)

當我試圖將一個人添加到地址簿中我得到這個(似乎是因爲來源無效,即使它看起來可能是從上面):

2012-09-24 11:18:32.231 QR vCard [220:907] ABAddressBookAddRecord error =操作cann沒有完成。 (ABAddressBookErrorDomain錯誤1)


我以爲我可以得到所有的源,然後挑一個,但下面的回報根本就沒有:

CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources (_addressBook); 
NSLog(@"2 - allSources = %@", allSources); 

AB:無法查詢編譯語句( ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECT ROWID,名稱,ExternalIdentifier,類型,ConstraintsPath,ExternalModificationTag,ExternalSyncTag,帳戶ID,啓用,SyncData,MeIdentifier,能力FROM ABStore WHERE啓用=;

2012年9月24日10:58:09.908 QR電子名片[177:907] 2 - =免責()

+0

我發現,在iOS 6中,您需要用戶的PERMISSION才能將人員添加到AddressBook。蘋果再次保護我們。添加到代碼的複雜性... –

回答

3

該日誌消息是指示自己的應用無法(也許還沒有)允許訪問聯繫方式。 iOS 6使用戶有可能拒絕應用程序訪問地址簿的權限。

信息消失,一旦用戶允許聯繫您的應用程序訪問 - 無論是通過彈出的窗口,或轉到設置 - >高級 - >聯繫人。

有關此主題的更多相關信息,請參閱WWDC 2012屆710「在iOS和OS X隱私的支持」。

+0

你的建議是節省我的很多time.thanks – Anju

24

我有同樣的問題,我不能得到允許訪問聯繫人警惕彈出。

答案被張貼凱爾在這裏: https://stackoverflow.com/a/12648938/480415

// Request authorization to Address Book 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); 

    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { 
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { 
      // First time access has been granted, add the contact 
    }); 
    } 
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { 
     // The user has previously given access, add the contact 
    } 
    else { 
     // The user has previously denied access 
     // Send an alert telling user to change privacy setting in settings app 
    } 
0

如果你從谷歌來到這裏和你使用的是iOS的新CNContactStore框架,並得到這些錯誤,請繼續閱讀:

我我認爲把我的CNContactStore作爲一個用類實例初始化的成員變量會更清晰:

class foo { 
    var contactStore = CNContactStore() 

    func findByIdentifier(identifier: String) -> CNContact { 
     let contact = try self.contactStore.unifiedContactWithIdentifier(identifier... 
     return contact 
    } 
} 

後,我叫這個50倍左右,它開始了示數與

AB:查詢無法編譯語句(ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties)

我試圖限速我的電話,但沒有幫幫我。原來,實例化一個新的CNContactStore爲調用了零個的性能後果,徹底解決了這個問題對我來說:

class foo { 

    func findByIdentifier(identifier: String) -> CNContact { 
     let contactStore = CNContactStore() 
     let contact = try contactStore.unifiedContactWithIdentifier(identifier... 
     return contact 
    } 
} 

希望這有助於!