如何实现Kindle选词后唤起自定义iOS应用进行查词?
如何让你的iOS词典应用关联Kindle实现选词查词
嘿,这个需求我之前帮不少开发者捋过,其实可以通过iOS的自定义URL Scheme和**共享扩展(Share Extension)**组合来实现,下面给你一步步拆解具体操作:
1. 给你的应用配置自定义URL Scheme
这一步是为了让Kindle(或者其他应用)能唤起你的主应用并传递选中的文本:
- 打开Xcode里你的项目,找到
Info.plist文件,添加CFBundleURLTypes数组,配置专属的URL Scheme(比如my-dictionary-app,记得换成你自己的唯一标识)。示例代码如下:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>my-dictionary-app</string> </array> <key>CFBundleURLName</key> <string>com.yourcompany.YourDictionaryApp</string> </dict> </array>
- 接下来在主应用的
AppDelegate(或者SceneDelegate,根据你用的iOS版本)里实现URL处理逻辑,提取传递过来的查词文本。比如:
// SceneDelegate示例 func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url, url.scheme == "my-dictionary-app" else { return } if let text = url.queryParameters?["text"] { // 这里处理查词逻辑,比如跳转到查词页面展示结果 print("要查询的文本:\(text)") } } // 方便提取URL参数的扩展 extension URL { var queryParameters: [String: String]? { guard let components = URLComponents(url: self, resolvingAgainstBaseURL: true), let queryItems = components.queryItems else { return nil } return queryItems.reduce(into: [String: String]()) { result, item in result[item.name] = item.value } } }
2. 实现共享扩展(Share Extension)
Kindle的选词菜单里自带“共享”选项,我们可以通过共享扩展让你的应用出现在这个列表里,承接用户选中的文本:
- 在Xcode中给项目添加新Target,选择Share Extension,起个清晰的名字比如“Dictionary Share Extension”。
- 配置扩展的
Info.plist,设置激活规则让它只接收文本内容,避免在不相关的场景下出现:
<key>NSExtensionActivationRule</key> <string>SUBQUERY (extensionItems, $item, SUBQUERY ($item.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text").@count >= 1).@count >= 1</string>
- 打开扩展的
ShareViewController,实现didSelectPost方法,获取用户选中的文本,再通过自定义URL Scheme唤起主应用:
import UIKit import Social class ShareViewController: SLComposeServiceViewController { override func didSelectPost() { guard let extensionItem = extensionContext?.inputItems.first as? NSExtensionItem, let attachment = extensionItem.attachments?.first as? NSItemProvider, attachment.hasItemConformingToTypeIdentifier("public.plain-text") else { finish() return } attachment.loadItem(forTypeIdentifier: "public.plain-text", options: nil) { [weak self] (item, error) in guard let self = self, let selectedText = item as? String else { self?.finish() return } // 编码文本避免URL转义问题 guard let encodedText = selectedText.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let appURL = URL(string: "my-dictionary-app://search?text=\(encodedText)") else { self.finish() return } // 唤起主应用 self.open(appURL) { success in self.finish() } } } private func finish() { extensionContext?.completeRequest(returningItems: [], completionHandler: nil) } }
3. 优化用户体验的小细节
- 在扩展的
Info.plist里设置NSExtensionDisplayName,比如填“用我的词典查词”,这样用户在Kindle的共享菜单里能一眼认出你的选项。 - 主应用处理URL时,要做容错处理:比如文本为空、URL解析失败的情况,给用户弹出提示。
- 如果想让流程更顺滑,可以考虑在共享扩展里直接做简单的查词展示(不用唤起主应用),但要注意扩展的内存限制(iOS给扩展的内存配额不多,复杂逻辑可能会崩溃)。
关键注意点
Kindle没有公开的官方API直接让第三方应用加入它的原生选词菜单,所以通过系统共享扩展是目前最稳定可行的方案——几乎所有支持文本选择的iOS应用都会兼容系统共享功能,用户的学习成本也很低。
测试的时候记得把主应用和共享扩展都安装到同一台设备上,在Kindle里选中文本后点击“共享”,就能看到你的扩展选项啦~
内容的提问来源于stack exchange,提问作者Tony Shaker
相关产品推荐
相关产品推荐

