IOS - How to disable push notification at logout?

2019-02-05 02:19发布

问题:

My app registers the account at login in my server to enable push notification for a chat. Yet I haven't implemented yet the unregistration of the account at logout, so in this moment if I do the login with 2 accounts in the same device it can take the notification of both the accounts. At the same time, my notification center has a POST service which unregisters the 'login_name+ device token' from receive notification center. Where should I call it? Do I have to use unregisterForRemoteNotifications? I just want to unregister the account+Device token from push notification, not to disable the entire app notification forever.

Can I save my device token on didRegisterForRemoteNotificationsWithDeviceToken function like

 $ [[NSUserDefaults standardUserDefaults] setObject:hexToken forKey:DEVICE_KEY];

and then, at logout, call my POST function "removeDeviceToken" like

  NSString *deviceToken = [userDefaults objectForKey:DEVICE_KEY];
    if(deviceToken != NULL){
       [self.engine removeDeviceToken:deviceToken];
     }

回答1:

I'm not sure if i got it correctly, but if you don't want to disable push notifications for the app, then you should't call the unregisterForRemoteNotifications. What you can do is, when the user taps the logout button, you can make a logout request to your server, which then removes the notificationID from that account, and after the logout request is completed, you just perform the logout locally (update UI etc).

More info about comment:

Yes, first of all, you should call registerForRemoteNotificationTypes method at every launch, because device token can change. After the delegate method

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken

is called, you can get the device token and save it to NSUserDefault. That way when the user logs in, you can get the up-to-date device token (if changed), and send it to your server to be added to that account.

So the code might look like this

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    NSString *newToken = [devToken description];
    newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSString *notificationID = [newToken description];

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setObject:notificationID forKey:@"notification_id"];
    [prefs synchronize];
}

So, now when the user logs in, just get the notification ID and send it to your server

- (IBAction)userTappedLoginButton {
    // Make your login request
    // You can add the notification id as a parameter
    // depending on your web service, or maybe make
    // another request just to update notificationID
    // for a member

    NSString *notificationID = [[NSUserDefaults standardUserDefaults] objectForKey:@"notification_id"];
    ...
    ...
}


回答2:

You can easily enable and disable push notifications in your application by calling

To register, call: registerForRemoteNotificationTypes:

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

To unregister, call: unregisterForRemoteNotificationTypes:

[[UIApplication sharedApplication] unregisterForRemoteNotifications];

For check use

Enable or Disable iPhone Push Notifications try this code

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone) 
 // Yes it is..


回答3:

With Swift:

To Register,

UIApplication.shared.registerForRemoteNotifications()

To unregister,

UIApplication.shared.unregisterForRemoteNotifications()