14

このコードはiOS5.1で正常に機能し、iOS6のiPhoneシミュレーターでも機能します。iOS6を実行しているiPhone4ではサイレントに失敗します。その結果、連絡先アプリに人を追加できなくなります。次のコードスニペットはどちらも機能しません(ログはそれぞれに続きます)。

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エラー=操作を完了できませんでした。(ABAddressBookErrorDomainエラー1。)


すべてのソースを取得してから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 =()

4

3 に答える 3

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
  }
于 2012-10-03T01:52:11.680 に答える
3

このログ メッセージは、アプリが連絡先へのアクセスを許可されていない (おそらくまだ許可されていない) ことを示しています。iOS 6 では、ユーザーはアプリがアドレス帳にアクセスする許可を拒否することができます。

ポップアップ ダイアログを使用するか、[設定] -> [プライバシー] -> [連絡先] に移動して、ユーザーがアプリに連絡先へのアクセスを許可すると、メッセージは消えます。

このトピックの詳細については、WWDC 2012 セッション 710「iOS および OS X でのプライバシー サポート」を参照してください。

于 2012-09-26T15:58:25.787 に答える
0

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
    }
}

お役に立てれば!

于 2016-04-08T17:54:17.903 に答える