iOS Swift 在应用终止时处理通知点击

iOS Swift Handle notification click when app is terminated

应用终止时如何处理通知点击操作 当我点击通知时,我的应用程序只是午餐第一个屏幕作为正常午餐 不是预期的屏幕 我现在不知道,或者我该如何调试这个问题以找出到底发生了什么

当应用处于 运行 或后台模式时,我通过此方法处理我的通知点击操作:

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                       didReceive response: UNNotificationResponse,
                                       withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        // Print message ID.
        if let messageID = userInfo[gcmMessageIDKey] {
            print("Message ID: \(messageID) tap")
        }
        NotificationCenter.default.post(name: .remoteNotificationActionName, object: nil, userInfo: userInfo)
        print("willPresent userInfo", userInfo)
        completionHandler()
    }

此通知将发送给场景委托 class,我将从我的场景委托中打开相应的屏幕:

@objc
private func remoteNotificationClickAction(notification: Notification){
    performRemoteNotificationClickAction(notification: notification)
}

private func performRemoteNotificationClickAction(notification: Notification){
    guard let userInfo = notification.userInfo else { return }
    guard let clickAction = NotificationsActions(rawValue: userInfo["click_action"] as? String ?? "") else { return }
    switch clickAction {
    case .dashboardAds:
        routeToNotifications()
    case .dashboardAdsContent:
        routeToNotifications()
    case .providerAcceptOrder, .providerOnWay, .providerArrive, .tripStarted, .addReceiverToChat:
        guard let orderString = userInfo["order"] as? String else { return }
        routeToActiveOrder(orderString: orderString)
    case .orderComplete:
        guard let orderString = userInfo["order"] as? String else { return }
        routeToServiceReport(orderString: orderString)
    case .orderCanceled, .receiverTracking, .receiverCancelOrder, .transportationDocumentIssued, .adminCancelOrder, .userCancelOrder:
        guard let orderString = userInfo["order"] as? String else { return }
        self.routeToOrderDetails(orderString: orderString)
    case .providerCancelOrderAccepted, .offerAdded, .receiverTrackingAccept, .orderExpired, .receiverTrackingReject, .offerWithdrawn:
        guard let orderString = userInfo["order"] as? String else { return }
        routeToSearchForServiceProvider(orderString: orderString)
    case .messageReceive:
        guard let orderString = userInfo["order"] as? String else { return }
        routeToChat(orderString: orderString)
    case .amountSent, .amountReceive, .amountAdded, .amountSubtracted, .withdrawAccepted, .withdrawRejected, .bankTransferAccepted, .bankTransferRejected:
        routeToWallet()
    case .pointsAdded:
        routeToTopUpPoints()
    case .reportClosed:
        routeToComplaints()
    default:  break
    }
    
}

当app处于killed/terminated状态时,didReceiveRemoteNotification方法不会被调用。然后在点击通知时将调用 application(_:didFinishLaunchingWithOptions) 方法。如果通过点击通知启动应用程序,则 launchOption 包含有效负载。为此,在此方法中编写给定代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       if launchOptions != nil{
         let userInfo = launchOptions? 
         [UIApplicationLaunchOptionsKey.remoteNotification]
          if userInfo != nil {
        // Perform action here
         }
    }

launchOptions 中将提供您的所有负载数据?[UIApplicationLaunchOptionsKey.remoteNotification] 并从那里执行您的应用程序逻辑(导航..)。

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = scene as? UIWindowScene else { return }
    window = UIWindow(windowScene: windowScene)
    whereToGo(window!)
    if let notificationResponse = connectionOptions.notificationResponse{
        NotificationCenter.default.post(name: .remoteNotificationActionName, object: nil, userInfo: notificationResponse.notification.request.content.userInfo)
    }
}

如上代码所示,我的通知是在 connectionOptions.notificationResponse

收到的