Поэтому у меня возникла проблема с зацикливанием.
Это правильное поведение,
- Открыть целевое приложение
- Открыть мое приложение
- Снова открыть целевое приложение (теперь целевое приложение уже работает в фоновом режиме)
Снова откройте мое приложение.
- Открыть целевое приложение
- Открыть мое приложение
- Снова открыть целевое приложение (теперь целевое приложение уже работает в фоновом режиме)
- Нет необходимости повторно перенаправляться в мое приложение, поскольку приложение находится в фоновом режиме.
Код: Выделить всё
import AppIntents
import SwiftUI
import SwiftUICore
import UIKit
//
// These will be the options in the Shortcut action to open a book or navigate to the library
enum NavigationType: String, AppEnum, CaseDisplayRepresentable {
case library
case book
// This will be displayed as the title of the menu shown when picking from the options
@available(iOSApplicationExtension 16, *)
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Navigation")
@available(iOSApplicationExtension 16.0, *)
static var caseDisplayRepresentations: [Self:DisplayRepresentation] = [
.library: DisplayRepresentation(title: "Library",
subtitle: "Return to the home page",
image: .init(systemName: "books.vertical")),
.book: DisplayRepresentation(title: "Book",
subtitle: "Navigate to a specific book",
image: .init(systemName: "book"))
]
}
// Enum to represent the static book options
enum AppOption: String, AppEnum, CaseDisplayRepresentable {
case youtube = "YouTube"
case facebook = "Facebook"
case twitter = "Twitter"
@available(iOSApplicationExtension 16.0, *)
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "App")
@available(iOSApplicationExtension 16.0, *)
static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [
.youtube: DisplayRepresentation(title: "YouTube",
subtitle: "com.google.ios.youtube"),
.facebook: DisplayRepresentation(title: "Facebook",
subtitle: "com.facebook.ios"
),
.twitter: DisplayRepresentation(title: "Twitter",
subtitle: "com.twitter.ios")
]
}
// Struct to represent an app
struct App {
let appName: String
let bundleID: String
let deepLinking:String
}
// Sample app data (you can load this dynamically in the future)
let appsDetail = [
App(appName: "YouTube", bundleID: "com.google.ios.youtube",deepLinking:"youtube://"),
App(appName: "Facebook", bundleID: "com.facebook.ios",deepLinking:"fb://"),
App(appName: "Twitter", bundleID: "com.twitter.ios",deepLinking:"twitter://")
]
@available(iOSApplicationExtension 16.0, *)
struct OpenBook: AppIntent {
// Title o f the action in the Shortcuts app
@available(iOSApplicationExtension 16, *)
static var title: LocalizedStringResource = "Open App"
// Description of the action in the Shortcuts app
@available(iOSApplicationExtension 16.0, *)
static var description: IntentDescription = IntentDescription("This action will open the selected book in the Booky app or navigate to the home library.", categoryName: "Navigation")
// This opens the host app when the action is run
static var openAppWhenRun = true
@Parameter(title: "App", description: "The book to open in Booky", requestValueDialog: IntentDialog("Which book would you like to open?"))
var apps: AppOption
// An enum parameter
@Parameter(title: "Navigation", description: "Choose whether to open a book or navigate to Booky's library", default: .book, requestValueDialog: IntentDialog("What would you like to navigate to?"))
var navigation: NavigationType
// How the summary will appear in the shortcut action.
static var parameterSummary: some ParameterSummary {
Summary("Open \(\.$apps)")
}
@MainActor // some IntentResult {
guard let selectedBook = appsDetail.first(where: { $0.appName == apps.rawValue }) else {
throw NSError(domain: "OpenBookError", code: 1, userInfo: [NSLocalizedDescriptionKey: "Book not found."])
}
let userInfo: [String: Any] = ["selectedBook": [
"appName": selectedBook.appName,
"bundleId": selectedBook.bundleID,
"deepLinking": selectedBook.deepLinking,
]]
NotificationCenter.default.post(name: NSNotification.Name("OpenBookCallback"), object: nil, userInfo: userInfo)
return .result()
}
}
- Откройте целевое приложение.
- Откройте мое приложение.
- Снова откройте целевое приложение (теперь целевое приложение уже находится в фоновом режиме).
- Нет необходимости снова перенаправляться в мое приложение, поскольку приложение находится в фоновом режиме.
- Снова откройте целевое приложение (теперь целевое приложение уже находится в фоновом режиме).
- Нет необходимости снова перенаправляться в мое приложение, поскольку приложение находится в фоновом режиме.
li>
Подробнее здесь: https://stackoverflow.com/questions/791 ... s-shortcut