web-dev-qa-db-ja.com

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

アプリにプッシュ通知を実装するには、デバイストークンが必要です。
iOS 8ではdidRegisterForRemoteNotificationsWithDeviceTokenメソッドが機能しないため、デバイストークンを取得するにはどうすればよいですか。アプリデリゲートでこのコードを試しましたが、デバイストークンを取得できません。

    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
18
Pankaj

UIApplication.hのコードを読みます。

あなたはそれを行う方法を知っているでしょう。

最初:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

このようなコードを追加

#ifdef __IPHONE_8_0
  //Right, that is the point
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
    //register to receive notifications
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif

Xcode 5とXcode 6の両方を使用しない場合、このコードを試してください

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
  UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
      |UIRemoteNotificationTypeSound
      |UIRemoteNotificationTypeAlert) categories:nil];
  [application registerUserNotificationSettings:settings];
} else {
  UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
  [application registerForRemoteNotificationTypes:myTypes];
}

(@ zeiteisen @dmurのリマインドをありがとう)


第二:

この機能を追加

#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    //register to receive notifications
    [application registerForRemoteNotifications];
}

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
    //handle the actions
    if ([identifier isEqualToString:@"declineAction"]){
    }
    else if ([identifier isEqualToString:@"answerAction"]){
    }
}
#endif

そして、あなたはdeviceTokenを

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

それでも動作しない場合は、この関数を使用し、NSLog error

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
56
Madao

古いiOSバージョンでクラッシュした場合に備えて、@ Madaoの応答に小さな検証を追加します。

#ifdef __IPHONE_8_0
if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
#endif

UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound |     UIRemoteNotificationTypeNewsstandContentAvailability;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];

__IPHONE_8_0マクロは、古いバージョンのxCode/iOSでコンパイルできるようにするだけで、コンパイルエラーや警告は表示されませんが、iOS 7以前のデバイスでコードを実行するとクラッシュします。

11

IOS8でデバイストークンを取得するには+

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//This code will work in iOS 8.0 xcode 6.0 or later
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability| UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
return YES;
}

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString* deviceToken = [[[[deviceToken description]
                         stringByReplacingOccurrencesOfString: @"<" withString: @""]
                         stringByReplacingOccurrencesOfString: @">" withString: @""]
                         stringByReplacingOccurrencesOfString: @" " withString: @""] ;
NSLog(@"Device_Token     -----> %@\n",deviceToken);
}
3
ChenSmile

この質問に対する他の見劣りする答えは別として、必要なすべてのデリゲートメソッドを実装した情報に基づいた開発者にこの問題が発生する可能性が最も高い理由は、ワイルドカードプロビジョニングプロファイルを使用していることです(なぜそうしないのですか?開発アプリの作成とテストがとても簡単になります!)

この場合、おそらくError Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application"エラーが表示されます

通知をテストするには、実際には2000年以降に戻ってdeveloper.Apple.comにログインし、プッシュ通知を有効にしてアプリケーション固有のプロビジョニングプロファイルを設定する必要があります。

  1. アプリのバンドル識別子に対応するアプリIDを作成します。 [プッシュ通知](現在、下から2番目のオプション)をオフにしてください。
  2. そのApp IDのプロビジョニングプロファイルを作成します。
  3. 残りの恐ろしいプロビジョニング手順をすべて実行してください。
  4. 利益!
0
dave

@madoaの答えは絶対に正しいです。 シミュレータでは機能していませんに注意してください。

この場合

-(void)application:(UIApplication *)application
     didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

エラーREMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERRORで呼び出されます

0
CedricSoubrie

開発者アカウントで、アプリIDにプッシュ通知が正しく設定されていることを確認してから、プロビジョニングプロファイルを再生成してダウンロードする必要があります。私の問題は、プロビジョニングプロファイルをダウンロードしたが、xcodeが間違ったプロファイルを実行していたことです。これを修正するには、ターゲットビルド設定に移動し、コード署名までスクロールして、プロビジョニングプロファイルセクションの下で、生成したものの名前と一致する正しいプロビジョニングプロファイルを使用していることを確認します(オプションがある場合は、ドロップダウンがあります複数インストールされています)。

0
Trianna Brannon

これが解決策です。

applicationDidFinishLaunchingWithOptionsで:

{

 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
}


- (void)application:(UIApplication*)application didRegisterUserNotificationSettings:(nonnull UIUserNotificationSettings *)notificationSettings
{
    [application registerForRemoteNotifications];
}


- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error
{
    NSLog(@" Error while registering for remote notifications: %@", error);
}

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken
{
  NSLog(@"Device Token is : %@", deviceToken);
}
0
YSR fan