web-dev-qa-db-ja.com

didRegisterForRemoteNotificationsWithDeviceTokenはios8では呼び出されませんが、didRegister ... Settingsは

このスレッド に従いましたが、メソッドdidRegisterForRemoteNotificationsWithDeviceTokenはまだ呼び出されません:

ドキュメントは言う:

UIApplicationオブジェクトのregisterForRemoteNotificationsメソッドを呼び出した後、デバイスの登録が正常に完了すると、アプリはこのメソッドを呼び出します

didRegisterUserは適切に表示されますが、did register notif

AppDelegateのコードは次のとおりです(アプリのバージョンは8.1です)。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //register notif
    UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert |
                                                    UIUserNotificationTypeBadge |
                                                    UIUserNotificationTypeSound);
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
    [application registerUserNotificationSettings:settings];


    return YES;
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    //register to receive notifications
    [application registerForRemoteNotifications];
    NSLog(@"didRegisterUser");
}

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"error here : %@", error);//not called
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    /*
    // Store the deviceToken in the current installation and save it to Parse.
    PFInstallation *currentInstallation = [PFInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    currentInstallation.channels = @[ @"global" ];
    [currentInstallation saveInBackground];
     */
    NSLog(@"did register notif");//not called
}

また、バックグラウンドモード-> info.plistのリモート通知もあります。

22
Paul

あなたのコードは正しいようです。小さな改善として、didRegisterUserNotificationSettingsメソッドを次のように書くことができます。

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    if (notificationSettings.types != UIUserNotificationTypeNone) {
        NSLog(@"didRegisterUser");
        [application registerForRemoteNotifications];
    }
}

APN登録の失敗の原因となる構成の問題がある可能性があります。

  1. プロビジョニングプロファイルにaps-environmentエントリが含まれていることを確認してください

  2. プロビジョニングプロファイルに一意のアプリ識別子(「*」のない文字列)が設定されていることを確認してください。また、この正確な識別子をInfo.plistの「バンドル識別子」として使用する必要があります

  3. 初期インストール後にプッシュ機能を拒否した可能性があります。この場合、in-app-Push-alertは表示されず、設定アプリでプッシュを再度有効にする必要はありません。

  4. 別のデバイスを試してください。

17
Sven Driemecker

長い調査の後、Apple側でのエラーまたは更新により2016年7月19日であることがわかりました。インターネット接続、デバイス、使用されるメソッドなどのすべての条件が完璧です。

確認のためにこのリンクを参照してください https://forums.developer.Apple.com/thread/52224

確認するには、他のアプリもご覧ください。私は数時間を無駄にしましたが、それが誰かを助けることを願っています。ありがとう。

27
Kunal Gupta

2016年7月19日:-

Apple Developer form により、Sandbox APNSに関する問題があります... Apple側からの問題がある可能性があるため、application:didRegisterForRemoteNotificationsWithDeviceToken:application:didFailToRegisterForRemoteNotificationsWithError:などのデリゲートは呼び出されません。

APNS Sandboxの現在のステータスを確認するには このリンク ... APNS Sandboxが正常に機能し、正常に機能していることを確認してください... Appleから他のバグがあるかもしれません_側

したがって、メソッドが完璧で証明書が有効であるかどうか心配する必要はありません。これはApple側からの問題です。問題が解決するとすぐに、メソッドは完全に機能します(すべてがあなたの側から問題なければ)。

プロダクションは正常に機能していることに注意してください..問題はサンドボックスAPNSのみに関するものです。

24
EI Captain v2.0

この問題が発生し、最終的にApple開発者向けWebサイトでメモを見つけて、この問題を解決しました。

ユーザー通知の登録、スケジューリング、および処理

セクションのiOSに関する注意:「リモート通知の登録:

iOS注:セルラーまたはWi-Fi接続が利用できない場合、application:didRegisterForRemoteNotificationsWithDeviceToken:メソッドもapplication:didFailToRegisterForRemoteNotificationsWithError:メソッドも呼び出されません。 Wi-Fi接続の場合、これはデバイスがポート5223を介してAPNに接続できないときに発生することがあります。これが発生した場合、ユーザーはこのポートをブロックしていない別のWi-Fiネットワークに移動するか、iPhoneまたはiPadで待機できますセルラーデータサービスが利用可能になるまで。どちらの場合でも、デバイスは接続を確立でき、委任メソッドの1つが呼び出されます。

私のiPhoneはWifiのみで接続し、iPhoneを再起動してWiFi APに再接続すると、この問題は解決しました。

13
Homer Wang

XCode 8.3.1以降

上記のすべてのオプションを試した後、デリゲートメソッドがまだ呼び出されない場合は、プロジェクトで確認してください。

under 'Capabilities', (next to General), 
 - Push Notifications option is turned ON`
- and under Background Modes, Remote Notifications is turned ON
7
Naishta

私に恥!最も基本的なステップを忘れました:

enter image description here

すべての証明書を処理した後、ここからスタッフの指示を処理します。 https://www.pluralsight.com/guides/Swift/creating-ios-rich-Push-notifications

プッシュ通知を送信するためのツールは次のとおりです。 https://github.com/noodlewerk/NWPusher

フォースがあなたと共にいるように!

私の場合、iOS 9.3以降だと思います。 Localyticsを使用した場合、didRegisterForRemoteNotificationsWithDeviceTokenは呼び出されません。これをコードから削除する必要があります(ApplicationDidFinishLaunchingWithOption)[Localytics autoIntegrate:@ "xxxxx" launchOptions:launchOptions];

2
Kong Hantrakool

わかりました、皆さん、私はこのことを11時間連続でデバッグしているので、うまくいけば、この答えが誰かに役立つことを願っています。

同様のスレッドでEVERYTHINGが正しく設定され、Google Firebaseアナリティクスが統合されていて、didRegisterForRemoteNotificationsWithDeviceTokenメソッドがまだ呼び出されていない場合、これはデフォルトでGoogle Firebaseでスウィズルされるためである可能性があります。何らかの奇妙な理由により、FIRはトークンをGoogleに送信した後、元のメソッドに戻りません。修正するには

    FirebaseAppDelegateProxyEnabled to NO (BOOL)

info.plistで。

2

私の場合、Charlesを介してすべてのデバイストラフィックをプロキシしていたため、これが発生していました。これを削除すると修正され、didRegisterコールバックが提供されました。

2
rounak

私にとっては、シミュレータでアプリを実行していました。プッシュトークンはシミュレータ用に生成されないため、didFailToRegisterForRemoteNotificationsWithErrorの代わりにdidRegisterForRemoteNotificationsWithDeviceTokenを入力していました

1
Luda

以下のコードを追加してください、それは私のために働いています、

 #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

以下のメソッドでデバイストークンを取得します。

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

詳細については、 詳細回答 を参照してください。

これが誰かの助けになることを願っています。

0
Jaywant Khedkar