TAG

RSS订阅

收藏本站

设为首页

当前位置:主页 > 移动开发 > IOS开发 >

didRegisterForRemoteNotificationsWithDeviceToken这个方法不执

发布时间:2014-12-26 15:11 类别:IOS开发

didRegisterForRemoteNotificationsWithDeviceToken这个方法不执行

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

来源:http://blog.csdn.net/ios_che/article/details/7428413

猜你会喜欢....

Copyright © 2015 www.wahenzan.com 哇!很赞 版权所有 浙ICP备14030256号-1 Power by DedeCms

浙公网安备 33010602005986号

声明:本站所有文章除标明原创外,均来自网络转载,版权归原作者所有,如果有侵犯到您的权益,请联系本站删除 网站管理员:758763728

360网站安全检测平台