Сохранение DeviceToken для последующего использования в службах Apple Push Notification Services

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

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

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

NSString *dToken;

@property (nonatomic,retain) NSString *dToken;

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

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

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

    return deviceToken; 

}

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

3 ответов


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

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

обновление: Как многие упоминали, лучше использовать следующий подход для преобразования NSData * to 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

из обсуждения на лучший способ сериализации формат NSData в hexadeximal строку, вот лучший способ, чтобы сделать это. Дольше, но ваш код будет защищен от будущего, если 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

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

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