แอปพลิเคชัน (…ดำเนินการต่อ userActivity …) วิธีการที่ไม่ได้เรียกใน iOS 13


11

สวัสดีฉันทำแอป iOS โดยใช้ UniversalLink

ยูนิเวอร์แซเชื่อมโยงผลงานดี แต่วิธีการโทรกลับไม่ได้เรียกว่า

AppDelegate.swift ของฉันอยู่ด้านล่าง

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

วิธีการนี้เรียกว่าใน iOS 12 Simulator

ดังนั้นปัญหาจะเกิดขึ้นเฉพาะใน iOS 13

เฉพาะใน iOS13 ข้อผิดพลาดนี้จะถูกพิมพ์ในคอนโซล

ไม่สามารถจบ BackgroundTask: ไม่มีงานพื้นหลังที่มีตัวระบุ 1 (0x1) หรืออาจสิ้นสุดลงแล้ว แตกใน UIApplicationEndBackgroundTaskError () เพื่อดีบัก

ดังนั้นนี่อาจเป็นสาเหตุของปัญหา

ฉันขอขอบคุณที่มีคนช่วย


3
ฉันมีปัญหาเดียวกัน
Emre Önder

2
มีการปรับปรุงเกี่ยวกับปัญหานี้หรือไม่?
jfredsilva

1
ใครพบวิธีแก้ปัญหานี้?
ม.ค.

@ EmreÖฉันพบวิธีแก้ปัญหาหนึ่ง (ตรวจสอบคำตอบ) หวังว่ามันเป็นปัญหาเดียวกันของคุณ
ม.ค.

@jfredsilva ฉันพบวิธีแก้ปัญหาหนึ่งข้อ (ตรวจสอบคำตอบ) หวังว่ามันเป็นปัญหาเดียวกันของคุณ
ม.ค.

คำตอบ:


10

ในกรณีของฉันฉันเริ่มโครงการใหม่ล่าสุดบน Xcode 11 ซึ่งใช้SceneDelegateเช่นเดียวกับAppDelegate

ดูเหมือนว่า UniversalLinks (และอาจเป็นหลาย API อื่น ๆ ) ใช้การเรียกกลับนี้ในSceneDelegate:

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

แทนที่จะโทรกลับไปที่AppDelegate:

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

เมื่อฉันใช้งานSceneDelegateทุกอย่างเริ่มทำงานตามที่คาดไว้อีกครั้ง ฉันยังไม่ได้ลอง แต่ฉันสมมติว่าถ้าคุณกำหนดเป้าหมายเป็น iOS 12 และต่ำกว่าคุณอาจต้องใช้ทั้งสองวิธี

หวังว่านี่จะช่วยได้


มันยังไม่ได้ปลุกด้วย Apple ยืนยันปัญหานั้นใน iOS 13 แน่นอนว่าพวกเขาจะไม่แก้ไข
Dmitry

คำถามที่เชื่อมโยง: stackoverflow.com/questions/58243884/…
Dmitry

2
ยอดเยี่ยมฉันใส่ func scene (_ scene: UIScene ดำเนินการต่อ userActivity: NSUserActivity) {} ใน SceneDelegate และทำงานได้อย่างสมบูรณ์ในขณะนี้ @Jan มีวิธีใดบ้างที่เราสามารถหลีกเลี่ยงสถานการณ์การทำซ้ำรหัสผ่าน AppDelegate และ SceneDelegate ได้หรือไม่ ขอบคุณ
Jigar

@ Jigar ฉันไม่คิดว่าคุณจะต้องใช้รหัสใน AppDelegate เลยตอนนี้
ม.ค.

@Jan ฉันลบ SceneDelegate แล้วก็ทำงานได้ดีหลังจากนั้น
Jigar

3

ฉันมีปัญหาที่คล้ายกันSceneDelegateและลิงก์สากลที่ฉันไม่สามารถไปถึง NSUserActivity เมื่อเปิดตัวแอป (ในกรณีนี้พื้นหลังการอ่าน NFC ใน iOS 13)

ตามที่ระบุไว้ในคำตอบโดย @Jan ให้ดำเนินการต่อ userActivity SceneDelegateตอนนี้อยู่ใน

หากแอพกำลังทำงานหรืออยู่ในพื้นหลังเช่น ปิดการเชื่อมโยงสากลจะเริ่มต้นscene(_:continue:)ผู้รับมอบสิทธิ์

หากแอพไม่ได้อยู่ในพื้นหลังลิงค์สากลจะไม่ติดขึ้นจากscene(_:continue:)ตัวแทน แทนจะสามารถใช้ได้จากNSUserActivity scene(_:willConnectTo:options:)เช่น.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let userActivity = connectionOptions.userActivities.first {
        debugPrint("got user activity")
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.