【问题标题】:Device token in push notification推送通知中的设备令牌
【发布时间】:2012-02-26 20:16:09
【问题描述】:

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

根据我在 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 就是这个并且这是我的设备令牌的信息。

【问题讨论】:

    标签: iphone objective-c ios devicetoken


    【解决方案1】:

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

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

    【讨论】:

    • 假设我希望用户为他的设备输入一个特定的名称,所以我提供了一个他写 ABC 的文本字段。但我相信 appdidRegisterForRemoteNotif 已经被调用,直到发生这种情况..所以我可以再次注册推送通知吗?
    • 否 - 您需要保留您的推送令牌,然后在您收到设备名称后将其发送到您的后端服务。
    • [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];这在应用程序启动时被调用..所以我相信在我可以向我的用户显示文本字段之前也会调用 idRegisterForRemoteNotificati.. 所以我相信你是说我可以稍后调用 [self sendProvider:Userinput] .. 但是服务器如何知道这个名字是为这个 devTokenBytes 而来的
    【解决方案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
    }
    

    【讨论】:

    • 假设我希望用户为他的设备输入一个特定的名称,所以我提供了一个他写 ABC 的文本字段。但我相信 appdidRegisterForRemoteNotif 已经被调用,直到发生这种情况。所以我可以再次注册推送通知吗?
    • 最好等用户输入名字后再注册设备。在我当前的应用程序中,我等到用户登录后才进行注册。没有什么要求您在启动时注册。
    • [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];这在应用程序启动时被调用..所以我相信在我可以向我的用户显示文本字段之前也会调用 idRegisterForRemoteNotificati.. 所以我相信你是说我可以稍后调用 [self sendProvider:Userinput] .. 但是服务器如何知道这个名字是为这个 devTokenBytes 而来的
    • 您在同一次调用中将令牌和用户名发送到服务器。你把这些放在一个数据库中。每当您想向特定用户发送消息时,您都会查找相应的令牌。
    【解决方案3】:

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

    通过这种方式,您已将设备令牌与用户相关联。希望这会有所帮助!

    【讨论】:

    • 嗯,谢谢,这确实解决了我正在寻找的问题......但我现在有一个重要问题......每次应用启动时令牌字节都会改变吗??......
    • 虽然令牌并不总是会改变,但始终建议您在每次应用启动时更新令牌。如果对您有帮助,请投票/接受答案。
    • 我会..但我想知道.这让我很困惑..可以说设备令牌相同..然后设备将在我的服务器上重新注册..所以我必须开发一种覆盖工作的机制? ..或者如果令牌更改..那么我将如何处理旧设备名称??
    • 是的,您必须编写覆盖机制。因为你不能保证令牌不会改变。此外,用户可能从一台设备登录,然后从另一台设备登录,在这种情况下,您肯定必须为该用户更新 apns 令牌
    • 请阅读@JohanKarlsson 的评论。代币改变,例如通过 iOS 版本的更改,或不时更改。因此,每次应用启动时检查令牌是否仍然相同是个好主意。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多