userNotificationCenter:didReceive:withCompletionHandler is too short

General Tech Bugs & Fixes 2 years ago

0 1 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (1)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

userNotificationCenter:didReceive:withCompletionHandler is called but the app get killed very quickly.

The app is completely killed and I want to respond to notification action without opening the app. I've tried to use semaphore with no success.

    public init() {
        super.init()
        self.startBackgroundService()

        UNUserNotificationCenter.current().delegate = self
        Messaging.messaging().delegate = self
    }

    public func userNotificationCenter(_ center: UNUserNotificationCenter,
                                       didReceive response: UNNotificationResponse,
                                       withCompletionHandler completionHandler: @escaping () -> Void) {
        NSLog("userNotificationCenter:didReceive:withCompletionHandler")
        var data: [String: Any] = ["$": "NotificationResponse"]
        data["notification"] = response.notification.asDictionary()
        data["actionIdentifier"] = response.actionIdentifier
        data["backgroundDispatcher"] = getDispatcherHandle(key: "backgroundDispatcher")

        if let textResponse = response as? UNTextInputNotificationResponse {
            data["$"] = "TextInputNotificationResponse"
            data["userText"] = textResponse.userText
        }

        if (!initialized) {
            // wait for the service to initialize
            semaphore.wait();
        }

        self.background.invokeMethod("notificationResponse", arguments: data) { result in
            completionHandler()
            // the work is done, resume
            self.semaphore.resume();
        }

        // wait for the work to complete
        semaphore.wait();
    }

    private func startBackgroundService() {
        NSLog("startBackgroundService")
        internalQueue.sync {
            if (initialized) {
                return;
            }
        }
        if let info = FlutterCallbackCache.lookupCallbackInformation(getDispatcherHandle(key: "callbackDispatcher")) {
            backgroundRunner.run(withEntrypoint: info.callbackName, libraryURI: info.callbackLibraryPath)
            registrar.addMethodCallDelegate(self, channel: background)
            background.setMethodCallHandler { call
                                                
                                                
0 views
0 shares

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.