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

iOS Swift 5:无需快捷指令实现Siri VoIP呼叫替代应用名支持问题

问题分析与解决方案

核心问题

你遇到的情况本质是:Siri的应用启动匹配逻辑(识别别名打开应用)和Intent触发逻辑(识别别名关联应用的呼叫能力)是两套独立机制。CFBundleSpokenName和INAlternativeAppNames只负责前者,要让别名触发INStartCallIntent,需要额外配置关联Intent的匹配规则。


具体解决步骤

1. 同步别名配置到Intent扩展

Intent扩展是独立的目标,Siri匹配呼叫Intent时会优先检查扩展的配置,而非主应用。需要在主应用和TestSiriSimpleIntents扩展的Info.plist中都添加INAlternativeAppNames:

<key>INAlternativeAppNames</key>
<array>
    <string>Next</string>
    <string>Dog</string>
    <string>Cat</string>
</array>

2. 添加自定义词汇绑定别名与应用Intent能力

创建CustomVocabulary.plist文件(添加到主应用和Intent扩展目标),明确告诉Siri这些别名对应的是你的应用,且该应用支持呼叫Intent:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>INVocabularyTitle</key>
    <string>App Aliases</string>
    <key>INVocabularyItems</key>
    <array>
        <dict>
            <key>INVocabularyItemIdentifier</key>
            <string>你的应用Bundle ID</string> <!-- 替换成实际的Bundle ID -->
            <key>INVocabularyItemVocabularyType</key>
            <string>INVocabularyTypeAppName</string>
            <key>INVocabularyItemPhrase</key>
            <array>
                <string>Next</string>
                <string>Dog</string>
                <string>Cat</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

然后在主应用的Info.plist中添加:

<key>INVocabularyFile</key>
<string>CustomVocabulary.plist</string>

3. 修正Intent Handler的逻辑

在StartCallIntentHandler中主动确认目标应用ID,避免Siri因别名匹配错误导致的参数异常:

func handle(intent: INStartCallIntent, completion: @escaping (INStartCallIntentResponse) -> Void) {
    // 强制绑定当前应用的Bundle ID,确保Intent指向正确应用
    let fixedIntent = INStartCallIntent(
        caller: intent.caller,
        recipients: intent.recipients,
        callCapability: intent.callCapability,
        destinationType: intent.destinationType,
        targetAppBundleIdentifier: Bundle.main.bundleIdentifier
    )
    
    // 手动校验联系人解析结果
    guard let recipient = fixedIntent.recipients?.first else {
        completion(INStartCallIntentResponse(code: .failure, userActivity: nil))
        return
    }
    
    // 执行你的VoIP呼叫逻辑
    // ...
    
    completion(INStartCallIntentResponse(code: .success, userActivity: nil))
}

4. 重置Siri缓存

Siri会缓存应用的Intent配置,修改后需要:

  • 删除设备上的应用,重新部署
  • 进入「设置」→「Siri与搜索」,关闭「嘿Siri」和「Siri建议」,重启设备后再重新开启
  • 重新授予应用Siri权限

现象解释

  • 别名能打开应用:因为CFBundleSpokenName和INAlternativeAppNames属于Siri的应用启动路由规则,和Intent处理无关
  • 别名触发呼叫失败:Siri默认只会把正式应用名和对应的Intent能力绑定,没有配置自定义词汇时,它无法识别“Next/Dog/Cat”对应的应用支持呼叫Intent,因此出现找不到应用或解析联系人错误的提示

内容的提问来源于stack exchange,提问作者Lex Brouwers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:24:38