web-dev-qa-db-ja.com

registerForRemoteNotificationsメソッドが正しく呼び出されていません

現在、Xcode6ベータ版(最初のバージョン)を使用しています。 parse.comを使用して、プッシュ通知を実装しようとしています。私のアプリデリゲートでは、

  [application registerForRemoteNotifications];

IOS 8ベータ版のiPhoneで実行すると、アプリはプッシュ通知を有効にするかどうかを尋ねません。対応するapplication:didRegisterForRemoteNotificationsWithDeviceToken:が呼び出されることはありません。ただし、ios7 iPhoneで実行しようとすると、アプリがクラッシュし、unrecognized selectorregisterForRemoteNotificationsメソッドのエラー。

次に、以前のバージョンのXcode(バージョン5.0)で実行しようとしましたが、コンパイルエラーno visible @interface declares registerForRemoteNotifications

このエラーはiOS 8への移行に伴うバグに関係していると思いますが、この問題をどのように解決できるかわかりません。

15
Mahir

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

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

最初:

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

このようなコードを追加

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

第二:

この機能を追加

#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
29
Madao

いくつかの観察:

  • 質問はローカルではなくリモートを使用していました
  • いくつかの質問はローカルに関係しています
  • 回答時間が非常に長くなる可能性があることに同意しますが、他の人が指摘したように、コールバック(別名デリゲートメソッド)を実装する必要があります
  • コンパイラフラグに対してテストしない、概念的および実際的に間違っている
  • このコードのようにセレクターの存在をテストします。

    func registerForPushForiOS7AndAbove(){
    
    UIApplication.sharedApplication()
    let application = UIApplication.sharedApplication()
    if application.respondsToSelector(Selector("registerUserNotificationSettings:")) {
    
        let notifSettings = UIUserNotificationSettings(forTypes: .Sound | .Alert | .Badge,
            categories: nil)
    
        application.registerUserNotificationSettings(notifSettings)
        application.registerForRemoteNotifications()
    
    }
    else{
        application.registerForRemoteNotificationTypes( .Sound | .Alert | .Badge )
    }
    

    }

(PListのUIBackgroundModesをお見逃しなく。機能で実行できます)

5
ingconti

次のコードスニペットを使用して、iOS 8の通知に登録するだけです。

UIUserNotificationSettings *settings = 
    [UIUserNotificationSettings 
        settingsForTypes: (UIUserNotificationTypeBadge | 
                           UIUserNotificationTypeSound |                 
                           UIUserNotificationTypeAlert) 
        categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:settings];

UIUserNotificationTypeの代わりにUIRemoteNotificationTypeを使用してください!

2
Kai Burghardt

IOS 8では、システムはユーザーにアプリがプッシュ(リモート)通知を送信することを許可するよう要求しません。これはデフォルトで許可されています。

ユーザーは[設定]> [アプリ]> [通知]> [通知を許可]でアプリからの通知の許可をオプトアウトできます。

2
Lucien

registerForRemoteNotificationsメソッドはiOS8から利用可能です。

application:didRegisterForRemoteNotificationsWithDeviceToken:デリゲートメソッドは、登録が成功した場合にのみ呼び出されます。失敗が発生した場合、application:didFailToRegisterForRemoteNotificationsWithError: 方法。

詳細については、以下を参照してください。 IApplication Class reference

また、アプリの通知が有効になっていることを確認しますSettings -> Notifications -> YourApp -> Enable_Notifications

ドキュメントによると、デバイスがプッシュサーバーとの永続的な接続を持つまで、コールバックは発生しません。したがって、利用可能なWi-Fiまたはデータ接続がない場合、コールバックは発生しません-およびAppleはこれをエラー状態と見なしません。didFailを引き起こす可能性のあるエラーのみ。 。コールバックは、証明書/アプリの許可が正しくない問題(開発の問題)であるか、ユーザーが許可を拒否しました。

プッシュ通知プログラミングガイド を実行してください

1
Yatheesha B L