cyr*_*ril 5 swift ios10 sirikit
摘要
尝试编写代码,INSendPaymentIntent但无法区分具有相似名字的联系人。Siri 似乎在之后就开始循环INPersonResolutionResult.disambiguation(with: matchedContacts)
代码背后的想法
我最初选择使用联系人的名字来搜索联系人,因为INPerson如果用户仅指定名字,则使用显示名称会返回与查询匹配的第一个联系人。(即“向凯文支付 50 美元”将自动选择凯文·培根而不是凯文·史派西)。
不幸的是,使用给定的名字会使 Siri 陷入循环,要求用户一遍又一遍地指定联系人......
问题
有没有办法使用联系人的名字搜索联系人而不会让 Siri 陷入循环?
代码
func resolvePayee(forSendPayment intent: INSendPaymentIntent, with completion: (INPersonResolutionResult) -> Void) {
if let payee = intent.payee {
var resolutionResult: INPersonResolutionResult?
var matchedContacts: [INPerson] = []
let predicate = CNContact.predicateForContacts(matchingName: (payee.nameComponents?.givenName)!)
do {
let searchContactsResult = try CNContactStore().unifiedContacts(matching: predicate, keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactMiddleNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactIdentifierKey])
for contact in searchContactsResult {
matchedContacts.append(createContact((contact.phoneNumbers.first?.value.stringValue)!, contact: contact))
}
} catch {
completion(INPersonResolutionResult.unsupported())
}
switch matchedContacts.count {
case 2 ... Int.max:
resolutionResult = INPersonResolutionResult.disambiguation(with: matchedContacts)
case 1:
let recipientMatched = matchedContacts[0]
print("Matched a recipient: \(recipientMatched.displayName)")
resolutionResult = INPersonResolutionResult.success(with: recipientMatched)
case 0:
print("This is unsupported")
resolutionResult = INPersonResolutionResult.unsupported()
default:
break
}
completion(resolutionResult!)
} else {
completion(INPersonResolutionResult.needsValue())
}
}
Run Code Online (Sandbox Code Playgroud)
每当您返回此信息时,Siri 都会要求确认此人的姓名:
completion(INPersonResolutionResult.needsValue())
Run Code Online (Sandbox Code Playgroud)
或这个:
completion(INPersonResolutionResult.disambiguation(with: matchedContacts))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为它更有可能进入循环,因为您不断返回第二个结果(INPersonResolutionResult.disambiguation)。这意味着您在这一行中的查询不断返回 2 人或更多:
let searchContactsResult = try CNContactStore().unifiedContacts(matching: predicate, keysToFetch:[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactMiddleNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactIdentifierKey])
Run Code Online (Sandbox Code Playgroud)
我建议你调试该行,看看你是否给 Siri 返回了这个值:
INPersonResolutionResult.success
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1025 次 |
| 最近记录: |