2011-09-20 28 views
10

Tôi đã đọc rất nhiều bài hướng dẫn cho điều này và tôi chỉ muốn ti biết nếu điều này là đúng cách để làm điều nàygửi thiết bị Token vào máy chủ

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 
{ 
    NSLog(@"My token is: %@", deviceToken); 

    NSString* newToken = [deviceToken description]; 

    newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
    newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 


    NSString *urlString = [NSString stringWithFormat:@"http://myhost.com./filecreate.php?token=%@",newToken]; 

    NSURL *url = [[NSURL alloc] initWithString:urlString]; 

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 

    NSData *urlData; 
    NSURLResponse *response; 
    urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil]; 

} 

bất kỳ lời khuyên được nhiều hơn thì hoan nghênh.

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 
{ 

    const char* data = [deviceToken bytes]; 
    NSMutableString* token = [NSMutableString string]; 

    for (int i = 0; i < [deviceToken length]; i++) { 
     [token appendFormat:@"%02.2hhX", data[i]]; 
    } 


    NSString *urlString = [NSString stringWithFormat:@"http://myhost.com/filecreate.php?token=%@",token]; 

    NSURL *url = [[NSURL alloc] initWithString:urlString]; 

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    NSData *urlData; 
    NSURLResponse *response; 
    urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil]; 

} 

Ứng dụng của tôi hoạt động với cả hai mã nhưng cách phù hợp là gì?

+0

Mã của bạn không hoạt động? – Nekto

+1

có vẻ tốt, nhưng, tôi sẽ 1, thêm cơ chế khôi phục lỗi (nếu yêu cầu không thành công, bạn sẽ mất mã thông báo!) Và b, sử dụng yêu cầu không đồng bộ. – mja

+1

không đồng bộ? làm thế nào để bạn có nghĩa là.Vui lòng cho tôi một số dòng hướng dẫn cho cơ chế phục hồi lỗi cũng. Các mã hoạt động nhưng tôi đã tự hỏi nếu điều này là đúng cách, gây ra tôi đã đọc một nơi nào đó 'NSString * newToken = [deviceToken mô tả];' đây không phải là cách đúng để có được dữ liệu vào chuỗi – Spire

Trả lời

18

Như mja nói trong ý kiến, nó tốt hơn để thêm cơ chế phục hồi lỗi (nếu yêu cầu không bạn sẽ mất thẻ của bạn) và sử dụng yêu cầu không đồng bộ (gửi thẻ ở chế độ nền)

Trong AppDelegate.m của bạn:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 
{ 
    NSString * token = [NSString stringWithFormat:@"%@", deviceToken]; 
    //Format token as you need: 
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    token = [token stringByReplacingOccurrencesOfString:@">" withString:@""]; 
    token = [token stringByReplacingOccurrencesOfString:@"<" withString:@""]; 

    [[NSUserDefaults standardUserDefaults] setObject:token forKey:@"apnsToken"]; //save token to resend it if request fails 
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"apnsTokenSentSuccessfully"]; // set flag for request status 
    [DataUpdater sendUserToken]; //send token 
} 

Để gửi thẻ tạo lớp mới (hoặc sử dụng một trong những hiện có):
DataUpdater.h

#import <Foundation/Foundation.h> 

@interface DataUpdater : NSObject  
+ (void)sendUserToken; 
@end 

DataUpdater.m

#import "DataUpdater.h" 

@implementation DataUpdater 

+ (void)sendUserToken { 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"apnsTokenSentSuccessfully"]) { 
     NSLog(@"apnsTokenSentSuccessfully already"); 
     return; 
    } 

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://myhost.com/filecreate.php?token=%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"apnsToken"]]]; //set here your URL 

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     if (error == nil) { 
      [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"apnsTokenSentSuccessfully"]; 
      NSLog(@"Token is being sent successfully"); 
      //you can check server response here if you need 
     } 
    }]; 
} 

@end 

Sau đó, bạn có thể gọi [DataUpdater sendUserToken]; trong bộ điều khiển của bạn khi kết nối internet xuất hiện, hoặc định kỳ, hoặc trong - (void) viewDidLoad hoặc - (void) viewWillAppear phương pháp

tôi khuyên:
1) Tôi sử dụng AFNetworking để gửi yêu cầu async và kiểm tra máy chủ đáp ứng
2 JSON) Một số lần nó tốt hơn để sử dụng các dịch vụ như Parse để làm việc với các thông báo đẩy

+0

Thx dude nhưng đây là câu hỏi rất rất cũ. Ill chấp nhận câu trả lời, nó có thể có lợi cho ai đó. – Spire

+3

Tôi nghĩ bạn nên gọi [đồng bộ hóa] (https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/nsuserdefaults_class/reference/reference.html # // apple_ref/occ/instm/NSUserDefaults/synchronize) sau khi lưu trữ thông tin. – nsacerdote

0

Trong phương pháp didFinishLaunchingWithOptions

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
    (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 

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

#pragma mark - 
#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); 
} 
+0

Mã trong didFinishLaunchingWithoptions phải thêm để nhận thông báo đẩy –

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