4

CNContactsEMPTY Phone Numbers で戻ってくる人がいるのはなぜですか?

次のような出力が得られます。

"phoneNumbers=(not fetched), emailAddresses=(not fetched),"

たとえば、シミュレータの組み込みの連絡先アプリから連絡先を取得すると、さまざまな結果が得られます。 電話番号"John Appleseed" 返されますが、返され"Kate Bell"ませ-彼女は明らかに電話番号を持っています. CNContactPhoneNumbersKeyフェッチリクエストで間違いなく使用している非常に奇妙な原因です。

これが私のコードです:

let fetchKeys = [ CNContactEmailAddressesKey, CNContactPhoneNumbersKey, 
                  CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName) ]
let contactFetchRequest = CNContactFetchRequest(keysToFetch: fetchKeys)

do { 
   try self.contactsStore.enumerateContactsWithFetchRequest(contactFetchRequest) {                     
   fetchedContact, stop in
         print("fetched Contact is: \n\(fetchedContact.description)")
   }
}

前述したように、取得した連絡先が電話番号と共に返される場合と返されない場合があることが出力からわかります。メールも同じです。返される場合と返されない場合があります。

これは、シミュレーターと iPhone で実行したときの両方で発生します。

ここで何が起こっているのでしょうか?

4

2 に答える 2

0

以下の行を info.plist に追加する必要があります。

 <key>NSContactsUsageDescription</key>
<string>$(PRODUCT_NAME) contact use</string>

そして、ユーザーがアプリ内の連絡先にアクセスして許可のアラートを表示するときは、次のようにそれを行うためのメソッドを呼び出す必要があります。

- (void)checkPermissionForCNContacts
{
    switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts])
    {
        case CNAuthorizationStatusNotDetermined:
        {
            [[[CNContactStore alloc] init] requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
                if (granted == YES)
                  [self METHOD_NAME_FOR_OPENING_THE_CONTACT_LIST];
            }];
        }
            break;
        case CNAuthorizationStatusRestricted:
        case CNAuthorizationStatusDenied:
            // Show custom alert
            break;
        case CNAuthorizationStatusAuthorized:
           [self METHOD_NAME_FOR_OPENING_THE_CONTACT_LIST];
            break;
    }
}

私が取ったメソッド コード: Programmatically Request Access to Contacts

これにより、連絡先リストのアクセス許可がユーザーに求められます。

于 2016-12-10T16:03:24.383 に答える