metode application (... continue userActivity ...) tidak dipanggil di ios 13

11

Hai Saya membuat aplikasi ios menggunakan UniversalLink.

Universal Link berfungsi dengan baik, tetapi metode panggilan balik tidak disebut.

AppDelegate.swift saya ada di bawah.

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

Metode ini disebut di iOS 12 Simulator.

Jadi, masalahnya hanya terjadi di iOS 13.

Hanya di iOS13 kesalahan ini dicetak di konsol.

Tidak dapat mengakhiri BackgroundTask: tidak ada tugas latar belakang dengan pengenal 1 (0x1), atau mungkin sudah berakhir. Break di UIApplicationEndBackgroundTaskError () untuk debug.

Jadi, ini mungkin penyebab masalahnya.

Saya sangat menghargai bantuan seseorang

Matsumoto Kazuya
sumber
3
Saya juga memiliki masalah yang sama
Emre Önder
2
Adakah pembaruan tentang masalah ini?
jfredsilva
1
Adakah yang menemukan solusi untuk masalah ini?
Jan
@ EmreÖnder Saya menemukan satu solusi (periksa jawaban). Mudah-mudahan itu masalah yang sama Anda
Jan
@ jfredsilva Saya menemukan satu solusi (periksa jawaban). Mudah-mudahan itu masalah yang sama Anda
Jan

Jawaban:

10

Dalam kasus saya, saya mulai merek proyek baru di Xcode 11 yang menggunakan SceneDelegatesertaAppDelegate

Sepertinya UniversalLinks (dan mungkin beberapa API lainnya) menggunakan panggilan balik ini pada SceneDelegate:

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

Alih-alih panggilan balik ini pada AppDelegate:

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

Setelah saya menerapkan satu pada SceneDelegatesemuanya mulai berfungsi seperti yang diharapkan lagi. Saya belum mencobanya, tetapi saya berasumsi bahwa jika Anda menargetkan iOS 12 ke bawah, Anda mungkin perlu menerapkan kedua metode ini.

Semoga ini membantu

Jan
sumber
Itu juga tidak bangun. Apple mengkonfirmasi masalah itu di iOS 13. Tentu saja, mereka tidak akan memperbaikinya.
Dmitry
Pertanyaan terkait: stackoverflow.com/questions/58243884/…
Dmitry
2
Luar biasa, saya meletakkan func adegan (_ scene: UIScene, lanjutkan userActivity: NSUserActivity) {} di SceneDelegate dan itu berfungsi dengan baik sekarang @Jan, Apakah ada cara kita dapat menghindari situasi duplikasi kode ini di AppDelegate dan SceneDelegate? Terima kasih
Jigar
@Jigar Saya tidak thinkg Anda bahkan memerlukan kode di AppDelegate sekarang
Jan
@Jan saya menghapus SceneDelegate, itu berfungsi dengan baik setelah itu.
Jigar
3

Saya memiliki masalah serupa dengan SceneDelegatedan tautan universal di mana saya tidak bisa sampai ke NSUserActivity ketika aplikasi baru saja diluncurkan (dalam hal ini Background membaca NFC di ios 13).

Seperti disebutkan dalam jawaban oleh @Jan, lanjutkan userActivity sekarang di SceneDelegate.

Jika aplikasi sedang berjalan atau di latar belakang yaitu. ditutup, tautan universal akan memecat scene(_:continue:)delegasi.

Jika aplikasi tidak di latar belakang, tautan universal tidak akan muncul dari scene(_:continue:)delegasi. Sebaliknya, NSUserActivityakan tersedia dari scene(_:willConnectTo:options:). misalnya.

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