2016-07-18 4 views
2

docs for registerUserNotificationSettings:状態:アプリのディスプレイアラートは、サウンドを再生、またはそのアイコンバッジ場合必須 'registerUserNotificationSettings:'アプリの起動サイクル中に呼び出されますか?

、あなたは、次の方法でユーザーに警告するための許可を要求するために、あなたの打ち上げ時に、このメソッドを呼び出す必要があります。

私は、これが必要である前にプッシュ通知を送信する許可を求めるのは無礼なので、これを読んで失望しました。私が設計しているアプリでは、プッシュ通知を送信する理由がなくなる前に、ユーザーがオンラインサービスでアカウントを作成する必要があります。ユーザーがサインアップすることはなく、ローカルでアプリを使用するだけなので、質問する理由は一切ありません。しかし、アプリの起動だけを聞くことができれば、ユーザーはアカウントを作成してアプリを終了してから、アプリを起動してから起動する必要があります。奇妙に思える。

これは本当に必要ですか?私はregisterUserNotificationSettings:への呼び出しをアプリの関連性の高い部分に入れようとしましたが、プッシュ通知を送信するための許可を求めるプロンプトは表示されませんでした。これはiOSプッシュ通知のポリシーですか、プッシュ通知を送信する権限をいつ尋ねるかについてもっと柔軟に対応できる方法はありますか?

+1

いつでも尋ねることができます。許可のプロンプトが表示されなかった場合は、それは他の理由によるものです。 – dan

+0

@danに同意すると、別の問題が発生する可能性があります。それ以外の場合は、いつでも尋ねることができます。 –

+0

いつでもプッシュ通知に登録することができます。許可のプロンプトがすぐに表示されるはずです。プッシュ通知コードだけを使用してサンプルアプリケーションを作成し、それが機能しているかどうかを確認してください。 –

答えて

2

-registerForNotificationsへの最初の呼び出しは、アプリの起動サイクル中に呼び出す必要はありません。ただし、最初の呼び出しの後、常にアプリケーションの起動サイクル中に呼び出される必要があります。

プッシュ通知に使用していた1つの鉱山と1つのサードパーティサービスの問題が2つありました。私の問題は、返された後に-registerForNotificationsと呼ばれるView Controllerを解除していたことです。私はそれが非同期的に走ったことを知らなかった。だから私は-application:didRegisterUserNotificationSettingsを私のアプリケーションデリゲートに追加しました。このメソッドは、ユーザが-registerForNotificationsで示されたプロンプトに応答した後に呼び出され、通知を送信します。 -registerForNotificationsを呼び出す前に、その通知のリスナーを設定し、通知を受け取った後でのみView Controllerを終了します。デリゲートやブロックを指定したいと思っていましたが、そうではありません。

そして私は、iOS 本当にはあなたがapplication:didFinishLaunchingWithOptions:-registerForNotificationsを呼び出すために望んでいるので、非同期コールバックがちょうどアプリデリゲート内の別の方法であるために、それは自然なことですので、理由はありませんと思われます。 [実際にプッシュ通知を取得するためにアプリを再起動する必要があることについてのビットを削除しました。追加:]もう1つの問題は、プッシュ通知にまだ使用していたサードパーティのサービス(まだアルファベットになっている)がプッシュ通知を送信していないことでした。それが修正されたら、プロンプトがアプリの起動中であったかどうかに関わらず、プッシュ通知を承認したらすぐに作業を開始しました。アプリデリゲートの-application:didRegisterUserNotificationSettings:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    if NSUserDefaults.standardUserDefaults().boolForKey("registedNotificationSettings") { 
     self.registerForNotifications() 
    } 
    return true 
} 
    • アプリデリゲートのapplication:didFinishLaunchingWithOptions:メソッド呼び出し-registerForNotificationsで、ユーザーのデフォルトが設定されている場合:[/追加されました]

      だからここに完全なパターンですリモート通知を設定し、ユーザのデフォルト値を保存し、通知を投稿する:

      私のビューコントローラで
    • 、ボタンの押しで、その通知をリッスンし、プッシュ通知を送信するための許可を要求:

      @IBAction func okayButtonTapped(sender: AnyObject) { 
          NSNotificationCenter.defaultCenter().addObserver(
           self, 
           selector: #selector(didRegisterNotificationSettings(_:)), 
           name: "RegistedNotificationSettings", 
           object: nil 
          ) 
          let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
          appDelegate.registerForNotifications() 
      } 
      
    • そして、もちろん、我々は解任通知方法を、必要がありますビューコントローラ許可が付与されて、それがなかった場合に何かを行う必要があるされている場合:この構成で

      func didRegisterNotificationSettings(notification: NSNotification) { 
          let status = notification.object as! UIUserNotificationSettings 
          if status.types != .None { 
           // Yay! 
           self.done() 
           return 
          } 
      
          // Tell them a little more about it. 
          NSLog("User declined push notifications") 
          self.done() 
      } 
      

    、それをすべてWOR ks [-registerForNotifications通話時間に関する誤った情報を削除しました]、アプリの起動時にユーザーにメッセージを表示しません。

  • 関連する問題