I’m trying to develop a widget with a button that triggers an app intent.
I integrated the app intent into my app within a separate app framework. I tested it with Shortcuts and Siri, and it works well—it opens the app on the required screen. However, when I added a button Button(intent: MyIntent()) to my widget, it doesn’t work at all.
The only clue I found is the following message in the Xcode debug console:
“No ConnectionContext found for (some big integer)” when I tap on the widget's button.
However, I see the same message when running it through the Shortcuts app, and in that case, it works fine.
Does anyone know what might be causing this issue?
My Intent:
public struct OpenTextInputIntent: AppIntent {
public static var title: LocalizedStringResource = "Open text input"
public static var openAppWhenRun: Bool = true
@Parameter(title: "Predefined text")
public var predefinedText: String
@Dependency private var appCoordinator: AppCoordinatorProtocol
public init() { }
public func perform() async throws -> some IntentResult {
appCoordinator.openAddMessage(predefinedText: predefinedText)
return .result()
}
}
My widget's view:
struct SimpleWidgetView : View {
var entry: SimpleWidgetTimelineProvider.Entry
var body: some View {
ZStack(alignment: .leadingTop) {
button
}
}
private var button: some View {
Button(intent: OpenTextInputIntent()) {
Image(systemName: "mic.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.iconFrame()
}
.buttonStyle(PlainButtonStyle())
.foregroundStyle(Color.white)
.padding(10)
.background(Circle().fill(Color.accent))
}
}
Intents Registration in the app target:
struct MyAppPackage: AppIntentsPackage {
static var includedPackages: [any AppIntentsPackage.Type] {
[FrameworkIntentsPackage.self]
}
}
struct MyAppShortcutsProvider: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: OpenTextInputIntent(),
phrases: ["Add message in \(.applicationName)"],
shortTitle: "Message input",
systemImageName: "pencil.circle.fill"
)
}
}
What I'm missing?
Selecting any option will automatically load the page