我正在我的应用中实现推送通知服务。我以Easy Apns样式创建了一个服务,但是更简单。我有一个服务,它使用MySql数据库来存储应用程序令牌,第二个服务访问数据库,准备通知并发送它们。
它有效,但我不确定我的注册部分(在客户端)是否正确。
app委托方法:
- (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];
}
每次重新启动应用时,此代码都会更新令牌。这是对的吗?注册阶段不应该只发生一次(例如,用户第一次接受通知服务)?在我的情况下,每次重新启动应用程序时,令牌都会添加到我的数据库中(因此,如果它是复制的令牌,我必须从服务器端进行控制)。
答案 0 :(得分:2)
您注册APNS的方式没有任何问题,但您可以更有效地完成。
Apple suggests您每次启动应用程序时都会注册到APN服务(而不仅仅是第一次启动时),因为从理论上讲,设备令牌可能会发生变化(尽管它几乎不会实现)
应用程序应在每次启动时进行注册,并为其提供者提供当前令牌。
每次启动应用程序时,通过请求设备令牌并将其传递给提供程序,可以帮助确保提供程序具有设备的当前令牌。如果用户将备份还原到创建备份的设备或计算机以外的设备或计算机(例如,用户将数据迁移到新设备或计算机),则他或她必须至少启动一次应用程序再次收到通知。如果用户将备份数据还原到新设备或计算机,或重新安装操作系统,则设备令牌会更改。此外,永远不要缓存设备令牌并将其提供给您的提供商;始终在需要时从系统获取令牌。如果您的应用程序先前已注册,则调用registerForRemoteNotificationTypes:会导致操作系统立即将设备令牌传递给代理,而不会产生额外的开销。
您可以在NSUserDefaults本地存储设备令牌,并且每次调用didRegisterForRemoteNotificationsWithDeviceToken
时,您都可以将新接收的设备令牌与存储的设备令牌进行比较。只有当设备令牌与存储的令牌不同时,才需要将设备令牌发送到服务器。这样可以节省不必要的服务器调用。