ios如何实现推送通知

推送通知的步骤: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 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];
}	

你可能感兴趣的:(ios,application,token,badge,服务器,action)