プッシュ通知付きのアプリを開発しています。ユーザーインタラクションのすべての可能な方法を確認するために、ユーザーが最初の起動時にアプリのプッシュ通知を有効にすることを拒否したときにアプリをテストしたいと思います。
ただし、ダイアログ(によって開始されるregisterForRemoteNotificationTypes
)は、アプリごとに1回だけ表示されます。アプリのiPhoneOSのメモリをリセットするにはどうすればよいですか。アプリを削除して再インストールしても効果はありません。
プッシュ通知付きのアプリを開発しています。ユーザーインタラクションのすべての可能な方法を確認するために、ユーザーが最初の起動時にアプリのプッシュ通知を有効にすることを拒否したときにアプリをテストしたいと思います。
ただし、ダイアログ(によって開始されるregisterForRemoteNotificationTypes
)は、アプリごとに1回だけ表示されます。アプリのiPhoneOSのメモリをリセットするにはどうすればよいですか。アプリを削除して再インストールしても効果はありません。
テクニカルノートTN2265:プッシュ通知のトラブルシューティング
プッシュ対応アプリがプッシュ通知に初めて登録するとき、iOSはユーザーにそのアプリの通知を受信するかどうかを尋ねます。ユーザーがこのアラートに応答すると、デバイスが復元されるか、アプリが少なくとも1日アンインストールされない限り、アラートは再度表示されません。
アプリの初回実行をシミュレートする場合は、アプリを1日アンインストールしたままにしておくことができます。後者は、システムクロックを1日以上進め、デバイスを完全にオフにしてから、デバイスをオンに戻すことで、実際に1日待つことなく実現できます。
更新:以下のコメントに記載されているように、このソリューションはiOS5.1以降機能しなくなりました。アップルにバグを報告して、ドキュメントを更新できるようにすることをお勧めします。現在の解決策は、デバイスのコンテンツと設定をリセットしているようです。
更新:テクニカルノートが更新され、iOS7以降で正しく機能する新しい手順が追加されました。
- デバイスからアプリを削除します。
- デバイスの電源を完全にオフにしてから、再びオンにします。
- [設定]>[一般]>[日付と時刻]に移動し、1日以上前の日付を設定します。
- デバイスの電源を完全にオフにしてから、再びオンにします。
iOS9以降の更新
アプリを削除して再インストールするだけで、通知ステータスがにリセットされますnotDetermined
(プロンプトが表示されます)。
以下のGomfuciusによる回答に感謝します: https ://stackoverflow.com/a/33247900/704803
これに対するソリューションをテストするためのもう1つの方法は、バンドルIDを変更するだけです。完了したら、元に戻すことを忘れないでください。
iOS 9.0.2では、アプリを削除して再インストールするたびに「プッシュ通知の登録アラート」が表示されます。これは、AppStoreの本番ダウンロードとアドホックモードの両方に当てはまります。
更新:これがiOS9.xで機能していることが確認されました
すでに述べたように、デバイス上のアプリの通知状態をリセットするためのアプローチは、新しいiOS5では変更されています。
これはiOS6で私のために働きます:
ただし、これにより最初のプロンプトが再び表示されるだけで、他のプッシュ状態に関連するものは削除されません。
plist:/private/var/mobile/Library/RemoteNotification/Clients.plist
...プッシュ通知用に登録されたクライアントが含まれています。アプリのエントリを削除すると、プロンプトが再表示されます
プログラムでそれを行うことは、私にとって毎回うまくいくようです。次の行がコメントされていないビルドがあります。
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
PNから登録を解除するたびに実行します。最近のリストからアプリを明示的に終了し、設定アプリの通知センターを試して正しく設定する必要がある場合があります。
また、ユーザーにPNへの登録を求めるUIプロンプトが表示されない場合があります。最近のiOSバージョンのいずれかで無効になっているのかどうかわからない。
ianolitoが言ったように、日付の設定はうまくいくはずです:
後者は、システムクロックを1日以上進め、デバイスを完全にオフにしてから、デバイスをオンに戻すことで、実際に1日待つことなく実現できます。
私のデバイス(iPhone 4、iOS 6.1.2)で、システムクロックを1日先に設定したり、数日でも機能しなかったりすることに気づきました。そのため、日付を1か月先に設定すると、それが機能し、アプリケーションで通知プロンプトが再度表示されました。
これが誰にとっても役立つことを願っています、それは一種の頭が痛む可能性があります!
micmdkに同意します。プッシュ通知を使用して開発環境をセットアップし、電話をリセットして初期インストールのように見せるための方法が必要でした…そしてこれらの正確な手順だけでうまくいきました…デバイスを2回再起動する必要があります。
APPLE TECH DOCから:
iOSでのプッシュ通知アクセス許可アラートのリセットプッシュ対応アプリがプッシュ通知に初めて登録するとき、iOSはユーザーにそのアプリの通知を受信するかどうかを尋ねます。ユーザーがこのアラートに応答すると、デバイスが復元されるか、アプリが少なくとも1日アンインストールされない限り、アラートは再度表示されません。
アプリの初回実行をシミュレートする場合は、アプリを1日アンインストールしたままにしておくことができます。次の手順に従うことで、実際に1日待つことなく後者を実現できます。
デバイスからアプリを削除します。
デバイスの電源を完全にオフにしてから、再びオンにします。
[設定]>[一般]>[日付と時刻]に移動し、1日以上前の日付を設定します。
デバイスの電源を完全にオフにしてから、再びオンにします。
私は過去にこれについて疑問に思い、それは実際には私のコードの有効なテストケースではないという結論に達しました。あなたのアプリケーションコードは、誰かが最初に通知を拒否するか、後でiPhoneの通知設定から通知を無効にするかを実際に区別できるとは思いません。ユーザーエクスペリエンスが異なることは事実ですが、それはregisterForRemoteNotificationTypesの呼び出しの中に隠されています。
unregisterForRemoteNotificationsを呼び出しても、通知設定からアプリケーションが完全に削除されるわけではありませんが、そのアプリケーションの設定の内容は削除されます。したがって、これでも、次回アプリを実行したときにダイアログがユーザーに2回表示されることはありません(少なくとも、現在テストしているv3.1.3では表示されません)。しかし、私が上で言ったように、あなたはおそらくそれについて心配するべきではありません。
承認された回答( TN2265-プッシュ通知のトラブルシューティング)で参照されているのと同じテクニカルノートが、iOS5以降のソリューションで更新されました。
つまり、バックアップを作成し、毎回そこから復元します。
iOS 5以降では、バックアップからデバイスを復元して、プッシュ通知のアクセス許可アラートをリセットします(r.11450187)。これを効率的に行うための手順は次のとおりです。
- Xcode Organizerを使用して、デバイスにアプリをインストールします。重要なのは、アプリを実行せずに初めてインストールすることです。
- iTunesを使用してデバイスをバックアップします。
- アプリを実行します。プッシュ通知のアクセス許可アラートが表示されます。
- プッシュ通知のアクセス許可アラートをリセットする場合は、最初の手順で作成したバックアップからデバイスを復元します。
Apple Tech Noteには、デバイスを復元して[プッシュ通知]ダイアログをリセットできることも記載されています。
デバイス自体(iOS 5.x)で[一般]->[リセット]->[すべてのコンテンツと設定を消去]オプションを使用できるとは限りません。
私は最近、react-nativeアプリケーションで同様の問題に遭遇しました。iPhone OSのバージョンは13.1でした。アプリケーションをアンインストールしてアプリをインストールしようとしましたが、場所と通知の両方のアクセス許可が求められていないことに気付きました。
設定を確認すると、アプリケーションでロケーションが有効になっていることがわかりました(以前のインストールから)が、通知に対応するエントリがありませんでした。時間を設定せずにアンインストールして再起動しようとしましたが、機能しませんでした。ところで、私もAppstoreアプリをダウンロードしようとしましたが、それでも同じ動作です。
この問題は、デバイスの時刻を設定した後にのみ解決されました。
ianolitoの答えに加えて。
1年前にダウンロードしたアプリで同じ問題が発生し、最初にプッシュ通知を拒否しました。プッシュ通知を戻したいので、これらの手順はiOS7ベータ版でうまくいきました。どのポイントが正確にトリガーしたかわからない。
「すべてのコンテンツと設定を消去する」必要はありませんでした。多分それは誰かを助けるでしょう。
何時間も検索した後、上記の提案がうまくいかなかったので、これは3.x+の魅力のように機能しました
override func viewDidLoad() {
super.viewDidLoad()
requestAuthorization()
}
func requestAuthorization() {
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
print("Access granted: \(granted.description)")
}
} else {
// Fallback on earlier versions
}
}