8

Tôi cần gửi mã thông báo thiết bị APNS của ứng dụng iOS cho nhà cung cấp của mình bằng cách gọi dịch vụ dự kiến ​​dữ liệu JSON trong yêu cầu của tôi. Tôi đang đọc số Local and Push Notification Programming Guide của Apple và nó chỉ nói rằng phương thức ủy quyền application:didRegisterForRemoteNotificationsWithDeviceToken: chuyển mã thông báo thiết bị là NSData và bạn nên chuyển nó tới nhà cung cấp của bạn được mã hóa trong dữ liệu nhị phân. Nhưng tôi cần nó được chuyển thành chuỗi để có thể gửi yêu cầu JSON tới nhà cung cấp của tôi.iOS APNS: gửi mã thông báo thiết bị đến nhà cung cấp ở định dạng chuỗi

Tôi cũng đã đọc một số bài viết liên quan đến điều này, vì có vẻ như đây là một kịch bản phổ biến, nhưng tôi đã tìm thấy một số cách khác nhau để chuyển đổi mã thông báo thiết bị đó thành chuỗi. cái nào trong số đó là thích hợp nhất. Cách nào đáng tin cậy nhất để giải quyết vấn đề này? Tôi cho rằng nhà cung cấp của tôi sẽ cần phải chuyển đổi chuỗi này trở lại để gọi APNS và tôi cũng cần lưu trữ mã thông báo này trong ứng dụng để so sánh nó một cách an toàn với giá trị mới nếu mã thông báo mới được tạo và gọi là application:didRegisterForRemoteNotificationsWithDeviceToken:. chỉ mã thông báo nếu nó đã thay đổi.

Cảm ơn

Trả lời

10

Bạn có phải là bạn phải chuyển đổi các thiết bị thẻ NSData-NSString để có thể gửi nó với một đối tượng JSON. Nhưng phương pháp chuyển đổi nào bạn chọn hoàn toàn là tùy thuộc vào bạn hoặc các yêu cầu của nhà cung cấp. Các phương pháp phổ biến nhất là chuỗi hình lục giác (xem ví dụ Best way to serialize an NSData into a hexadeximal string) hoặc chuỗi Base64 (sử dụng base64EncodedStringWithOptions). Cả hai đều là 100% "đáng tin cậy".

Ngoài ra, bạn luôn phải gửi mã thông báo thiết bị cho nhà cung cấp và không chỉ khi nó đã thay đổi. Nhà cung cấp phải giữ một cơ sở dữ liệu của tất cả các thẻ thiết bị có dấu thời gian là khi nó được gửi gần đây nhất, để so sánh dấu thời gian với câu trả lời có thể là từ "dịch vụ phản hồi".

+0

Cảm ơn, cuối cùng tôi đã sử dụng mã bạn đã chỉ định để tạo chuỗi thập lục phân – AppsDev

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

điều này đã làm việc đáng tin cậy đối với tôi trên hầu hết các nền tảng web.

8

Trong phương pháp 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)]; 
} 

Sau khi thực hiện trên dòng mã, thêm phương thức dưới đây

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

Sau khi bước được liệt kê ở trên, bạn có thể sử dụng chức năng đại biểu này để lấy và xử lý các thông báo đẩy một lần Phương thức được thêm bên dưới sẽ kích hoạt ứng dụng đang chạy ở chế độ nền hoặc không. Phương thức đưa ra bên dưới có sẵn từ ios7.0

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

Đây là sự hiểu biết của tôi để thực hiện ghi chú, nếu bạn tìm thấy bất kỳ lỗi nào với mã này, vui lòng thêm ..... –

+1

Có vấn đề tương tự, giải pháp là làm theo câu trả lời của bạn để xóa tất cả ký tự "khoảng trắng" khỏi mã thông báo thiết bị. Điều này đã được cho PushSharp không chắc chắn nếu đây là một hướng dẫn chung cho Push Notification API. – David

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

Chuyển đổi dữ liệu thành byte nghĩa là chúng tôi có thể đếm. Xóa không gian và <> thực sự không phải là ý tưởng tốt

+0

Làm cho ý nghĩa hơn nhiều so với các phương pháp tiếp cận "mô tả" lỗi khác trong tương lai! Cảm ơn! –

Các vấn đề liên quan