Сохранение DeviceToken для последующего использования в службах push-уведомлений Apple - PullRequest
11 голосов
/ 29 сентября 2011

В моем приложении для iPhone я получаю токен устройства от Apple, которому я назначаю общедоступное свойство в файле Delegate, как показано ниже:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
   self.dToken = [[NSString alloc] initWithData:deviceToken encoding:NSUTF8StringEncoding]; 
}

Свойство dToken объявлено, как показано ниже:

NSString *dToken;

@property (nonatomic,retain) NSString *dToken;

Но когда я пытаюсь получить токен устройства из другого файла, я получаю нулевое значение.

+(NSString *) getDeviceToken
{
  NSString *deviceToken = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] dToken];

    NSLog(@" getDeviceToken = %@",deviceToken);  // This prints NULL

    return deviceToken; 

}

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

Ответы [ 3 ]

35 голосов
/ 29 сентября 2011

Я предлагаю вам преобразовать токен в строку следующим образом:

self.dToken = [[[deviceToken description]
                    stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] 
                    stringByReplacingOccurrencesOfString:@" " 
                    withString:@""];

ОБНОВЛЕНО: Как уже упоминалось, лучше использовать следующий подход для преобразования NSData * в NSString *:

@implementation NSData (Conversion)
- (NSString *)hexadecimalString
{
  const unsigned char *dataBuffer = (const unsigned char *)[self bytes];

  if (!dataBuffer) {
    return [NSString string];
  }

  NSUInteger          dataLength  = [self length];
  NSMutableString     *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];

  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02lx", (unsigned long)dataBuffer[i]];
  }

  return hexString;
}
@end
4 голосов
/ 08 июня 2012

Из обсуждения на Лучший способ сериализации NSData в шестнадцатеричную строку , вот лучший способ сделать это. Это больше, но ваш код будет ориентирован на будущее, если Apple изменит способ, которым NSData отправляет описания отладчика.

Расширить NSData следующим образом:

@implementation NSData (Hex)
- (NSString*)hexString {
    unichar* hexChars = (unichar*)malloc(sizeof(unichar) * (self.length*2));
    unsigned char* bytes = (unsigned char*)self.bytes;
    for (NSUInteger i = 0; i < self.length; i++) {
        unichar c = bytes[i] / 16;
        if (c < 10) c += '0';
        else c += 'A' - 10;
        hexChars[i*2] = c;
        c = bytes[i] % 16;
        if (c < 10) c += '0';
        else c += 'A' - 10;
        hexChars[i*2+1] = c;
    }
    NSString* retVal = [[NSString alloc] initWithCharactersNoCopy:hexChars
                                                           length:self.length*2 
                                                     freeWhenDone:YES];
    return [retVal autorelease];
}
@end
2 голосов
/ 21 марта 2014

Я знаю, что это старый вопрос и что это может быть новая информация, появившаяся с тех пор, но я просто хотел бы кое-что указать всем людям, которые утверждают, что использование метода описания являетсядействительно плохая идея.В большинстве случаев вы были бы совершенно правы.Свойство description обычно используется только для отладки, но для класса NSData оно определенно определено как возвращающее шестнадцатеричное представление содержимого получателей , которое именно здесь необходимо.Так как Apple поместила это в свою документацию, я думаю, что вы достаточно уверены в том, что они меняют ее.

Это можно найти в Справочнике классов NSData здесь: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html

...