プッシュ通知用のデバイストークンを取得する


84

私はプッシュ通知に取り組んでいます。デバイストークンをフェッチするために、次のコードを記述しました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    NSLog(@"Registering for push notifications...");    
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

    return YES;
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
    NSLog(@"This is device token%@", deviceToken);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    NSString *str = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(@"Error %@",err);    
}

デバイスでアプリケーションを正常に実行できますが、コンソールでデバイスIDを取得できません。

認定とプロビジョニングのプロファイルに問題はありません。


あなたは行いましたすべてのステップを?コードだけでなく、認証とプロビジョニングにも問題がない場合は、小さな間違いをしているに違いありません。教えてください、あなたはあなたのシステムに同じものを接続している実際のデバイスでアプリを実行していますか?また、コンソールログでデバイストークンを取得しているかどうかにも気づいていますか?iPhoneでプッシュ通知を有効にしましたか?
サラ

コンソールログでデバイストークンを取得できません。
jagzzz 2012年

私はエラーなしで実際のデバイスでアプリを実行しています。
jagzzz 2012年

iPhoneのリンクに示されているようにAPNSを有効にしましたか?
サラ

はい、APNSを有効にしましたが、デバイストークンをコソールでフェッチできません
jagzzz 2012年

回答:


162

注:以下のソリューションは iOS13以降のデバイスでは機能なくなりましたガベージデータが返されます

代わりに次のコードを使用してください。

+ (NSString *)hexadecimalStringFromData:(NSData *)data
{
  NSUInteger dataLength = data.length;
  if (dataLength == 0) {
    return nil;
  }

  const unsigned char *dataBuffer = (const unsigned char *)data.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02x", dataBuffer[i]];
  }
  return [hexString copy];
}

iOS 13より前に機能したソリューション:

Objective-C

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"this will return '32 bytes' in iOS 13+ rather than the token", token);
} 

Swift 3.0

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
    let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print("this will return '32 bytes' in iOS 13+ rather than the token \(tokenString)")
}

4
次に、プロビジョニングプロファイルを確認してください。これは、プッシュ通知用のssl証明書を作成したアプリIDである必要があります。
Wasif Saood 2012年

1
コードをAppDelegateファイル@jagzzzに追加する必要があります
codercat 2015

2
Swiftで記述されたコード例に興味のある方:gist.github.com/sawapi/a7cee65e4ad95578​​044d
ベンジャミン

3
慎重に、「説明」プロパティもはや作品使用:stackoverflow.com/questions/39495391/...を
hariseldon78

1
@codester Xcode 10.3を使用してビルドをアップロードしましたが、ライブです。あなたの声明によると、ObjectiveCメソッドはXCode11以降で壊れますが、データベースで確認できるのは、apnsトークンの正しい文字列ではなくデータ長を示していることです。だから私はそれを知りたいだけです、それはXcodeバージョンまたはiOSバージョン(すなわち13. *)に依存していますか?
pradipsutariya19年

13

トークンデバイスを取得するには、いくつかの手順で実行できます

1)開発者認定と配布認定の両方でAPNS(Appleプッシュ通知サービス)を有効にしてから、これら2つのファイルを再ダウンロードします。

2)DeveloperProvisioningファイルとDistributeProvisioningファイルの両方を再ダウンロードします。

3)Xcodeインターフェースの場合:2つのファイルプロビジョニングを使用したPROJECTおよびTARGETSのプロビジョニングの設定がダウンロードされます。

4)最後に、トークンデバイスを取得するには、AppDelegateファイルに以下のコードを追加する必要があります(注:実際のデバイスでアプリを実行します)。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
     [self.window addSubview:viewController.view];
     [self.window makeKeyAndVisible];

     NSLog(@"Registering for push notifications...");    
     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
 (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
     return YES;
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
     NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
     NSLog(@"%@", str);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
     NSString *str = [NSString stringWithFormat: @"Error: %@", err];
     NSLog(@"%@",str);
}

11

descriptionこれらの答えの多くを使用することは間違ったアプローチであると示唆してます-たとえそれを機能させたとしても、iOS13以降では壊れます。

代わりに、単に説明するのではなく、実際のバイナリデータを使用するようにしてください。AndreyGaganはObjectiveCソリューションに非常にうまく対処しましたが、幸いなことに、それは迅速にはるかに簡単です。

スウィフト4.2での作品のiOS 13+

// credit to NSHipster (see link above)
// format specifier produces a zero-padded, 2-digit hexadecimal representation
let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()

7

iOS13以降のObjectiveC、WasifSaoodの回答提供

以下のコードをコピーしてAppDelegate.mに貼り付け、デバイスのAPNトークンを印刷します。

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
  NSUInteger dataLength = deviceToken.length;
  if (dataLength == 0) {
    return;
  }
  const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02x", dataBuffer[i]];
  }
  NSLog(@"APN token:%@", hexString);
}

5

次のコードは、デバイストークンを取得するために使用されます。

    // Prepare the Device Token for Registration (remove spaces and < >)
    NSString *devToken = [[[[deviceToken description] 
                            stringByReplacingOccurrencesOfString:@"<"withString:@""] 
                           stringByReplacingOccurrencesOfString:@">" withString:@""] 
                          stringByReplacingOccurrencesOfString: @" " withString: @""];


    NSString *str = [NSString 
                     stringWithFormat:@"Device Token=%@",devToken];
    UIAlertView *alertCtr = [[[UIAlertView alloc] initWithTitle:@"Token is " message:devToken delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
    [alertCtr show];
    NSLog(@"device token - %@",str);

2
これは正しい解決策ではありませんでした。に基づいて何もしないでくださいdescription
rmaddy

5

そして、Wasifの答えのSwiftバージョン:

Swift 2.x

var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>"))
token = token.stringByReplacingOccurrencesOfString(" ", withString: "")
print("Token is \(token)")

Swift3のアップデート

let deviceTokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()

絶対に使用しないでくださいdescription(他の回答を参照してください)バイナリデータに
cdstamper

4

それでもデバイストークンを取得できない場合は、次のコードを入力して、プッシュ通知用にデバイスを登録してみてください。

ios8以降でも動作します。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000

    if ([UIApplication respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound
                                                                                 categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeAlert |
         UIRemoteNotificationTypeSound];

    }
#else
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     UIRemoteNotificationTypeBadge |
     UIRemoteNotificationTypeAlert |
     UIRemoteNotificationTypeSound];

#endif

3

iOS 13以降、Appleは[deviceToken description]出力を変更しました。{length=32,bytes=0x0b8823aec3460e1724e795cba45d22e8...af8c09f971d0dabc}これは、デバイストークンでは正しくないこのようなものです。

このコードスニペットを使用して問題を解決することをお勧めします。

+ (NSString *)stringFromDeviceToken:(NSData *)deviceToken {
    NSUInteger length = deviceToken.length;
    if (length == 0) {
        return nil;
    }
    const unsigned char *buffer = deviceToken.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(length * 2)];
    for (int i = 0; i < length; ++i) {
        [hexString appendFormat:@"%02x", buffer[i]];
    }
    return [hexString copy];
}

iOS13以下で動作します。


1
参考までに-これまでに使用しdescriptionた答えは常に間違っていました。そして、これはトークンを文字列に変換するための唯一の可能な解決策です。はるかに簡単な解決策はNSDataNSStringを使用する標準のbase64エンコーディングに変換することです。
rmaddy

1

Swift3でデバイストークンを取得する

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    print("Device token: \(deviceTokenString)")

}

1

AppDelegateで、次のdidRegisterForRemoteNotificationsWithDeviceToken方法で:

Swift用に更新:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })")
}

0

Swift 4 これは私にとってはうまくいきます:

ターゲットへのステップ1機能の追加をクリックし、プッシュ通知を選択します

AppDelegate.swiftのステップ2に、次のコードを追加します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (didAllow, error) in
            
        }
        UIApplication.shared.registerForRemoteNotifications()
        
        return true
    }
    
    //Get device token
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
    {
        let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
        
        print("The token: \(tokenString)")
    }

-1

ビルド設定セットコード署名プロビジョニングプロファイルで、APN有効化証明書がある場合は、確実にトークンIDを取得します。削除します

プロビジョニングプロファイル:自動

に設定します

プロビジョニングプロファイル:プロビジョニングプロファイル証明書。


-1
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let tokenParts = deviceToken.map { data -> String in
        return String(format: "%02.2hhx", data)
        }
    let token = tokenParts.joined()

    print("Token\(token)")
}

-4

デバイストークンを取得するには、次のコードを使用しますが、デバイストークンは物理デバイスを使用してのみ取得できます。デバイストークンの送信が必須の場合は、シミュレーターの使用中に以下の条件を設定できます。

  if(!(TARGET_IPHONE_SIMULATOR))
    {
        [infoDict setValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"DeviceToken"] forKey:@"device_id"];
    }
    else
    {
        [infoDict setValue:@"e79c2b66222a956ce04625b22e3cad3a63e91f34b1a21213a458fadb2b459385" forKey:@"device_id"];
    }



- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    NSLog(@"My token is: %@", deviceToken);
    NSString * deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""]   stringByReplacingOccurrencesOfString: @" " withString: @""];
    NSLog(@"the generated device token string is : %@",deviceTokenString);
    [[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:@"DeviceToken"];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.