これはAppleドキュメントからのものです。
このメッセージを送信すると、デバイスはApplePushServiceへの登録プロセスを開始します。成功すると、アプリケーションデリゲートはapplication:didRegisterForRemoteNotificationsWithDeviceToken:メソッドでデバイストークンを受け取ります。登録が成功しなかった場合、デリゲートはapplication:didFailToRegisterForRemoteNotificationsWithError:メソッドを介して通知されます。アプリケーションデリゲートがデバイストークンを受信した場合、そのプロバイダーに接続してトークンを渡す必要があります。
と
プッシュ対応アプリがプッシュ通知に初めて登録するとき、iOSはユーザーにそのアプリの通知を受信するかどうかを尋ねます。ユーザーがこのアラートに応答すると、デバイスが復元されるか、アプリが少なくとも1日アンインストールされない限り、アラートは再度表示されません。
あなたが観察していることは正常だと思います。application:didRegisterForRemoteNotificationsWithDeviceToken
ユーザーが許可を与えた場合にのみ呼び出されるという言及はありません。NSUserDefaultsでデバイストークンをキャッシュし、このメソッドで新しいトークンがキャッシュされたトークンと等しくないかどうかを確認することで、最適化できると思います。