推送通知中的设备令牌

时间:2012-02-04 15:00:18

标签: iphone objective-c ios devicetoken

我只想向某些用户发送推送通知。

从我在Apple文档中经历的内容。 注册推送通知的代码是

- (void)applicationDidFinishLaunching:(UIApplication *)app {
   // other setup tasks here....
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}

// Delegation methods
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    const void *devTokenBytes = [devToken bytes];
    self.registered = YES;
    [self sendProviderDeviceToken:devTokenBytes]; // custom method
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    NSLog(@"Error in registration. Error: %@", err);
}

在方法appdidRegisterForRemoteNotif中..我看到只创建了devToken字节并发送到服务器..但是我如何识别哪个设备令牌属于哪个用户。所以,如果我的设备名称是Shubhank的iPhone。如何发送我的iPhone的信息,这是我的设备令牌。

3 个答案:

答案 0 :(得分:6)

通常,您不会在委托方法本身更新服务器上的apns标记。保存它并在以后识别用户时更新它。

你可以这样做:

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {

const unsigned *tokenBytes = [deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                      ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                      ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                      ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
[[MyModel sharedModel] setApnsToken:hexToken];

}

用这个你在模型对象(MyModel)中保存了apns标记。稍后当您确定用户时(通过登录/注册或任何方法)

你可以调用这个方法

[self sendProvidedDeviceToken: [[MyModel sharedModel] apnsToken] forUserWithId: userId];  //Custom method

这样您就可以将设备令牌与用户相关联。希望这有帮助!

答案 1 :(得分:2)

您需要在自定义方法中注册时发送设备名称。代码应如下所示。如果应用程序使用某种类型的用户名,您可以发送适合您的上下文的任何信息,例如用户名。您可以决定将哪些信息发送到您的服务器,以便在令牌和设备之间建立连接。

// Delegation methods
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    const void *devTokenBytes = [devToken bytes];
    self.registered = YES;
    [self sendProviderDeviceToken:devTokenBytes deviceName:[[UIDevice currentDevice] name]]; // custom method
}

答案 2 :(得分:1)

您可以将自己需要的任何信息发送到自己的推送服务中。

但重要的一点是:推送令牌不是设备令牌(UDID)。推送令牌对于请求它们的每个应用程序都是唯一的,并且可以并且确实可以更改。如果您想获取设备名称,可以拨打[[UIDevice currentDevice] name],然后将其发布到用于存储推送令牌的任何内容中。