Открытие содержимого из схемы URL-адресов при закрытии приложения
Моя проблема
Я реализую схемы URL-адресов в своем приложении, и в целом они работают нормально, когда приложение находится на переднем плане или в фоновом режиме. Однако я заметил, что когда он полностью закрыт и другое приложение пытается получить доступ к контенту, используя мой URL-адрес (например,app:page?image=1
), который обычно работает, он просто открывает приложение, но контент никогда не перехватывается.
Мой подход
Я настроил код как в моих методах AppDelegate, так и в SceneDelegate.
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:])
А также
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
Желаемое поведение
Он открывается, когда приложение находится в фоновом режиме, на переднем плане или закрыто.
Фактическое поведение
Он открывается только на переднем или заднем плане
2 ответа
Поскольку ваше приложение в настоящее время не запущено, оно будет запущено с этими параметрами запуска. т.е. эти параметры будут переданы вwillFinishLaunchingWithOptions:
/ didFinishLaunchingWithOptions:
вместо. Добавьте свой код в один из этих методов.
Для получения дополнительной информации прочтите документацию о том, как реагировать на запуск вашего приложения, или, более конкретно, определить, почему ваше приложение было запущено.
РЕДАКТИРОВАТЬ:
Как прокомментировал @paulw11 ниже, делегат сцены работает иначе, и с ним нужно работать отдельно.
Однако в разделе " Реагировать на события жизненного цикла на основе сцены" последний пункт:
В дополнение к событиям, связанным со сценой, вы также должны реагировать на запуск вашего приложения, используя объект UIApplicationDelegate. Для получения информации о том, что делать при запуске приложения, см. " Ответ на запуск вашего приложения".
Полагаю, нам все еще нужно выполнить запуск в willdidFinishLaunchingWithOptions
/ didFinishLaunchingWithOptions
.
Для обработки входящих URL-адресов мы просто вызываем эту функцию как в
scene(_:willConnectTo:options:)
и
scene(_:openURLContexts:)
методы делегирования:
Если приложение закрыто:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
// Since this function isn't exclusively called to handle URLs we're not going to prematurely return if no URL is present.
if let url = connectionOptions.urlContexts.first?.url {
handleURL(url: url)
}
}
Если приложение находится в фоновом или переднем плане
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
// Get the first URL out of the URLContexts set. If it does not exist, abort handling the passed URLs and exit this method.
guard let url = URLContexts.first?.url else {
return NSLog("No URL passed to open the app")
}
handleURL(url: url)
}
Вы можете вернуться к следующей статье, чтобы узнать больше о делегате сцены и схемах URL-адресов: Пользовательские схемы URL-адресов в iOS