método application (… continue userActivity…) não chamado no ios 13


11

Oi, eu estou fazendo o aplicativo iOS usando o UniversalLink.

O Universal Link funciona bem, mas o método de retorno de chamada não é chamado.

Meu AppDelegate.swift está abaixo.

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
    }
}

O método é chamado no iOS 12 Simulator.

Portanto, o problema ocorreu apenas no iOS 13.

Somente no iOS13 esse erro é impresso no console.

Não é possível finalizar a BackgroundTask: nenhuma tarefa em segundo plano existe com o identificador 1 (0x1) ou ela já pode ter sido encerrada. Quebre UIApplicationEndBackgroundTaskError () para depurar.

Portanto, isso pode ser a causa do problema.

Eu realmente aprecio alguém ajudar


3
Também tenho o mesmo problema
Emre Önder

2
Alguma atualização sobre esse problema?
jfredsilva

11
Alguém encontrou uma solução para esse problema?
Janeiro

@ EmreÖnder eu encontrei uma solução (verifique a resposta). Esperamos que foi o mesmo problema
Jan

@jfredsilva Encontrei uma solução (verifique a resposta). Esperamos que foi o mesmo problema
Jan

Respostas:


10

No meu caso, iniciei um novo projeto no Xcode 11 que usa SceneDelegatee tambémAppDelegate

Parece que o UniversalLinks (e provavelmente várias outras APIs) usam esse retorno de chamada no SceneDelegate:

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

Em vez deste retorno de chamada no AppDelegate:

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

Depois que eu implementei, SceneDelegatetudo começou a funcionar como esperado novamente. Eu não tentei, mas presumo que, se você estiver direcionando o iOS 12 e inferior, pode ser necessário implementar os dois métodos.

Espero que isto ajude


Também não está funcionando. A Apple confirmou esse problema no iOS 13. Claro, eles não vão corrigi-lo.
Dmitry


2
Incrível, eu coloquei func scene (_ scene: UIScene, continue userActivity: NSUserActivity) {} no SceneDelegate e ele está funcionando perfeitamente agora @Jan, existe alguma maneira de evitar essa situação de duplicação de código no AppDelegate e SceneDelegate? Graças
Jigar

@ Jigar Eu acho que você nem precisa do código no AppDelegate agora
Jan

@ Jan Eu removi o SceneDelegate, está funcionando bem depois disso.
Jigar

3

Eu tive um problema semelhante com SceneDelegatelinks universais em que não consegui acessar o NSUserActivity quando o aplicativo foi iniciado (neste caso, lendo a NFC em segundo plano no iOS 13).

Conforme mencionado na resposta de @Jan, continue userActivity agora no SceneDelegate.

Se o aplicativo estiver sendo executado ou em segundo plano, por exemplo. fechado, um link universal disparará o scene(_:continue:)delegado.

Se o aplicativo não estiver em segundo plano, um link universal não será iniciado pelo scene(_:continue:)delegado. Em vez disso, o NSUserActivityestará disponível em scene(_:willConnectTo:options:). por exemplo.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.