我的任务是将推送通知功能添加到我的应用程序中,但我有一个问题:当我在服务器上的asp.net代码中放置设备令牌时,它们能够工作,但这是否意味着我需要跟踪应用程序获取的设备令牌?换句话说,当应用程序启动并获取设备令牌时,我需要将它们发送到我的服务器并存储它们,以便在需要向所有用户发送通知时,可以遍历令牌列表并将通知发送到每个设备令牌吗?感谢您带来的任何清晰度,因为这是我第一次尝试推送通知。
您需要将设备令牌存储在数据库中,然后向每个设备令牌发送通知。您可以自己创建系统,但也有已经完成此操作的开源库。虽然它是针对PHP的,但Easy APNS是一个例子。
我自己也遇到了这种情况,硬编码设备令牌是限制可以接收推送通知的设备的一种方式,但如果您想允许任何下载了您的应用程序的设备,则需要创建一种机制将设备的设备令牌发送到您的服务器,以便向其发送推送通知。您可以在应用程序加载时设置此请求,在我的情况下默默成功,失败时让用户知道他们未被添加到通知列表中。
以下是来自raywenderlich.com的示例,该示例创建了一个聊天程序。基本上,他们正在创建一个带有设备信息的POST请求,将其存储在数据库中,并稍后访问DB信息以迭代并发送通知。
一些相关代码:
- (void)postJoinRequest
{
MBProgressHUD* hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.labelText = NSLocalizedString(@"Connecting", nil);
NSURL* url = [NSURL URLWithString:ServerApiURL];
__block ASIFormDataRequest* request = [ASIFormDataRequest requestWithURL:url];
[request setDelegate:self];
[request setPostValue:@"join" forKey:@"cmd"];
[request setPostValue:[dataModel udid] forKey:@"udid"];
[request setPostValue:[dataModel deviceToken] forKey:@"token"];
[request setPostValue:[dataModel nickname] forKey:@"name"];
[request setPostValue:[dataModel secretCode] forKey:@"code"];
[request setCompletionBlock:^
{
if ([self isViewLoaded])
{
[MBProgressHUD hideHUDForView:self.view animated:YES];
if ([request responseStatusCode] != 200)
{
ShowErrorAlert(NSLocalizedString(@"There was an error communicating with the server", nil));
}
else
{
[self userDidJoin];
}
}
}];
[request setFailedBlock:^
{
if ([self isViewLoaded])
{
[MBProgressHUD hideHUDForView:self.view animated:YES];
ShowErrorAlert([[request error] localizedDescription]);
}
}];
[request startAsynchronous];
}