设备令牌和推送通知

时间:2012-11-15 17:01:55

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

我正在尝试将Push Notifications实施到我的应用程序中,但我相信,我可能是一个愚蠢的问题。我的推送通知有效,但它们有效,因为我将设备令牌放入服务器上的asp.net代码中。

我的问题是,我应该跟踪我的应用获得的设备令牌吗?换句话说,当应用程序启动并且我获得设备令牌时,我是否需要将它们发送到我的服务器并存储它们以便当我需要向我的应用程序的所有用户发送通知时我可以通过列表令牌并将通知发送到每个设备令牌?

感谢您提出的任何明确性,因为您猜测这是我第一次尝试推送通知。

2 个答案:

答案 0 :(得分:1)

您必须将设备令牌存储在数据库中。然后,您发送一个发送到每个设备令牌的通知。您可以自己创建系统,但是已经有这样做的开源库。虽然它适用于PHP,Easy APNS就是一个例子。

答案 1 :(得分:0)

我自己会遇到这种情况,因为事实证明硬编码设备令牌是限制可以发送推送通知的设备的一种方法但是如果你想允许任何下载你的应用的设备你需要创建一个将设备的设备令牌发送到服务器的机制,以便向其发送推送通知。您可以在应用程序加载时将此请求设置到您的服务器,在我的情况下,默认成功并且在失败时让用户知道它们没有添加到通知列表中。

以下是raywenderlich.com创建聊天程序的示例。 - 基本上他们正在创建一个发布请求,其中包含他们存储在数据库中的设备信息,然后访问数据库信息以进行迭代并发送通知。

一些相关代码:

- (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];
}