Программа Objective-C получила сигнал: push-уведомления "EXC_BAD_ACCESS" - PullRequest
2 голосов
/ 25 января 2012

Я кодирую Objective-C целых 2 дня.У меня есть эта проблема:

//Notification methods
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken started with %@", deviceToken);   
    const void *devTokenBytes = [deviceToken bytes];
    self->registered = YES;
    //NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken ended with %@", devTokenBytes);  
    [self sendProviderDeviceToken:devTokenBytes];
}

- (void) application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"didFailToRegisterForRemoteNotificationsWithError started with %@", error);  
}

- (BOOL)sendProviderDeviceToken:(void *)deviceToken
{

    //NSLog(@"sendProviderDeviceToken started with %@", deviceToken);   
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://some_url//pushRegistration"]];
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:deviceToken, @"registrationId", @"06d746d0-e67e-11e0-911d-c42c0322474a", @"authenticationToken", @"apns", @"type", nil];

    NSError *theError = NULL;
    NSData *theData = [[CJSONSerializer serializer] serializeObject:dict error:&theError];
    NSData *requestData = [NSData dataWithBytes:[theData bytes] length:[theData length]];

    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody: requestData];

    NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil ];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];

    NSLog(@"returnData: %@", returnString);   

    return YES;
}

Вы, вероятно, узнаете этот пример из Apple Dev Center.Проблема в том, что я получаю сигнал EXC_BAD_ACCESS при попытке обратиться к deviceToken в методе sendProviderDeviceToken.

Что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 25 января 2012

Токен устройства также можно использовать как строку (ниже приведен фрагмент одного из моих живых проектов),

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    NSLog(@"My token is: %@", deviceToken);

    NSString *strDeviceToken = [[NSString alloc]initWithFormat:@"%@",[[[deviceToken description]
                                                          stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] 
                                                         stringByReplacingOccurrencesOfString:@" " 
                                                         withString:@""]];
    NSLog(@"%@",strDeviceToken);

    [self sendProviderDeviceToken:strDeviceToken];

}

Изменить сигнатуру метода с этого

- (BOOL)sendProviderDeviceToken:(void *)deviceToken

до

- (BOOL)sendProviderDeviceToken:(NSString *)deviceToken
2 голосов
/ 25 января 2012

Можете ли вы попробовать вместо этого использовать NSString?

NSString *tokenString = [[[[[deviceToken description] 
    stringByReplacingOccurrencesOfString:@"<"withString:@""] 
    stringByReplacingOccurrencesOfString:@">" withString:@""] 
    stringByReplacingOccurrencesOfString: @" " withString: @""] uppercaseString];
1 голос
/ 11 июля 2014

Вы установили deviceToken в словаре, поэтому это должен быть тип объекта string.

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

      const unsigned *tokenBytes = [deviceToken bytes];
            NSString *deviceUDID = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                          ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                          ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                          ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];

     [self sendProviderDeviceToken:devTokenBytes];

}

И метод должен быть в строковом типе:

- (BOOL)sendProviderDeviceToken:(NSString *)deviceToken

Это будет работать для вас!

Спасибо

1 голос
/ 16 мая 2013
NSString *deviceTokenString = [[[[deviceToken description]
                           stringByReplacingOccurrencesOfString:@"<"withString:@""]
                          stringByReplacingOccurrencesOfString:@">" withString:@""]
                         stringByReplacingOccurrencesOfString: @" " withString: @""];
...