Ответ 1
Как сказано в комментариях, лучше добавить механизм восстановления ошибок (если запрос не удался, вы потеряете токен) и используйте асинхронный запрос (отправьте токен в фоновом режиме)
В AppDelegate.m:
- (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
}
Чтобы отправить токен, создайте новый класс (или используйте один из существующих):
<Б > 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
Затем вы можете вызвать [DataUpdater sendUserToken]; в ваших контроллерах при появлении интернет-соединения или периодически или в - (void) viewDidLoad или - ( void) viewWillAppear
Мои советы:
1) Я использую AFNetworking для отправки асинхронного запроса и проверки ответа сервера JSON
2) Несколько раз лучше использовать такие сервисы, как Parse для работы с push-уведомлениями