我遇到这样的情况,我正在登录应用程序,然后将设备 token 发送到服务器,然后收到推送通知。如果消费者从应用程序注销,那么我将向服务器发送请求,然后我就不会收到推送通知。如果用户在登录后卸载应用程序,那么我无法向服务器发送停止推送通知的请求,然后我再次安装应用程序,但我没有登录,然后自动收到推送通知。
所以我的问题是当用户没有登录应用时如何停止推送通知
最佳答案
有点晚了,但它可能会对某人有所帮助。
我在我的一个项目中遇到过类似的情况:
问题
- 第一次运行获取设备 token
- 用户登录,应用向服务器注册设备 token
- 用户在未注销的情况下卸载了该应用程序,因此服务器仍然认为它是事件的
- 用户重新安装应用程序,即使他们尚未登录,仍会收到推送通知
在我的应用程序中,我在应用程序委托(delegate)中注册并请求设备 token :
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
..
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
..
}
一旦收到 Apple 的回复:
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)token{
//Get trimmed device token
NSString *deviceToken = [[token description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
//Store the device token in the user defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:deviceToken forKey:@"dToken"];
[userDefaults synchronize];
}
这或多或少是我见过的典型方式。
现在当用户登录时,设备 token 被发送到服务器并从用户内容区域的主视图 Controller 注册。通过从该 View Controller 中访问用户默认设置来检索设备 token 。然而,问题是,如果用户从未登录到用户内容区域,通知仍将持续存在,因为设备从未因先前的卸载而在服务器上取消注册,同时仍处于登录状态。
解决方案
如其他答案中所述,有几种方法可以解决此问题。但是我不想修改我的服务器和在那里注册设备的主要结构,它是这样的:
- 当用户首次登录时:对用户进行身份验证并同时注册传递的设备 token 。
- 当用户注销时:注销该用户的设备 token 。
- 每当数据库中存在设备 token 时:为除当前登录用户之外的所有用户停用它。
看到用户内容区域必须有设备 token 才能登录用户,我首先像以前一样在 didFinishLaunchingWithOptions 中请求设备 token 。
现在,当在 didRegisterForRemoteNotificationsWithDeviceToken 中收到回复时,我将执行以下操作:
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)token{
//Get trimmed device token
NSString *deviceToken = [[token description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
//Store the device token in the user defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:deviceToken forKey:@"dToken"];
[userDefaults synchronize];
//If not logged in yet, unregister for notifications
if(![[NSUserDefaults standardUserDefaults] objectForKey:@"loggedIn"])
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
}
我检查是否尚未到达用户内容 View Controller ,即用户从未登录,并禁用通知。
在用户内容 View Controller 中,我执行以下操作:
- (void)viewDidLoad{
..
//Set logged-in so the notifications continue to be received
if(![[NSUserDefaults standardUserDefaults] objectForKey:@"loggedIn"]){
[[NSUserDefaults standardUserDefaults] setValue:@"done" forKey:@"loggedIn"];
[[NSUserDefaults standardUserDefaults] synchronize];
//Register for notifications (again)
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
//Send user authentication and device token (retrieved from the user defaults) to server
..
}
现在,每当用户首次登录时,设备 token 都会被发送到服务器并立即注册,因为它已经从 Apple 检索到。在用户登录之前,通知也会被禁用,因此主要问题已解决。
这种方法确保用户内容区域 View Controller 永远不会在没有保存在用户默认值中的设备 token 的情况下加载,因此允许我继续使用相同的方法来验证用户并立即传递设备 token 。
关于ios - 在未登录的情况下新安装应用程序后禁用推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18271331/