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 でテストしましたが、予期しない動作がいたるところに見られます。