您的位置:首页 > 移动开发 > IOS开发

IOS 如何实现推送通知

2013-12-18 17:25 399 查看
//  http://blog.csdn.net/ios_che/article/details/7428413

推送通知的步骤:1、询问是否允许推送通知。2、如果用户允许在APPDELEGATE 中实现

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

}

3、将token发送到服务器上

4、服务器收到toke后 发送推送通知,客户端相应该推送同通知

代码如下:

[cpp] view
plaincopy

//每次唤醒  

[cpp] view
plaincopy

- (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  

[cpp] view
plaincopy

//发送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];  

}     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: