iOS APNS:以字符串格式将设备令牌发送给提供者

时间:2014-04-05 10:10:38

标签: ios apple-push-notifications string-formatting devicetoken

我需要通过调用我的请求中需要JSON数据的服务,将我的iOS应用程序的APNS设备令牌发送给我的提供商。我正在阅读Apple的Local and Push Notification Programming Guide,它只是说application:didRegisterForRemoteNotificationsWithDeviceToken:委托方法将设备令牌传递为NSData,您应该将其传递给以二进制编码的提供程序数据。但是我需要将它转换为字符串才能向我的提供者发送JSON请求。

我也在阅读与此相关的几篇帖子,因为它看起来是常见的情况,但我发现了一些不同的方法将此类设备令牌转换为字符串以发送它,而且我&# 39;我不确定哪一个应该是最合适的。处理这个问题最可靠的方法是哪种?我想我的提供者需要将此字符串转换回调用APNS,我还需要在应用程序中存储此令牌,以便在生成新令牌并调用application:didRegisterForRemoteNotificationsWithDeviceToken:时将其与新值进行安全比较,只有在令牌发生变化时才发送令牌。

由于

4 个答案:

答案 0 :(得分:10)

您必须将设备令牌从NSData转换为NSString 能够使用JSON对象发送它。但是你选择的转换方法是完全的 由您或提供者的要求决定。最常见的方法是a 十六进制字符串(参见例如Best way to serialize an NSData into a hexadeximal string)或Base64字符串(使用 base64EncodedStringWithOptions)。两者都是100%“可靠”。

此外,您应始终将设备令牌发送给提供商,而不仅仅是在更改时。提供者必须保留所有设备令牌的数据库,其时间戳为 当它最近发送时,为了比较时间戳和可能的响应 来自“反馈服务”。

答案 1 :(得分:8)

在didFinishLaunchingWithOptions方法

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}

完成上述代码行后,添加以下方法

#pragma mark Push Notifications
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString  *token_string = [[[[deviceToken description]    stringByReplacingOccurrencesOfString:@"<"withString:@""]
                        stringByReplacingOccurrencesOfString:@">" withString:@""]
                       stringByReplacingOccurrencesOfString: @" " withString: @""];
NSString* strURL = [NSString stringWithFormat:@"http://www.sample.com?device_token=%@&type=IOS",token_string];
strURL=[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",strURL);
NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSLog(@"content---%@", fileData);
}

在上面列出的步骤之后,您可以使用此委托功能来检索并处理推送通知。以下添加的方法将触发应用程序在后台运行或不运行。下面给出的方法可从ios7.0获得

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler

答案 2 :(得分:6)

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])];

将数据转换为字节意味着我们可以对其进行计数。删除空格和&lt;&gt;真的不是一个好主意

答案 3 :(得分:0)

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

NSString *str = [NSString stringWithFormat:@"%@",_deviceToken];
//replace '<' and '>' along with spaces before you send it to the server.
}

在几乎所有的网络平台上,这对我来说都是可靠的。