ios - 当应用程序被终止或屏幕被锁定时,UNTextInputNotificationAction不会被调用 swift 3

标签 ios swift3 remote-notifications

这就是我注册通知操作的方式

func registerForPushNotifications() {
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
        (granted, error) in
        print("Permission granted: \(granted)")

        guard granted else { return }

        let action = UNTextInputNotificationAction(identifier: replyActionIdentifier, title: "Answer message", options: [UNNotificationActionOptions.init(rawValue: 0)], textInputButtonTitle: "Send", textInputPlaceholder: "Type your message")

        let newsCategory = UNNotificationCategory(identifier: categoryIdentifier,
                                                  actions: [action],
                                                  intentIdentifiers: [],
                                                  options: [])

        UNUserNotificationCenter.current().setNotificationCategories([newsCategory])

        self.getNotificationSettings()
    }
}

这里我遵循协议(protocol) UNUserNotificationCenterDelegate 并处理通知操作

extension AppDelegate: UNUserNotificationCenterDelegate {

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {

    let userInfo = response.notification.request.content.userInfo

    // check if there is information in push's payload
    guard let custom = userInfo["data"] as? [String: AnyObject] else {
        completionHandler()
        return
    }

    switch response.actionIdentifier {
    case replyActionIdentifier:

        if let message = response as? UNTextInputNotificationResponse {
            if message.userText.isEmpty { return }

            // encrypt the message
            let publicKey = try! PublicKey(pemEncoded: Constantes.PUSH_KEY)
            let clear = try! ClearMessage(string: message.userText, using: .utf8)
            let encrypted = try! clear.encrypted(with: publicKey, padding: .PKCS1)
            let messageUser = encrypted.base64String

            // data inside the push
            guard let user_id = custom["me"] as? String, let room_id = custom["room_id"] as? String else {
                completionHandler()
                return
            }

            // secutiry elements
            guard let token = String(data: Keychain.load("push_token")!, encoding: .utf8),
                let uuid = String(data: Keychain.load("UUID")!, encoding: .utf8) else {
                completionHandler()
                return
            }

            let key = Constantes.KEY
            let chats = Chats()

            // this executes an http request
            chats.sendMessage(token: token, uuid: uuid, key: key!, message: messageUser, user_id: user_id, room_id: room_id)
        }

    default: break
    }
    completionHandler()

}

}

在之前的函数中,我执行了一个 http 请求来应答推送通知中的消息。真正的问题发生在我响应通知中的消息并点击“发送”按钮时,有时会执行 http 请求,有时则不会。我已经在我的应用程序的功能中添加了后台模式,事实上我正在成功接收来自 api 的通知,api 正在发送 1 中的值“内容可用”。最后,证书 .pem 在服务器中正常工作,所以。我错过了什么?

最佳答案

我只是遇到了这个问题,并且不知道为什么如果应用程序在后台运行但在它被杀死时我的快速回复不起作用。然后我开始通过源代码寻找一些东西,并在UNNotificationCenter中偶然发现了这一点。 :

// The method will be called on the delegate when the user responded to the notification by opening the application, dismissing the notification or choosing a UNNotificationAction. The delegate must be set before the application returns from application:didFinishLaunchingWithOptions:.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler

如果您读得好评论的最后部分,它说必须在从 application:didFinishLaunchingWithOptions: 返回之前设置委托(delegate)。

这就是我的错误所在。我正在设置委托(delegate)完成 UNUserNotificationCenter.current().getNotificationSettings

因此,您所要做的就是确保像这样设置委托(delegate) UNUserNotificationCenter.current().delegate = self之前application:didFinishLaunchingWithOptions:返回

关于ios - 当应用程序被终止或屏幕被锁定时,UNTextInputNotificationAction不会被调用 swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46427199/

相关文章:

ios - didReceiveRemoteNotification 函数不使用 FCM 通知服务器调用

ios - Swift 3 - 按钮动画向右跳转

ios - 像 Swift 中的 Uber iOS 应用程序一样在 Google Map 上移动注释?

ios - 在swift中,强变量是否需要在使用后设置为nil?

ios - Swift3,可变字符串数组的扩展

ios - 迁移到 swift 3 和 Xcode 8 时 cocoa pods 错误的解决方案是什么,问题详情在描述中?

ios - 在 Swift 中远程通知后使相机灯闪烁

android - 应用程序终止时 Firebase 推送通知回调不起作用

ios - libgdx - iOS 环境不适用于 scene2d

ios - 前景色不适用于属性文本