【问题标题】:Can't Access Contacts Sources on Device in iOS 6在 iOS 6 中无法访问设备上的联系人源
【发布时间】:2012-09-24 18:31:47
【问题描述】:

此代码在 iOS 5.1 上运行良好,并且在 iOS 6 的 iPhone 模拟器中也可以运行。它在运行 iOS 6 的 iPhone 4 上静默失败。最终结果是我无法将人员添加到联系人应用程序。以下代码 sn-ps 都不起作用(日志跟随每个):

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

AB:无法编译查询语句 (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECT ROWID, Name, ExternalIdentifier, Type, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Enabled, SyncData, MeIdentifier, Capabilities FROM ABStore WHERE Enabled = ?;

2012-09-24 11:00:36.731 QR vCard[193:907] 2 - defaultSource = (CPRecord: 0x1f59fd50 ABStore)

当我尝试将一个人添加到通讯簿时,我得到了这个(似乎是因为来源无效,尽管从上面看起来它可能没问题):

2012-09-24 11:18:32.231 QR vCard[220:907] ABAddressBookAddRecord 错误 = 操作无法完成。 (ABAAddressBookErrorDomain 错误 1。)


我以为我可以获取所有来源,然后选择一个,但以下内容根本没有返回:

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

AB:无法编译查询语句 (ABCCopyArrayOfAllInstancesOfClassInSourceMatchingProperties): SELECT ROWID, Name, ExternalIdentifier, Type, ConstraintsPath, ExternalModificationTag, ExternalSyncTag, AccountID, Enabled, SyncData, MeIdentifier, Capabilities FROM ABStore WHERE Enabled = ?;

2012-09-24 10:58:09.908 QR vCard[177:907] 2 - allSources = ()

【问题讨论】:

  • 我发现在 iOS 6 中,您需要用户的许可才能将人员添加到地址簿。苹果再次保护我们。增加了代码的复杂性...

标签: ios addressbook


【解决方案1】:

我遇到了同样的问题,我无法弹出允许访问联系人警报。

Kyle 在这里发布了答案: 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
  }

【讨论】:

    【解决方案2】:

    此日志消息表明您的应用未被(可能尚未)允许访问通讯录。 iOS 6 允许用户拒绝应用程序访问地址簿的权限。

    一旦用户允许您的应用访问通讯录(通过弹出对话框或转到设置 -> 隐私 -> 通讯录),该消息就会消失。

    有关此主题的更多信息,请参阅 WWDC 2012 会议 710“iOS 和 OS X 中的隐私支持”。

    【讨论】:

      【解决方案3】:

      如果您是从 Google 获得的,并且您正在使用 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
          }
      }
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 2023-04-05
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多