我们的项目目前有一个Node jS后端,我们想要实现iOS的推送通知。我们进行了一些研究并发现我们必须存储APN在我们的数据库中提供的令牌,以便将推送通知发送到特定设备。有人可以确认这个或者有更好的方式发送通知吗?
其次,我还发现,当设备通过软件更新时,这会更改其令牌,这意味着我们必须能够更新数据库中的令牌,因为它会经常更改。这也很重要。还有其他任何时候令牌可能会改变吗?
最后,Node中是否有用于发送推送通知的好库?
提前致谢!
答案 0 :(得分:2)
您必须将通知accessToken发送到服务器,其地址与要发送的通知相同。您不必担心accessstoken的变化,因为您必须在每次登录时发送它,因此新的更新的accesstoken也会附加到服务器中。您必须在Appdelegate中注册远程通知,然后发送保存的令牌在nsuserdefault中登录API中的服务器。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()
return true
}
//Called if successfully registered for APNS.
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
// let deviceTokenString = NSString(format: "%@", deviceToken) as String
var tokenStr = deviceToken.description
tokenStr = tokenStr.stringByReplacingOccurrencesOfString("<", withString: "", options: [], range: nil)
tokenStr = tokenStr.stringByReplacingOccurrencesOfString(">", withString: "", options: [], range: nil)
tokenStr = tokenStr.stringByReplacingOccurrencesOfString(" ", withString: "", options: [], range: nil)
print(deviceToken.description)
print(tokenStr)
//save the token in NSUserDefaults
NSUserDefaults.standardUserDefaults().setObject(deviceTokenString, forKey: "deviceToken")
}
//Called if unable to register for APNS.
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
print(error)
}
Reference Apple's Documentation
设备令牌是向您的应用发送推送通知的关键 在特定设备上。设备令牌可以更改,因此您的应用需要 每次启动时重新注册并将收到的令牌传回 到你的服务器。如果您无法更新设备令牌,则远程 通知可能无法进入用户的设备。设备 当用户将备份数据恢复为新数据时,令牌始终会更改 设备或计算机或重新安装操作系统。迁移时 数据到新设备或计算机,用户必须启动您的应用程序一次 在远程通知可以传送到该设备之前。
答案 1 :(得分:0)
我一直在为此寻找最佳解决方案,但似乎没有明确的处理方法,因为我们不知道令牌何时会发生变化。 这是否意味着我们应该将令牌存储在我们的数据库中,并在每次用户打开应用程序时获取它,然后尝试比较它们?我猜这还不够有效。
在我看来,将令牌保留在服务器的数据库中,然后在本地存储中保留一份副本,以便您可以将其与每次打开应用程序时生成的进行比较,除非两者不相同,然后您可以更新数据库中的那个。