2

デバイスでは機能せず、ABAddressbook のシミュレータで作業しているグループに連絡先を追加すると、エラーは発生しませんが、連絡先は連絡先の特定のグループに反映されませんが、シミュレータでは正常に機能します

私はこのコードを使用しています

if (person) {
           ABAddressBookAddRecord(addressBook, person, nil);

           ABAddressBookSave(addressBook, &error);

           BOOL isADDED = ABGroupAddMember(groupNameRef, person, &error);

           NSError *error1 = (__bridge_transfer NSError *)error;

           NSLog(@"Reason = %@", error1.localizedFailureReason);
           BOOL iSSaved = ABAddressBookSave(addressBook, &error);
}

シミュレータでは正常に動作しますが、デバイスでは動作しません

4

1 に答える 1

2

エラーチェックを正しく使用することから始めるのに役立ちます。エラー チェック ルーチンの構造は次のとおりです。

if (person) {
    bool ok;
    CFErrorRef err = nil;
    ok = ABAddressBookAddRecord(addressBook, person, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
    ok = ABAddressBookSave(addressBook, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
    ok = ABGroupAddMember(groupNameRef, person, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
    ok = ABAddressBookSave(addressBook, &err);
    if (!ok) {
        NSLog(@"%@", err);
        return;
    }
}

ここでパターンに注目してください。関数は bool を返します。あなたはそのブールを調べます。false の場合は、インダイレクションによって返されたエラーを調べます。このパターンに正しく従えば、何がうまくいかないのかについてより良い情報を得ることができます。

編集:連絡先データベースに実際にアクセスできることを確認してください。私はあなたがそうしていると思いますが、シミュレーターとデバイスの主な違いは、シミュレーターが自動的にアクセスを許可するのに対し、デバイスではユーザーにアクセス要求ダイアログ (call ABAddressBookRequestAccessWithCompletion) を提示する必要があることです。そうしないとアクセスできません。連絡先データベースを操作しようとすると、おそらくサイレントに失敗します。

于 2013-05-15T15:20:09.927 に答える