我需要通过调用我的请求中需要JSON数据的服务,将我的iOS应用程序的APNS设备令牌发送给我的提供商。我正在阅读Apple的Local and Push Notification Programming Guide,它只是说application:didRegisterForRemoteNotificationsWithDeviceToken:
委托方法将设备令牌传递为NSData
,您应该将其传递给以二进制编码的提供程序数据。但是我需要将它转换为字符串才能向我的提供者发送JSON请求。
我也在阅读与此相关的几篇帖子,因为它看起来是常见的情况,但我发现了一些不同的方法将此类设备令牌转换为字符串以发送它,而且我&# 39;我不确定哪一个应该是最合适的。处理这个问题最可靠的方法是哪种?我想我的提供者需要将此字符串转换回调用APNS,我还需要在应用程序中存储此令牌,以便在生成新令牌并调用application:didRegisterForRemoteNotificationsWithDeviceToken:
时将其与新值进行安全比较,只有在令牌发生变化时才发送令牌。
由于
答案 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.
}
在几乎所有的网络平台上,这对我来说都是可靠的。