0

我正在我的应用程序中实现推送通知服务。我以Easy Apns风格创建了一个服务,但方式更简单。我有一个使用 MySql 数据库来存储应用程序令牌的服务和一个访问数据库、准备通知并发送它们的第二个服务。

它有效,但我不确定我的注册部分(在客户端)是否正确。

应用委托方法:

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

    NSString *urlString = [@"/apns.php?"stringByAppendingString:@"task=register"];
    urlString = [urlString stringByAppendingString:@"&appname="];
    NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
    urlString = [urlString stringByAppendingString:appName];
    urlString = [urlString stringByAppendingString:@"&devicetoken="];
    urlString = [urlString stringByAppendingString:devToken];


NSString *host = @"myservice.php";
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

}

每次重新启动应用程序时,此代码都会更新令牌。这是对的吗?注册阶段不应该只发生一次(例如,用户第一次接受通知服务)?就我而言,每次重新启动应用程序时,都会将令牌添加到我的数据库中(因此,如果它是复制的令牌,我必须从服务器端进行控制)。

4

1 回答 1

2

您注册 APNS 的方式没有任何问题,但您可以更有效地进行注册。

Apple 建议您在每次启动应用程序时注册 APN 服务(不仅是在第一次启动时),因为理论上设备令牌可能会更改(尽管它几乎不会更改)。

应用程序应在每次启动时注册并为其提供者提供当前令牌。

通过在每次启动应用程序时请求设备令牌并将其传递给提供者,您可以帮助确保提供者拥有设备的当前令牌。如果用户将备份还原到创建备份的设备或计算机之外的设备或计算机(例如,用户将数据迁移到新设备或计算机),他或她必须至少启动一次应用程序才能使其恢复再次收到通知。如果用户将备份数据恢复到新设备或计算机,或重新安装操作系统,则设备令牌会更改。此外,永远不要缓存设备令牌并将其提供给您的提供商;始终在需要时从系统获取令牌。如果您的应用程序之前已注册,请调用 registerForRemoteNotificationTypes:

您可以将设备令牌本地存储在NSUserDefaults中,每次didRegisterForRemoteNotificationsWithDeviceToken调用时,您都可以将新收到的设备令牌与存储的设备令牌进行比较。仅当设备令牌与存储的令牌不同时,您才需要将设备令牌发送到您的服务器。这将节省不必要的服务器调用。

于 2013-09-15T13:14:24.027 回答