无法从通知中心删除单个通知

时间:2019-03-26 09:21:15

标签: ios swift push-notification apple-push-notifications node-apn

我目前正在尝试为我的应用设置通知。这是一次丰富的体验,我现在能够将推送通知发送给相关用户的正确设备。我现在正在做的是通知用户是否有其他用户关注他们。我找到了this guide from PushWoosh,我曾经从这里开始,但是我不使用他们的服务,而是使用自己的node.js后端。

当按下关注按钮时,我的node.js服务器使用以下代码发送通知:

let apnProvider = new apn.Provider(options)
let deviceToken = device["deviceToken"]
let notification = new apn.Notification()
notification.expiry = Math.floor(Date.now() / 1000) + 24 * 3600
notification.badge = selectCountRows[0]["badgeNumber"]
notification.sound = "default"
notification.contentAvailable = 1
notification.alert = pushText
let notificationID = `${ notificationType }${ fromUserID }`
notification.payload = {'crt': notificationID, 'fromUserID': fromUserID, 'notificationType': notificationType}                                  notification.topic = "com.myapp"
apnProvider.send(notification, deviceToken).then( result => {
    console.log(result);
})
apnProvider.shutdown();

所有变量均已正确设置(它们是从我的数据库中检索的,例如deviceToken和pushText)。在此示例中,我创建了一个警报消息为(variable pushText)的通知“ PennyWise开始关注您。” -然后,notificationID为follow1 (变量notificationType为follow,fromUserID为1)。要删除通知,我使用类似的“无提示”通知,该通知根本没有要显示的正文/文本,如下所示:

let apnProvider = new apn.Provider(options)
let deviceToken = device["deviceToken"]
let notification = new apn.Notification()
notification.expiry = Math.floor(Date.now() / 1000) + 24 * 3600
notification.badge = selectCountRows[0]["badgeNumber"]
notification.contentAvailable = 1
 let notificationID = `${ notificationType }${ fromUserID }`
 notification.payload = {'dlt': notificationID, 'fromUserID': fromUserID, 'notificationType': "delete"}
 notification.topic = "com.myapp"
apnProvider.send(notification, deviceToken).then( result => {
    console.log(result);
})
apnProvider.shutdown();

在我的iOS应用中,我使用此应用方法来处理收到的通知:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    let dltPushId = userInfo["dlt"]

    if  let pushIdString = dltPushId as? String {
        let pushNotificationId = "com.myapp." + pushIdString
        UserDefaults.standard.removeObject(forKey: pushNotificationId)
        UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [pushNotificationId])
        UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [pushNotificationId])

        print("deleted push notification with id ", pushNotificationId)
        completionHandler(UIBackgroundFetchResult.newData)
        return
    }

    let createPushId = userInfo["crt"]

    if let pushIdString = createPushId as? String {

        let content = UNMutableNotificationContent()
        content.userInfo = userInfo
        let pushNotificationId = "com.myapp." + pushIdString
        let request = UNNotificationRequest(identifier: pushNotificationId, content: content, trigger: nil)

        UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in
            if error == nil {
                UserDefaults.standard.set(pushNotificationId, forKey: pushNotificationId)
                print("created push notification with id ", request.identifier)
            }
        })

    }

    completionHandler(UIBackgroundFetchResult.noData)

}

一切似乎一开始都是有效的。我能够关注另一个用户(因此我已在两台设备上登录),我将收到通知。然后,当我取消关注该用户时,通知将消失。

但是,当我使用三个设备进行测试时,就会出现问题:我首先从用户2跟踪用户1,然后又从用户3跟踪用户1。在此阶段,我在设备上有两个通知给用户1 :user 2 started following you.user 3 started following you.但是,当我从用户3取消关注时,该通知不会消失。当我从用户2取消关注时,两者通知均消失!换句话说:当标识符与发送第一个在“通知中心”中可见的通知的标识符相对应时,所有通知都会消失。

这当然不是我想要的行为,我想知道问题可能出在哪里。当我取消关注用户1(例如follow2和follow3)时,我从Xcode记录的日志显示正确的通知标识符。

到目前为止,我的观察结果:

  • PushWoosh指南使用了我无法访问的let userData = PushNotificationManager.push().getCustomPushData(asNSDict: userInfo)(这是从他们自己的框架/ API中获得的),因此我只使用userInfo而不是userData
  • 似乎在我的iOS应用中,通知标识符设置不正确,并且在收到新通知时未更新。我觉得问题应该出在UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [pushNotificationId])中的某个地方,其中pushNotificationId引用了两个通知的标识符。

我们将不胜感激任何帮助我弄清楚我将如何离开这里的人。我已经在互联网上搜索了很长一段时间,但似乎无法弄清楚导致这种情况发生的原因。

编辑:进行更深入的研究,我认为问题是因为我将标识符设置为“ follow2”,但是Apple推送了带有另一个ID(apns-id?)的通知。我目前无法检索。我现在正在尝试检索此apns-id。

编辑2:通过notification.id(到UUIDString)在node.js中设置我自己的标识符也无法解决此问题。我相信通知是在创建本地通知的函数之外的其他地方处理的,所以我使用“错误”标识符。实际上,我正在寻找Apple收到新的远程通知时生成的标识符。我相信,如果我获得了此通知,则可以删除正确的通知。

0 个答案:

没有答案