11

私のiPhoneアプリでは、以下に示すように、Delegateファイル内のパブリックプロパティを割り当てている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; 

}

私は何が間違っているのですか?

4

3 に答える 3

35

この方法でトークンを文字列に変換することをお勧めします。

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
于 2011-09-29T17:27:58.333 に答える
4

NSDataを16進文字列にシリアル化するための最良の方法での議論から、これを行うためのより良い方法がここにあります。長くなりますが、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
于 2012-06-07T21:18:51.360 に答える
2

これは古い質問であり、それ以来出てきた新しい情報かもしれないことを私は知っていますが、説明方法を使用することは本当に悪い考えであると主張しているすべての人々に何かを指摘したいと思います。ほとんどの場合、あなたは正確に正しいでしょう。descriptionプロパティは通常、デバッグにのみ使用されますが、NSDataクラスの場合、レシーバーの内容の16進表現を返すものとして具体的に定義されています。これは、まさにここで必要なものです。Appleがそれを彼らのドキュメントに載せているので、彼らがそれを変更する限り、あなたはかなり安全だと思います。

これは、NSDataクラスリファレンスにあります:https ://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html

于 2014-03-20T20:03:39.830 に答える