-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
通話時間に関する誤った情報を削除しました]、アプリの起動時にユーザーにメッセージを表示しません。
いつでも尋ねることができます。許可のプロンプトが表示されなかった場合は、それは他の理由によるものです。 – dan
@danに同意すると、別の問題が発生する可能性があります。それ以外の場合は、いつでも尋ねることができます。 –
いつでもプッシュ通知に登録することができます。許可のプロンプトがすぐに表示されるはずです。プッシュ通知コードだけを使用してサンプルアプリケーションを作成し、それが機能しているかどうかを確認してください。 –