如何将应用程序与 iOS 联系人应用程序集成?
How to integrate app with iOS Contacts app?
我正在尝试将消息传递应用程序与 iOS 通讯录应用程序集成,以便用户可以通过该应用程序直接从通讯录发送消息。 WWDC 2016 session 240 中对此进行了介绍,但显然省略了一些细节。
按照 WWDC 示例,我有:
将 activity 类型添加到应用的 Info.plist
:
<key>NSUserActivityTypes</key>
<array>
<string>INSendMessageIntent</string>
</array>
在我的应用委托中实现了application(_:continue:restorationHandler:)
。
创建并捐赠了一次互动
let activity = NSUserActivity(activityType: "com.example.message")
activity.title = "Send CB Test Message"
activity.expirationDate = Date.distantFuture
let recipient = INPerson( /* recipient with an email address in my Contacts database */ )
let sender = INPerson( /* me */ )
let intent = INSendMessageIntent(recipients: [recipient], content: nil, groupName: nil, serviceName: "CB Test Chat", sender: sender)
let response = INSendMessageIntentResponse(code: .success, userActivity: activity)
let interaction = INInteraction(intent: intent, response: response)
interaction.direction = .outgoing
interaction.donate { (error) in
print("Donated")
if let error = error {
print("Donate error: \(error)")
}
}
这 种 有效。该应用程序显示为一个选项 在一个收件人的名片上 的通讯录中。在“通讯录”中点击它会启动我的应用程序并显示 NSUserActivity
。这很好,但还不够。
WWDC session 以 WhatsApp 为例。 WhatsApp 在我的所有 联系人中显示为一个选项,即使是那些没有 WhatsApp 帐户的联系人。我想也许 WhatsApp 已经为每个人创建并捐赠了互动。但是,如果我在没有 WhatsApp 运行 的情况下创建新联系人,它会立即成为该联系人的一个选项。我做了一些实验,将接收者参数设置为 nil 或一个空数组,但没有任何效果。
那么我在这里缺少什么?我很接近,也许?不过好像捐赠互动并不是我真正需要的。
更新,回应@Mark:澄清了activity
的用法。我已经尝试使用 response
(它使用 activity
)并且 response
的值为 nil 但都没有用。
只需使用 UIActivityViewController。您可以用文本或任何对象实例化它。如果需要,您还可以排除除消息以外的所有类型。
let objectsToShare = [textToShare, otherObject] as [Any]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
//New Excluded Activities Code
activityVC.excludedActivityTypes = [UIActivityType.addToReadingList]
activityVC.popoverPresentationController?.sourceView = sender as? UIView
present(activityVC, animated: true, completion: nil)
我在 WWDC 2019 上问过这个问题,被告知这种大规模捐赠仅适用于 VOIP 应用程序,不适用于消息传递应用程序。这个问题中的代码在理论上适用于 VOIP——可能与所提供的完全一样,也可能不完全一样。我没有尝试过,因为我没有开发合适的应用程序。
我正在尝试将消息传递应用程序与 iOS 通讯录应用程序集成,以便用户可以通过该应用程序直接从通讯录发送消息。 WWDC 2016 session 240 中对此进行了介绍,但显然省略了一些细节。
按照 WWDC 示例,我有:
将 activity 类型添加到应用的
Info.plist
:<key>NSUserActivityTypes</key> <array> <string>INSendMessageIntent</string> </array>
在我的应用委托中实现了
application(_:continue:restorationHandler:)
。创建并捐赠了一次互动
let activity = NSUserActivity(activityType: "com.example.message") activity.title = "Send CB Test Message" activity.expirationDate = Date.distantFuture let recipient = INPerson( /* recipient with an email address in my Contacts database */ ) let sender = INPerson( /* me */ ) let intent = INSendMessageIntent(recipients: [recipient], content: nil, groupName: nil, serviceName: "CB Test Chat", sender: sender) let response = INSendMessageIntentResponse(code: .success, userActivity: activity) let interaction = INInteraction(intent: intent, response: response) interaction.direction = .outgoing interaction.donate { (error) in print("Donated") if let error = error { print("Donate error: \(error)") } }
这 种 有效。该应用程序显示为一个选项 在一个收件人的名片上 的通讯录中。在“通讯录”中点击它会启动我的应用程序并显示 NSUserActivity
。这很好,但还不够。
WWDC session 以 WhatsApp 为例。 WhatsApp 在我的所有 联系人中显示为一个选项,即使是那些没有 WhatsApp 帐户的联系人。我想也许 WhatsApp 已经为每个人创建并捐赠了互动。但是,如果我在没有 WhatsApp 运行 的情况下创建新联系人,它会立即成为该联系人的一个选项。我做了一些实验,将接收者参数设置为 nil 或一个空数组,但没有任何效果。
那么我在这里缺少什么?我很接近,也许?不过好像捐赠互动并不是我真正需要的。
更新,回应@Mark:澄清了activity
的用法。我已经尝试使用 response
(它使用 activity
)并且 response
的值为 nil 但都没有用。
只需使用 UIActivityViewController。您可以用文本或任何对象实例化它。如果需要,您还可以排除除消息以外的所有类型。
let objectsToShare = [textToShare, otherObject] as [Any]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
//New Excluded Activities Code
activityVC.excludedActivityTypes = [UIActivityType.addToReadingList]
activityVC.popoverPresentationController?.sourceView = sender as? UIView
present(activityVC, animated: true, completion: nil)
我在 WWDC 2019 上问过这个问题,被告知这种大规模捐赠仅适用于 VOIP 应用程序,不适用于消息传递应用程序。这个问题中的代码在理论上适用于 VOIP——可能与所提供的完全一样,也可能不完全一样。我没有尝试过,因为我没有开发合适的应用程序。