アプリの起動サイクル中に `registerUserNotificationSettings:`を呼び出す必要がありますか?

理論

状態ドキュメントregisterUserNotificationSettings:

アプリがアラートを表示したり、サウンドを再生したり、アイコンにバッジを付けたりする場合は、起動サイクル中にこのメソッドを呼び出して、これらの方法でユーザーにアラートを送信する権限をリクエストする必要があります。

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

これは本当に必要ですか?呼び出しをregisterUserNotificationSettings:アプリのより関連性の高い部分に入れようとしましたが、アプリはプッシュ通知を送信する許可を求めませんでした。これはiOSプッシュ通知の単なるポリシーですか、それともプッシュ通知を送信する許可をいつ要求するかについてより柔軟性を持たせる方法はありますか?

理論

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

ここには2つの問題がありました。1つは私のもので、もう1つはプッシュ通知に使用していたサードパーティのサービスからのものです。私の問題は、-registerForNotifications戻った後に呼び出されViewControllerを却下していたことでした。非同期で実行されていることに気づきませんでした。そこで-application:didRegisterUserNotificationSettings、アプリのデリゲートに追加ました。このメソッドは、ユーザーがによって提示されたプロンプトに応答すると呼び出され-registerForNotifications、通知を投稿します。を呼び出す前に-registerForNotifications、その通知のリスナーを設定し、通知を受信した後でのみViewControllerを閉じます。代わりに指定するデリゲートまたはブロックがあったらいいのにと思いますが、ありません。

そして私は、iOSがあるためそこではない理由があることを疑う本当に呼び出すことを望ん-registerForNotificationsapplication: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]

編集
0

コメントを追加

0

関連記事

分類Dev

定期的にsvnadminpackを呼び出す必要がありますか

分類Dev

SaveChangesを1回呼び出すか、変更するたびに呼び出す必要がありますか?

分類Dev

ループの後に `yield break`を呼び出す必要がありますか?

分類Dev

setInterval()を呼び出す前にclearInterval()を呼び出す必要があります

分類Dev

getGraph()を呼び出す前に、setGraph()を呼び出す必要があります

分類Dev

SQLExecdirectを呼び出す前に、SQLAllocHandleを呼び出してSQLHSTMTを割り当てる必要がありますか?

分類Dev

* sql.Tx.Rollback()を呼び出す前に* sql.Rows.Close()を呼び出す必要がありますか?

分類Dev

使用する前にMessageDigest.reset()を呼び出す必要がありますか?

分類Dev

別のAppServiceからAppServiceを呼び出す必要がありますか?

分類Dev

SensorManagerクラスでunregisterListernerを明示的に呼び出す必要がありますか?

分類Dev

__init __()は親クラスの__init __()を呼び出す必要がありますか?

分類Dev

urllib.urlopen()の後にclose()を呼び出す必要がありますか?

分類Dev

async await Promiseの解決には.then()を呼び出す必要がありますか?

分類Dev

ObjectOutputSreamでclose()の前にreset()を呼び出す必要がありますか?

分類Dev

Angular1.4で$ digestを手動で呼び出す必要がありますか?

分類Dev

OCで「CGPathRelease」を手動で呼び出す必要がありますか?

分類Dev

常にURL.revokeObjectURL()を明示的に呼び出す必要がありますか?

分類Dev

.NET-イベントを直接呼び出す必要がありますか?

分類Dev

いつcmd.Process.Release()を明示的に呼び出す必要がありますか?

分類Dev

GC.Collect()を定期的に呼び出す必要がありますか?

分類Dev

onViewRecycledに対してsuperを呼び出す必要がありますか?

分類Dev

Pythonでsuper().__ init __()を明示的に呼び出す必要がありますか?

分類Dev

session_startを常に呼び出す必要がありますか?

分類Dev

実際にFileStream.Close / Disposeを呼び出す必要がありますか?

分類Dev

この場合、どこで削除を呼び出す必要がありますか?

分類Dev

ReactGA.initializeを最初に呼び出す必要があります

分類Dev

Prism:RaiseCanExecuteChanged()を明示的に呼び出す必要があります

分類Dev

トークンが必要になるたびにacquireTokenSilentを呼び出す必要がありますか?

分類Dev

onDestroy()イベント時に、ライフサイクルでremoveObserverを呼び出す必要がありますか?

Related 関連記事

  1. 1

    定期的にsvnadminpackを呼び出す必要がありますか

  2. 2

    SaveChangesを1回呼び出すか、変更するたびに呼び出す必要がありますか?

  3. 3

    ループの後に `yield break`を呼び出す必要がありますか?

  4. 4

    setInterval()を呼び出す前にclearInterval()を呼び出す必要があります

  5. 5

    getGraph()を呼び出す前に、setGraph()を呼び出す必要があります

  6. 6

    SQLExecdirectを呼び出す前に、SQLAllocHandleを呼び出してSQLHSTMTを割り当てる必要がありますか?

  7. 7

    * sql.Tx.Rollback()を呼び出す前に* sql.Rows.Close()を呼び出す必要がありますか?

  8. 8

    使用する前にMessageDigest.reset()を呼び出す必要がありますか?

  9. 9

    別のAppServiceからAppServiceを呼び出す必要がありますか?

  10. 10

    SensorManagerクラスでunregisterListernerを明示的に呼び出す必要がありますか?

  11. 11

    __init __()は親クラスの__init __()を呼び出す必要がありますか?

  12. 12

    urllib.urlopen()の後にclose()を呼び出す必要がありますか?

  13. 13

    async await Promiseの解決には.then()を呼び出す必要がありますか?

  14. 14

    ObjectOutputSreamでclose()の前にreset()を呼び出す必要がありますか?

  15. 15

    Angular1.4で$ digestを手動で呼び出す必要がありますか?

  16. 16

    OCで「CGPathRelease」を手動で呼び出す必要がありますか?

  17. 17

    常にURL.revokeObjectURL()を明示的に呼び出す必要がありますか?

  18. 18

    .NET-イベントを直接呼び出す必要がありますか?

  19. 19

    いつcmd.Process.Release()を明示的に呼び出す必要がありますか?

  20. 20

    GC.Collect()を定期的に呼び出す必要がありますか?

  21. 21

    onViewRecycledに対してsuperを呼び出す必要がありますか?

  22. 22

    Pythonでsuper().__ init __()を明示的に呼び出す必要がありますか?

  23. 23

    session_startを常に呼び出す必要がありますか?

  24. 24

    実際にFileStream.Close / Disposeを呼び出す必要がありますか?

  25. 25

    この場合、どこで削除を呼び出す必要がありますか?

  26. 26

    ReactGA.initializeを最初に呼び出す必要があります

  27. 27

    Prism:RaiseCanExecuteChanged()を明示的に呼び出す必要があります

  28. 28

    トークンが必要になるたびにacquireTokenSilentを呼び出す必要がありますか?

  29. 29

    onDestroy()イベント時に、ライフサイクルでremoveObserverを呼び出す必要がありますか?

ホットタグ

アーカイブ