ios - 在未登录的情况下新安装应用程序后禁用推送通知

标签 ios push-notification apple-push-notifications

我遇到这样的情况,我正在登录应用程序,然后将设备 token 发送到服务器,然后收到推送通知。如果消费者从应用程序注销,那么我将向服务器发送请求,然后我就不会收到推送通知。如果用户在登录后卸载应用程序,那么我无法向服务器发送停止推送通知的请求,然后我再次安装应用程序,但我没有登录,然后自动收到推送通知。

所以我的问题是当用户没有登录应用时如何停止推送通知

最佳答案

有点晚了,但它可能会对某人有所帮助。

我在我的一个项目中遇到过类似的情况:

问题

  1. 第一次运行获取设备 token
  2. 用户登录,应用向服务器注册设备 token
  3. 用户在未注销的情况下卸载了该应用程序,因此服务器仍然认为它是事件的
  4. 用户重新安装应用程序,即使他们尚未登录,仍会收到推送通知

在我的应用程序中,我在应用程序委托(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/

相关文章:

ios - 在我的应用程序中点击 UITextField 时,UIKeyboard 不出现

ios - 在 Swift iOS 中更改方向更改时更改 UICollectionViewCell 标签 textColor

ios - 在后台处理远程通知

iOS Worklight 推送通知处理

javascript - Phonegap iOS 推送通知示例

ios - 添加新建筑数据后发送推送通知

ios - SWIFT:很难在 tableView 中显示数据

iPhone iOS5 Storyboard 更改导航栏外观

ios - 如何在我的应用程序中使用变量 (Bool) 来控制在应用程序后台时是否可以显示远程通知?

ios - 如何正确处理接收远程推送通知