ios推送

来源:互联网 发布:arcgis js 事件关闭 编辑:程序博客网 时间:2024/05/16 07:42

原文地址:blog.csdn.net/ios_che/article/details/7428413


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

- (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 zeroNSUserDefaults *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 requestNSLog(@"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 requestNSString *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];}


0 0
原创粉丝点击