You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:03:48