2017-12-22 34 views
0

내 OSX 앱을 사용하면 연락처 목록에서 연락처를 선택하고 세부 정보를 고객 레코드에로드 할 수 있습니다. CNContactPicker를 사용하여 연락처를 CNContact 레코드로 가져옵니다. 검색해야하는 필드 중 하나가 organizationName입니다. 이것은 High Sierra 이전의 OS에서 완벽하게 작동하지만 High Sierra로 업그레이드하면 충돌이 발생합니다. 다른 모든 CNContact 필드는 아무 문제없이 검색 할 수 있습니다 (예 : 이름, 이메일, 주소 등). 내 info.plist 파일에서 요청한 권한이 있습니다.Swift OSX High Sierra의 CNContact.organizationName 크래시

연락처에 조직 이름이 있거나 없으면 아무런 차이가 없습니다. 코드의 관점에서 보여별로

:

// 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를 수행하여 지정된 키 (예 : 조직)를 사용하여 식별자를 사용하여이 특정 연락처를 다시 가져와야합니다. 확실 조직 이름을 사용할 확인하려면 은 (CNContactPicker의 대리자 메서드에서 반환) 동일한 식별자를 가진 연락처의 CNFetchRequest을 실행하고 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) 
} 
: 여기

코드입니다