- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
}
3、将token发送到服务器上
4、服务器收到toke后 发送推送通知,客户端相应该推送同通知
代码如下:
//每次唤醒
- (void)applicationDidBecomeActive:(UIApplication *)application { /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ //每次醒来都需要去判断是否得到device token [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(registerForRemoteNotificationToGetToken) userInfo:nil repeats:NO]; //hide the badge application.applicationIconBadgeNumber = 0; [[CheckVersion sharedCVInstance] checkVersionOfServer]; [[AnalyticsUtil sharedAnalyticsUtil] appLaunch]; AnalyticsJSONElement *viewElement = [[AnalyticsJSONElement alloc] init]; viewElement.jsonType = AnalyticsJSONTypeView; viewElement.typeID = @"0"; [[AnalyticsUtil sharedAnalyticsUtil] postAnalyticsMsgToServerWithElement:viewElement]; [viewElement release]; } - (void)applicationWillTerminate:(UIApplication *)application { /* Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. */ } #pragma mark - #pragma mark - Getting Device token for Notification support //向服务器申请发送token 判断事前有没有发送过 - (void)registerForRemoteNotificationToGetToken { NSLog(@"Registering for push notifications..."); //注册Device Token, 需要注册remote notification NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; if (![userDefaults boolForKey:DeviceTokenRegisteredKEY]) //如果没有注册到令牌 则重新发送注册请求 { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; }); } //将远程通知的数量置零 dispatch_async(dispatch_get_global_queue(0,0), ^{ //1 hide the local badge if ([[UIApplication sharedApplication] applicationIconBadgeNumber] == 0) { return; } // [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; //2 ask the provider to set the BadgeNumber to zero NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSString *deviceTokenStr = [userDefaults objectForKey:DeviceTokenStringKEY]; [self resetBadgeNumberOnProviderWithDeviceToken:deviceTokenStr]; }); } //允许的话 自动回调的函数 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { //将device token转换为字符串 NSString *deviceTokenStr = [NSString stringWithFormat:@"%@",deviceToken]; //modify the token, remove the "<, >" NSLog(@" deviceTokenStr lentgh: %d ->%@", [deviceTokenStr length], [[deviceTokenStr substringWithRange:NSMakeRange(0, 72)] substringWithRange:NSMakeRange(1, 71)]); deviceTokenStr = [[deviceTokenStr substringWithRange:NSMakeRange(0, 72)] substringWithRange:NSMakeRange(1, 71)]; NSLog(@"deviceTokenStr = %@",deviceTokenStr); //将deviceToken保存在NSUserDefaults NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; //保存 device token 令牌,并且去掉空格 [userDefaults setObject:[deviceTokenStr stringByReplacingOccurrencesOfString:@" " withString:@""] forKey:DeviceTokenStringKEY]; //send deviceToken to the service provider dispatch_async(dispatch_get_global_queue(0,0), ^{ //没有在service provider注册Device Token, 需要发送令牌到服务器 if ( ![userDefaults boolForKey:DeviceTokenRegisteredKEY] ) { NSLog(@" 没有 注册Device Token"); [self sendProviderDeviceToken:deviceTokenStr]; } }); } - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSString *str = [NSString stringWithFormat: @"Error: %@", err]; NSLog(@"获取令牌失败: %@",str); //如果device token获取失败则需要重新获取一次 //[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(registerForRemoteNotificationToGetToken) userInfo:nil repeats:NO]; } //获取远程通知 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"received badge number ---%@ ----",[[userInfo objectForKey:@"aps"] objectForKey:@"badge"]); for (id key in userInfo) { NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]); } NSLog(@"the badge number is %d", [[UIApplication sharedApplication] applicationIconBadgeNumber]); NSLog(@"the application badge number is %d", application.applicationIconBadgeNumber); application.applicationIconBadgeNumber += 1; // We can determine whether an application is launched as a result of the user tapping the action // button or whether the notification was delivered to the already-running application by examining // the application state. //当用户打开程序时候收到远程通知后执行 if (application.applicationState == UIApplicationStateActive) { // Nothing to do if applicationState is Inactive, the iOS already displayed an alert view. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:[NSString stringWithFormat:@"\n%@", [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; dispatch_async(dispatch_get_global_queue(0,0), ^{ //hide the badge application.applicationIconBadgeNumber = 0; //ask the provider to set the BadgeNumber to zero NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSString *deviceTokenStr = [userDefaults objectForKey:DeviceTokenStringKEY]; [self resetBadgeNumberOnProviderWithDeviceToken:deviceTokenStr]; }); [alertView show]; [alertView release]; } } // http://192.168.11.24/ClientInterface.ashx?action= savetoken&clientid=3898329492492424924932&token=343424324242 #pragma mark - #pragma mark - Getting Device token for Notification support
//发送token - (void)sendProviderDeviceToken: (NSString *)deviceTokenString { // Establish the request NSLog(@"sendProviderDeviceToken = %@", deviceTokenString); NSString *UDIDString = [[UIDevice currentDevice] uniqueIdentifier]; NSString *body = [NSString stringWithFormat:@"action=savetoken&clientid=%@&token=%@", UDIDString, deviceTokenString]; NSString *baseurl = [NSString stringWithFormat:@"%@?",URL_OF_PUSH_NOTIFICATION_SERVER]; //服务器地址 NSLog(@"send provider device token = %@", baseurl); NSURL *url = [NSURL URLWithString:baseurl]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod: @"POST"]; [urlRequest setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSURLConnection *tConnection = [[NSURLConnection alloc] initWithRequest: urlRequest delegate: self]; self.deviceTokenConnetion = [tConnection retain]; [tConnection release]; } #pragma mark - #pragma mark - reset Badge Number - (void)resetBadgeNumberOnProviderWithDeviceToken: (NSString *)deviceTokenString { NSLog(@" reset Provider DeviceToken %@", deviceTokenString); isNotificationSetBadge = YES; // Establish the request NSString *body = [NSString stringWithFormat:@"action=setbadge&token=%@", [deviceTokenString stringByReplacingOccurrencesOfString:@" " withString:@""]]; NSString *baseurl = [NSString stringWithFormat:@"%@?", URL_OF_PUSH_NOTIFICATION_SERVER]; //服务器地址 NSURL *url = [NSURL URLWithString:baseurl]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod: @"POST"]; [urlRequest setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSURLConnection *tConnection = [[NSURLConnection alloc] initWithRequest: urlRequest delegate: self]; self.deviceTokenConnetion = [tConnection retain]; [tConnection release]; } #pragma mark - #pragma mark - NSURLConnection delegate function - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSHTTPURLResponse *resp = (NSHTTPURLResponse *)response; NSLog(@"Response statusCode: %d", resp.statusCode); } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSString *rsp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"connection 2 Received data = %@ ", rsp); //if the string from provider is "true", means the devicetoken is stored in the provider server //so the app won't send the devicetoken next time. if (isNotificationSetBadge == NO) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; if([rsp isEqualToString:@"true"]) { NSLog(@"connection 2.2 Received data = %@ ", rsp); [userDefaults setBool:YES forKey:DeviceTokenRegisteredKEY]; } }else{//isNotificationSetBadge == YES; NSLog(@"connection 2 reset"); isNotificationSetBadge = NO; } [rsp release]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"connection 3 Did Finish Loading "); [self.deviceTokenConnetion cancel]; }