2017-12-22 19 views
0

OSXアプリケーションでは、連絡先リストから連絡先を選択し、詳細を顧客レコードに読み込むことができます。 CNContactPickerを使用して連絡先をCNContactレコードに取得しています。取得する必要があるフィールドの1つがorganizationNameです。これはHigh Sierra以前のOSでは完全に機能しますが、High Sierraにアップグレードするとクラッシュします。他のすべてのCNContactフィールドは、問題なく(名前、電子メール、住所など)検索できます。私はinfo.plistファイルで要求された権限を持っています。Swift OSX CNContact.organizationNameがHigh Sierraでクラッシュする

連絡先に組織名があるかどうかは関係ありません。コードの面で表示しないようにずっと

// This fails on 1st line - any reference to organizationName causes failure 
if (contact.organizationName != "") { 
     self.name = contact.organizationName 
} 

// This works 
if (contact.givenName != "") { 
     self.name = contact.givenName 
} 

// This works 
if (contact.contactType == CNContactType.organization) { 
    // Do something 
} 

実際のエラーがある:接触がフェッチされたとき、[一般]プロパティが要求されませんでした。

このエラーが発生する原因はOSに何が変更されたのかを知りたいのですが、解決策や回避策があれば教えてください。

答えて

1

私はAppleにバグレポートを提出し、私の問題を解決する以下の回答を受けました。基本的には、ユーザーが選択した連絡先を取得したにもかかわらず、CNContactFetchRequestを実行して、指定されたキー(例:組織)を使用してこの特定の連絡先を(識別子を使用して)再度取得する必要があります。あなたは、organizationNameのが利用可能であることを確認し、同じ識別子との接触のためCNFetchRequestを実行する(CNContactPickerデリゲートメソッドから返される)とCNContactOrganizationNameを含むフェッチするキーのセットを提供したい場合は :ここ

はその正確な応答です。ここで

はコードです:

var validContacts: [CNContact] = [] 
let contactStore = CNContactStore() 
do { 
    // Specify the key fields that you want to be fetched. 
    // Note: if you didn't specify your specific field request. your app will crash 
    let fetchRequest = CNContactFetchRequest(keysToFetch: [CNContactOrganizationNameKey as CNKeyDescriptor]) 

    fetchRequest.predicate = CNContact.predicateForContacts(withIdentifiers: [contact.identifier]) 

    try contactStore.enumerateContacts(with: fetchRequest, usingBlock: { (contact, error) -> Void in 
      validContacts.append(contact) 
    }) 
    for validContact in validContacts { 
      // Do something with your contact, there should be only one. 
    } 
} catch let e as NSError { 
    print(e) 
} 
関連する問題