远程通知令牌处理

时间:2011-12-29 20:21:49

标签: iphone objective-c notifications push-notification apple-push-notifications

我正在注册我的iPhone应用程序以进行远程通知。

这是我的情景:

  1. 用户打开我的应用并注册远程通知
  2. 用户为我的应用关闭通知
  3. 用户打开我的应用
  4. 用户为我的应用程序启用了通知
  5. 我的问题是:

    1. 是否可以检查用户是否在我的应用程序代码中禁用了我的应用程序的远程通知?
    2. 如果我在没有用户关闭我的应用的关闭通知的情况下请求新令牌,则检索到的令牌会有所不同或始终相同吗?
    3. 每次启动应用程序时都应该申请新令牌吗?

2 个答案:

答案 0 :(得分:16)

您想了解UIRemoteNotifications吗? :)很酷,因为它们并不像人们经常让它们变得那么复杂。不过,我将以相反的顺序解决您的问题。它的流动性比方式好。

您的问题:

  

每次启动应用程序时都应该申请新令牌吗?

排序。使用UIRemoteNotifications,您永远不会真正请求令牌,而是请求权限和接收令牌。您应该做的是在您的app委托中实施application:didRegisterForRemoteNotificationsWithDeviceToken:。此方法(及其错误捕获的兄弟application:didFailToRegisterForRemoteNotificationsWithError:)是registerForRemoteNotificationTypes:的回调。最佳做法是在registerForRemoteNotificationTypes:期间致电application:didFinishLaunchingWithOptions:。 (不要担心所有的方法名称都在飞来飞去。我会很快解释代码)。

  

如果我在没有用户关闭我的应用的关闭通知的情况下请求新令牌,则检索到的令牌不同或始终相同?

也许。出于安全原因,设备令牌可能会发生变化,但一般情况下,您不应该过于关注它的变化。

  

是否可以检查用户是否在我的应用代码中禁用了我的应用的远程通知?

为什么,是的。 UIApplicationDelegate有一个名为enabledRemoteNotificationTypes的方法,它可以获取您请求并由您的用户启用的所有远程通知类型。更多相关内容。

全部放在一起:

在一天结束时,你应该得到这样的结论:

#define deviceTokenKey   @"devtok"
#define remoteNotifTypes UIRemoteNotificationTypeBadge | \
                         UIRemoteNotificationTypeAlert

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    //generic setup and whatnot

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: remoteNotifTypes];
    if (([[NSUserDefaults standardUserDefaults] stringForKey: deviceTokenKey]) &&
        ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] != remoteNotifTypes))
    {
        //user has probably disabled push. react accordingly.
    }
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)token
{    
    NSString *deviceToken = [token description];
    deviceToken = [deviceToken stringByReplacingOccurrencesOfString: @"<" withString: @""];
    deviceToken = [deviceToken stringByReplacingOccurrencesOfString: @">" withString: @""];
    deviceToken = [deviceToken stringByReplacingOccurrencesOfString: @" " withString: @""];

    if ([[NSUserDefaults standardUserDefaults] stringForKey: deviceTokenKey])
    {
        if (![[[NSUserDefaults standardUserDefaults] stringForKey: deviceTokenKey] isEqualToString: deviceToken])
        {
            [[NSUserDefaults standardUserDefaults] setObject: deviceToken forKey: deviceTokenKey];
            [[NSUserDefaults standardUserDefaults] synchronize];

            //user allowed push. react accordingly.
        }
    }
    else
    {
        [[NSUserDefaults standardUserDefaults] setObject: deviceToken forKey: deviceTokenKey];
        [[NSUserDefaults standardUserDefaults] synchronize];

        //user allowed push. react accordingly.
    }
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog("application: %@ didFailToRegisterForRemoteNotificationsWithError: %@", application, [error localizedDescription]);
}

答案 1 :(得分:0)

  1. 我不确定你可以,我猜如果用户已经禁用了远程通知,通知仍会发送到用户的设备,但不会显示。
  2. 2。 可以根据此SO更改检索到的令牌。

    3。 是的,如果令牌发生变化。