Iphone 推送通知中的设备令牌

Iphone 推送通知中的设备令牌,iphone,objective-c,ios,devicetoken,Iphone,Objective C,Ios,Devicetoken,我只想向某些用户发送推送通知 从我在苹果文档中的经历来看。 注册推送通知的代码如下 - (void)applicationDidFinishLaunching:(UIApplication *)app { // other setup tasks here.... [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemot

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

从我在苹果文档中的经历来看。 注册推送通知的代码如下

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

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

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


但有一点很重要:推送令牌不是设备令牌(UDID)。推送令牌对于每个请求它们的应用程序来说都是唯一的,并且可以并且确实改变。如果您想获得除此之外的设备名称,可以调用
[[UIDevice currentDevice]name]
,并将其发布到用于存储推送令牌的任何位置。

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

// 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
}

通常,您不会在委托方法本身中更新服务器上的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];

}
这样,您将apns令牌保存在模型对象(MyModel)中。之后,当您识别了您的用户时(通过登录/注册或任何方法)

您可以调用此方法

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

通过这种方式,您已将设备令牌与用户链接。希望这有帮助

比方说,我希望用户为他的设备输入一个特定的名称,因此我提供了一个文本字段,他在其中写入ABC。但我相信AppDidRegisterForRemotontoTIF已经被调用,直到发生这种情况。。那么,我可以再次注册推送通知吗?否-您需要保留推送令牌,然后在稍后收到设备名称后将其发送到后端服务。[[UIApplication sharedApplication]RegisterForremoteNotificationTypeBadge:[UIRemoteNotificationTypeSound];这是在应用程序启动时调用的。因此,我相信在我向用户显示文本字段之前,还会调用idRegisterForRemoteNotificati。。。。所以我相信你是说我可以稍后调用[self-sendProvider:Userinput]。。但是服务器怎么知道这个名字是为这个devtokenbytes而来的呢?他们说我想让用户为他的设备输入一个特定的名字,所以我提供了一个他写ABC的文本字段。但我相信AppDidRegisterForRemotontoTIF已经被调用,直到发生这种情况。。那么我可以再次注册推送通知吗?最好在注册设备之前等待用户输入名称。在我当前的应用程序中,我等待进行注册,直到用户登录。没有要求您在启动时注册的内容。[[UIApplication sharedApplication]registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];这是在应用程序启动时调用的。因此,我相信在我向用户显示文本字段之前,还会调用idRegisterForRemoteNotificati。。。。所以我相信你是说我可以稍后调用[self-sendProvider:Userinput]。。但是,服务器如何知道此devtokenbyte的名称是您在同一个调用中向服务器发送令牌和用户名。您可以将其放入数据库中。每当你想向特定用户发送消息时,你都会查找相应的令牌。谢谢你解决了我的问题。。。但我现在有一个重要的问题..令牌字节是否在每次应用程序启动时都会更改..虽然令牌是否会更改并不总是正确的,但总是建议您在每次应用程序启动时更新令牌。如果答案对你有帮助,请投票/接受。我会的。。但我想知道这让我很困惑。。假设设备令牌相同。。然后设备将在我的服务器上重新注册。。所以我必须开发一种机制,使覆盖有效。。或者如果令牌发生了变化。。那么我将如何处理旧设备名?是的,您必须编写覆盖机制。因为您不能保证令牌不会更改。此外,用户可能先从一个设备登录,然后再从另一个设备登录,在这种情况下,您肯定必须更新该用户的apns令牌,只需读取@johankarsson注释即可。代币会发生变化,例如,通过iOS版本的变化或不时的变化。因此,每次应用程序启动时检查令牌是否仍然相同是一个好主意。