我目前正在尝试为我的应用设置通知。这是一次丰富的体验,我现在能够将推送通知发送给相关用户的正确设备。我现在正在做的是通知用户是否有其他用户关注他们。我找到了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记录的日志显示正确的通知标识符。
到目前为止,我的观察结果:
let userData = PushNotificationManager.push().getCustomPushData(asNSDict: userInfo)
(这是从他们自己的框架/ API中获得的),因此我只使用userInfo
而不是userData
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [pushNotificationId])
中的某个地方,其中pushNotificationId引用了两个通知的标识符。我们将不胜感激任何帮助我弄清楚我将如何离开这里的人。我已经在互联网上搜索了很长一段时间,但似乎无法弄清楚导致这种情况发生的原因。
编辑:进行更深入的研究,我认为问题是因为我将标识符设置为“ follow2”,但是Apple推送了带有另一个ID(apns-id?)的通知。我目前无法检索。我现在正在尝试检索此apns-id。
编辑2:通过notification.id
(到UUIDString)在node.js中设置我自己的标识符也无法解决此问题。我相信通知是在创建本地通知的函数之外的其他地方处理的,所以我使用“错误”标识符。实际上,我正在寻找Apple收到新的远程通知时生成的标识符。我相信,如果我获得了此通知,则可以删除正确的通知。