状態のドキュメントregisterUserNotificationSettings:
:
アプリがアラートを表示したり、サウンドを再生したり、アイコンにバッジを付けたりする場合は、起動サイクル中にこのメソッドを呼び出して、これらの方法でユーザーにアラートを送信する権限をリクエストする必要があります。
アプリが必要になる前にプッシュ通知を送信する許可を求めるのは失礼だと思われるので、これを読んでがっかりしました。たとえば、私が設計しているアプリでは、プッシュ通知を送信する理由がある前に、ユーザーはオンラインサービスでアカウントを作成する必要があります。また、ユーザーがサインアップせず、ローカルでアプリを使用するだけなので、質問する理由はありません。ただし、アプリの起動時にのみ確認できる場合は、ユーザーがアカウントを作成し、アプリを終了してから、確認する前に再度起動する必要があることを意味します。奇妙に思えます。
これは本当に必要ですか?呼び出しをregisterUserNotificationSettings:
アプリのより関連性の高い部分に入れようとしましたが、アプリはプッシュ通知を送信する許可を求めませんでした。これはiOSプッシュ通知の単なるポリシーですか、それともプッシュ通知を送信する許可をいつ要求するかについてより柔軟性を持たせる方法はありますか?
への最初の呼び出し-registerForNotifications
は、アプリの起動サイクル中に呼び出す必要はありません。ただし、最初の呼び出しの後は、アプリの起動サイクル中に常に呼び出す必要があります。
ここには2つの問題がありました。1つは私のもので、もう1つはプッシュ通知に使用していたサードパーティのサービスからのものです。私の問題は、-registerForNotifications
戻った後に呼び出されたViewControllerを却下していたことでした。非同期で実行されていることに気づきませんでした。そこで-application:didRegisterUserNotificationSettings
、アプリのデリゲートに追加しました。このメソッドは、ユーザーがによって提示されたプロンプトに応答すると呼び出され-registerForNotifications
、通知を投稿します。を呼び出す前に-registerForNotifications
、その通知のリスナーを設定し、通知を受信した後でのみViewControllerを閉じます。代わりに指定するデリゲートまたはブロックがあったらいいのにと思いますが、ありません。
そして私は、iOSがあるためそこではない理由があることを疑う本当に呼び出すことを望ん-registerForNotifications
でapplication:didFinishLaunchingWithOptions:
、それだけのアプリデリゲート内の別の方法であることへの非同期コールバックのための自然ですので、。[実際にプッシュ通知を受け取るためにアプリを再起動する必要があることについてのビットを削除しました。追加:]もう1つの問題は、プッシュ通知に使用していたサードパーティのサービスがまだアルファ版であり、プッシュ通知を送信しないことが多かったことです。それが修正されると、アプリの起動中かそれ以降かに関わらず、プッシュ通知を承認するとすぐに機能し始めました。[/追加]
完全なパターンは次のとおりです。
ユーザーのデフォルトが設定されている場合のアプリデリゲートのapplication:didFinishLaunchingWithOptions:
メソッド呼び出し-registerForNotifications
:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if NSUserDefaults.standardUserDefaults().boolForKey("registedNotificationSettings") {
self.registerForNotifications()
}
return true
}
アプリデリゲートの-application:didRegisterUserNotificationSettings:
方法で、リモート通知を構成し、ユーザーのデフォルト値を保存して、通知を投稿します。
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
if notificationSettings.types != .None {
application.registerForRemoteNotifications()
}
let defaults = NSUserDefaults.standardUserDefaults()
if !defaults.boolForKey( "registedNotificationSettings") {
defaults.setBool(true, forKey: "registedNotificationSettings")
defaults.synchronize()
}
NSNotificationCenter.defaultCenter().postNotification(
NSNotification(name: "RegistedNotificationSettings", object: notificationSettings)
)
}
私のViewControllerで、ボタンを押すと、その通知を聞いてから、プッシュ通知を送信する許可を要求します。
@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()
}
次に、もちろん、通知メソッドが必要になります。このメソッドは、アクセス許可が付与されたときにView Controllerを閉じ、そうでない場合は別のことを行う必要があります。
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()
}
この構成では、すべてが機能し[-registerForNotifications
通話時間に関する誤った情報を削除]、アプリの起動時にユーザーにプロンプトを表示しません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加