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

远程Swift Package中IntentDefinition初始化失败问题求助

解决方案

1. 在Swift Package中声明Intent资源

首先需要在Package.swift里明确将.intentdefinition文件标记为需要处理的资源,确保Package构建时能正确打包资源:

let package = Package(
    name: "YourWidgetPackage",
    products: [
        .library(name: "YourWidgetPackage", targets: ["YourWidgetPackage"]),
    ],
    targets: [
        .target(
            name: "YourWidgetPackage",
            resources: [
                // 替换为你的.intentdefinition文件实际路径
                .process("Resources/WorkoutIntent.intentdefinition")
            ]
        ),
        .testTarget(
            name: "YourWidgetPackageTests",
            dependencies: ["YourWidgetPackage"]
        ),
    ]
)

2. 为主应用的Widget Extension添加资源复制步骤

即使Package声明了资源,Widget Extension目标可能无法自动获取到Intent文件,需要手动添加构建步骤复制资源:

  • 打开主应用项目,选中Widget Extension Target
  • 切换到Build Phases标签,点击+ → New Copy Files Phase
  • 设置Destination为Resources,Subpath留空
  • 点击+按钮,选择Swift Package中的.intentdefinition文件(若找不到,可直接从Package本地路径手动添加)

3. 修正Intent代码的Bundle引用

手动生成的Intent代码默认可能使用Bundle.main,但Swift Package的资源存放在自身bundle中,需要修改生成的代码使用Bundle.module:
找到生成的WorkoutIntent.swift文件,修改intentDescription的bundle参数:

@available(iOS 14.0, watchOS 7.0, macOS 11.0, *)
public static var intentDescription: INIntentDescription {
    let bundle = Bundle.module // 替换原有的Bundle.main
    return INIntentDescription(
        name: "WorkoutIntent",
        description: nil,
        category: .other,
        verb: "workout",
        example: nil,
        initWithCoder: { coder in WorkoutIntent(coder: coder) },
        bundle: bundle
    )
}

如果不想修改自动生成的代码,也可以在创建Intent实例时指定bundle:

func placeholder(in context: Context) -> ViewSizeEntry {
    let intentBundle = Bundle.module // 对应你的Swift Package目标
    let intent = WorkoutIntent(intentDescription: WorkoutIntent.intentDescription, bundle: intentBundle)
    return ViewSizeEntry(date: Date(), intent: intent)
}

4. 验证Widget Extension的Info.plist配置

确保Widget Extension的Info.plist包含正确的Intent属性配置:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>INTENT_NAME</key>
        <string>WorkoutIntent</string>
        <key>INTENT_CATEGORY</key>
        <string>INIntentCategoryOther</string>
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.widgetkit-extension</string>
</dict>

5. 固化Package的Intent代码生成步骤

为避免手动执行xcrun命令出错,建议将代码生成命令加入Package的构建脚本:
在Package.swift所在目录创建generate-intents.sh脚本:

#!/bin/bash
xcrun intentbuilderc generate --output-directory ./Sources/YourWidgetPackage/Generated --language swift ./Resources/WorkoutIntent.intentdefinition

给脚本添加执行权限:chmod +x generate-intents.sh
然后在Package.swift中添加构建前脚本:

.target(
    name: "YourWidgetPackage",
    dependencies: [],
    resources: [.process("Resources/WorkoutIntent.intentdefinition")],
    preBuildCommands: ["./generate-intents.sh"]
),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:39