iOS 分享扩展(五):解锁 iOS 分享面板的神秘的联系人推荐功能

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

=====

前几篇我们讲了分享扩展的相关功能,今天我们基于之前的文章,进一步深入探讨,看看还有哪些值得关注的功能。

往期文章:

iOS 分享扩展(一):如何让你的 App 出现在 iOS 系统的分享面板中

iOS 分享扩展(二):info.plist 文件配置全解析

iOS 分享扩展(三):轻松定制 iOS 分享界面,提升用户体验

iOS 分享扩展(四):让分享扩展与主应用无缝衔接

在使用系统分享面板时,你一定见过类似的面板,在普通的分享面板上方,有一栏联系人,可以快捷点击某个人进行分享,类似这样:

这个功能叫做分享建议列表,苹果会根据你分享的内容展示出你最常用的 App,以便于快速分享。这篇文章将指导你如何在 iOS 中实现对话建议功能,以提升用户的分享体验。

在分享面板中显示建议列表

首先,你需要为你的项目创建一个分享扩展,这个在之前的文章中都有详细介绍过,没看过的小伙伴可以翻翻之前的文章,这里就不赘述了。

我们基于之前的文章和代码,继续实现对话建议功能。

支持发送消息意图

还记得我们创建分享扩展时自动创建的 info.plist 文件吗,打开这个文件,然后展开 NSExtension 和 NSExtensionAttributes 的部分。然后,添加一个新的 key:IntentsSupported,并将这个值的类型设置为 Array。在这个数组中,添加一个新的字符串 INSendMessageIntent。

这一步配置表示你的扩展支持 INSendMessageIntent 意图类型。

主工程配置

现在打开主工程的 Info.plist 文件,在信息属性列表中展开。接下来,添加一个 key:NSUserActivityTypes,类型为 Array,在其下边添加字符串 INSendMessageIntent。

这样配置是为了让主工程支持 INSendMessageIntent 意图类型。

主工程代码实现

要想实现对话建议功能,我们需要在主工程中调用相关代码生成联系人接收者。

代码如下:

swift 复制代码
func generateRecipient(name: String, img: String, conversationIdentifier: String) {
    let groupName = INSpeakableString(spokenPhrase: name)
    let sendMessageIntent = INSendMessageIntent(recipients: nil,
                                                content: nil,
                                                speakableGroupName: groupName,
                                                conversationIdentifier: conversationIdentifier,
                                                serviceName: nil,
                                                sender: nil)


    let image = INImage(named: img)
    sendMessageIntent.setImage(image, forParameterNamed: \.speakableGroupName)

    let interaction = INInteraction(intent: sendMessageIntent, response: nil)
    interaction.donate(completion: { error in
        if error != nil {
            print("error: \(error)")
        } else {
            print("success")
        }
    })
}

然后我们在合适的时机调用这个方法即可,每当你调用一次,就会在 Share Sheet 中生成一个联系人接收者,举个例子,如果你是一个社交应用,那么你可以在一个用户给另一个用户发消息的时候调用这个方法,这样当这个用户每次分享时,系统都会在弹出的菜单中显示这个用户的对话建议。

为了演示效果,我在主工程的 touchBegan 方法中调用了几次这个方法,生成接收者:

less 复制代码
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    generateRecipient(name: "Test Name", img: "", conversationIdentifier: "ID1")
    generateRecipient(name: "Juan Chavez", img: "test_image", conversationIdentifier: "ID2")
    generateRecipient(name: "iOS 新知", img: "test_image", conversationIdentifier: "ID3")
}

这时,当我们再次运行程序,并点击分享按钮时,就会在 Share Sheet 中看到我们生成的对话建议:

后续的读取分享内容和共享到主 App 等操作和之前文章所讲的一样,不懂的可以去翻看之前的文章。

一些需要注意的地方

如果你用的是模拟器,可能你生成的对话建议不会显示,因为模拟器不支持这个功能,最好用真机测试。

在我测试过程中,发现效果可能有一定延迟,所以即使你用真机测试,也不一定每次都能立即看到效果,如果看不到效果可以稍等片刻再试。

结论

通过今天的内容,我们实现了在分享扩展中生成对话建议的功能,这样当用户分享时,可以在 Share Sheet 中看到我们生成的对话建议,从而提升用户体验。希望这篇文章对你有帮助,有任何问题欢迎留言交流。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
和沐阳学逆向5 小时前
iOS逆向_古法逆向_Instagram最新版抓包
macos·ios·cocoa
Digitally14 小时前
如何将真我(realme)手机数据传输至 iPhone
ios·智能手机·iphone
JFSJHFZJ18 小时前
解密iPhone核心技术,读懂苹果的硬实力
ios·cocoa·iphone
JXSJHF20 小时前
iPhone隐藏功能大盘点,免费好用不占内存
ios·iphone
ZZH_AI项目交付1 天前
为什么很多复杂跳转,最后都得先回首页?
flutter·ios
vx-bot5556661 天前
企业微信ipad协议在客户画像构建中的应用实践
ios·企业微信·ipad
2501_916008892 天前
2026 iOS 证书管理,告别钥匙串依赖,构建可复制的签名环境
android·ios·小程序·https·uni-app·iphone·webview
YJlio2 天前
《Windows 11 从入门到精通》读书笔记 1.4.9:全新的微软应用商店——“库 + 多设备同步”把它从鸡肋变成刚需入口
c语言·网络·python·数码相机·microsoft·ios·iphone
YJlio2 天前
《Windows 11 从入门到精通》读书笔记 1.4.10:集成的微软 Teams——办公与社交的无缝衔接
c语言·网络·python·数码相机·ios·django·iphone
zhangjikuan892 天前
SwiftUI 状态管理与架构实战
ios·架构·swiftui