Намерения приложения iOS: динамически открывать приложение и выводить его на передний план.

Я использую App Intents API, чтобы обеспечить автоматизацию через приложение iOS Shortcuts. Когда мое намерение выполняется, я хотел бы иметь возможность решить, хочу ли я открыть приложение (вывести его на передний план) или нет. Я знаюможно использовать для открытия приложения, но его значение нельзя изменить.

я пытался использоватьopenAppWhenRun, но у него нет сеттера. Поэтому я не могу динамически обновлять эту переменную, чтобы определить, следует ли открывать приложение на переднем плане или нет.

3 ответа

Это возможно начиная с iOS 16.4 через протокол ForegroundContinuableIntent . Он будет работать в фоновом режиме, пока вы не решите перевести приложение на передний план. Вот пример:

      import AppIntents

@available(iOS 16.4, *)
struct TestIntent: ForegroundContinuableIntent {
    static var title: LocalizedStringResource = "Test Intent"

    @Parameter(title: "Open App")
    var shouldOpenApp: Bool

    @MainActor
    func perform() async throws -> some IntentResult & ProvidesDialog {
        if shouldOpenApp {
            // Stop performing the app intent and ask the user to continue to open the app in the foreground
            throw needsToContinueInForegroundError()

            // You can customize the dialog and/or provide a closure to do something in your app after it's opened
            throw needsToContinueInForegroundError("Please continue to open the app.") {
                UIApplication.shared.open(URL(string: "yourapp://deeplinktocontent")!)
            }

            // Or you could ask the user to continue performing the intent in the foreground - if they cancel the intent stops, if they continue the intent execution resumes with the app open
            // This API also accepts an optional dialog and continuation closure
            try await requestToContinueInForeground()
            return .result(dialog: "I opened the app.")
        } else {
            return .result(dialog: "I did not open the app.")
        }
    }
}

вам не нужен установщик, в этом случае вы должны его переопределить:

      static var openAppWhenRun: Bool = true

Надеюсь, поможет!

Внутри метода вашего намерения верните.result(opensIntent:), открывая другое намерение, которое выводит ваше приложение на передний план. Если условия для этого не применимы, вы можете выдать пользовательскую ошибку (в противном случаеperformне вернулся быsome IntentResult). Просто убедитесь, что ваше перечисление ошибок соответствуетCustomLocalizedStringResourceConvertible, поэтому пользователь получает полезное сообщение.

Другие вопросы по тегам