método de aplicación (... continue userActivity ...) no llamado en ios 13

11

Hola, estoy haciendo la aplicación ios usando UniversalLink.

Universal Link funciona bien, pero no se llama al método de devolución de llamada.

Mi AppDelegate.swift está debajo.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }


    func application(_ application: UIApplication,
                     willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        return true
    }

    // this method not called!!
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        print("called")
        return true
    }
}

El método se llama en iOS 12 Simulator.

Entonces, el problema ocurre solo en iOS 13.

Solo en iOS13 este error se imprime en la consola.

No se puede finalizar la Tarea en segundo plano: no existe una tarea en segundo plano con el identificador 1 (0x1), o puede que ya se haya finalizado. Romper en UIApplicationEndBackgroundTaskError () para depurar.

Entonces, esto puede ser la causa del problema.

Realmente agradecería que alguien me ayudara

Matsumoto Kazuya
fuente
3
También tengo el mismo problema
Emre Önder
2
¿Alguna actualización sobre este problema?
jfredsilva
1
¿Alguien encontró una solución a este problema?
Jan
@ EmreÖnder Encontré una solución (verifique la respuesta). Esperemos que sea tu mismo problema
Jan
@jfredsilva Encontré una solución (verifique la respuesta). Esperemos que haya sido tu mismo problema
Jan

Respuestas:

10

En mi caso, comencé un nuevo proyecto en Xcode 11 que usa SceneDelegatetan bien comoAppDelegate

Parece que UniversalLinks (y probablemente varias otras API) usan esta devolución de llamada en SceneDelegate:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { }

En lugar de esta devolución de llamada en AppDelegate:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { }

Una vez que implementé el de SceneDelegatetodo, todo comenzó a funcionar como se esperaba nuevamente. No lo he probado, pero supongo que si está apuntando a iOS 12 o inferior, es posible que deba implementar ambos métodos.

Espero que esto ayude

ene
fuente
Tampoco es woking. Apple confirmó ese problema en iOS 13. Por supuesto, no lo van a solucionar.
Dmitry
Pregunta vinculada: stackoverflow.com/questions/58243884/…
Dmitry
2
Impresionante, puse func scene (_ scene: UIScene, continue userActivity: NSUserActivity) {} en SceneDelegate y ahora funciona absolutamente bien @ Jan, ¿hay alguna forma de evitar esta situación de duplicación de código en AppDelegate y SceneDelegate? Gracias
Jigar
@Jigar No creo que incluso necesites el código en el AppDelegate ahora
enero
@ Jan eliminé SceneDelegate, está funcionando bien después de eso.
Jigar
3

Tuve un problema similar con SceneDelegatelos enlaces universales y no pude acceder a NSUserActivity cuando la aplicación se acaba de iniciar (en este caso, lectura de fondo NFC en ios 13).

Como se menciona en la respuesta de @Jan, continuar userActivity ahora está en el SceneDelegate.

Si la aplicación se está ejecutando o en segundo plano, es decir. cerrado, un enlace universal disparará al scene(_:continue:)delegado.

Si la aplicación no está en segundo plano, el scene(_:continue:)delegado no activará un enlace universal . En cambio, NSUserActivityestará disponible desde scene(_:willConnectTo:options:). p.ej.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
Rex
fuente