1

iOS の電話帳から連絡先を取得する新しいバージョンを使用しています。最初のクエリで返される一意の識別子に問題があります。通常、一意の識別子は UUID ですが、「:ABPerson」が追加される場合もあります。この識別子を使用して電話帳 API を照会すると、うまくいく場合もありますが、常にうまくいくとは限りません。この動作を回避する方法があるかどうか、誰かが知っていますか? 現在、私は 2 つのクエリの保護を試しています。1 つ目は識別子をそのまま使用する方法で、2 つ目 (最初の方法が失敗した場合) は、「: ABPerson」拡張子を削除して識別子を使用する方法です。

最初に使用されるクエリは次のとおりです。

class func getAllPhoneBookContacts() -> [PhonebookContact] {
    let contactStore = CNContactStore()
    var contacts = [PhonebookContact]()
    PhoneBookContactsHelper.requestForAccess { (accessGranted) -> Void in
        if accessGranted {
            let keys = [CNContactIdentifierKey, CNContactPhoneNumbersKey]

            do {
                let fetchRequest = CNContactFetchRequest(keysToFetch: keys)
                try contactStore.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (contact: CNContact, _) -> Void in
                    for phoneNoLab in contact.phoneNumbers {
                        if let phoneNo = phoneNoLab.value as? CNPhoneNumber,
                        normalizedPhoneNumber = PhoneNumberNormalizer.normalizePhoneNumber(phoneNo.stringValue) {
                            let pbc = PhonebookContact(contactID: contact.identifier, phoneNumber: normalizedPhoneNumber)
                            contacts.append(pbc)
                        }
                    }
                })
            }
            catch {
                NSLog("Unable to fetch contacts.")
            }
        }
    }
    return contacts
}

後で識別子によって特定の連絡先に再度アクセスするには、次のようにします。

class func getContactNameByUUID(identifier: String) -> String?{
    var name : String?
    PhoneBookContactsHelper.requestForAccess()
        { (accessGranted) -> Void in
            if accessGranted {
                let contactStore = CNContactStore()
                let keys = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName)]
                do {
                    let cnc = try contactStore.unifiedContactWithIdentifier(identifier, keysToFetch: keys)
                    name = CNContactFormatter.stringFromContact(cnc, style: .FullName)!
                }
                catch _ {
                    NSLog("Could not fetch contact with id \(identifier))")
                }
            }
    }
    return name
}

私は iOS 9 を使用しており、シミュレーターとさまざまな iPhone でテストしましたが、予期しない動作がいたるところに見られます。

4

0 に答える 0