Can't Access Contacts Sources on Device in iOS 6

后端 未结 3 1153
遥遥无期
遥遥无期 2021-02-13 10:39

This code worked OK on iOS 5.1 and also does work in the iPhone simulator with iOS 6. It fails silently on my iPhone 4 running iOS 6. The end result is that I cannot add a per

相关标签:
3条回答
  • 2021-02-13 10:50

    I had the same issue and I could not get the Allow Access To Contacts alert to popup.

    The Answer was posted by Kyle here: 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 讨论(0)
  • 2021-02-13 10:51

    This log message is an indication that your app is not (maybe not yet) allowed to access Contacts. iOS 6 gives users the possibility to deny apps the permission to access the address book.

    The message disappears once the user has allowed your app access to Contacts - either via the pop up dialog, or by going to Settings -> Privacy -> Contacts.

    For more infos on this topic, see WWDC 2012 session 710 "Privacy support in iOS and OS X".

    0 讨论(0)
  • 2021-02-13 11:06

    If you got here from Google and you're using iOS's new CNContactStore framework, and getting these errors, read on:

    I thought it'd be cleaner to make my CNContactStore a member variable that was initialized with the class instance:

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

    After I called this about fifty times, it started erroring out with

    AB: Could not compile statement for query (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties)

    I tried rate-limiting my calls, but that didn't help. It turned out that instantiating a new CNContactStore for every call had zero performance ramifications and completely solved the problem for me:

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

    Hope this helps!

    0 讨论(0)
提交回复
热议问题