アプリが実行されていないときにプッシュ通知を受信すると、その通知をクリックするとアプリが起動しますが、設定したアラートビューをユーザーに表示せず、表示するかどうかを尋ねます通知の内容かどうか。ただ起動し、そこに座っています。
プッシュ通知は、アクティブなアプリとして、またはバックグラウンドでアプリを実行しているときに完全に機能しますが、アプリが実行されていないときには何も正しく機能しません。
アプリケーションでlaunchOptions NSDictionaryをログアウトしてみました:didFinishLaunchingWithOptions:がもたらす負荷を確認しますが、「(null)」として表示されます。それは基本的に何も含まれていません-通知の負荷を含めるべきではない理由は意味がありませんか?
アプリが実行されていないときにプッシュ通知が届くようにする方法はありますか?
アプリが実行されていない状態のときにプッシュ通知を処理する方法を意味します。多数の通知を受信し、アプリを開かなかった場合、システムの通知パネルもタップしなかった場合はどうでしょう。後で取得するために、これらのプッシュをどのように保存しますか。
あなたの質問によると、アプリを開いたときにすべての通知を保持する方法はありません。APIを呼び出して、バックエンド/サーバーからタイムスタンプごとにすべての通知を取得することをお勧めします。
1)アプリケーションがバックグラウンドで実行されている場合およびアプリケーションがフォアグラウンドで実行されている場合application:didReceiveRemoteNotification:
メソッドは以下のように呼び出されます。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if (application.applicationState == UIApplicationStateInactive)
{
// opened from a Push notification when the app was on background
NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]);
}
else if(application.applicationState == UIApplicationStateActive)
{
// a Push notification when the app is running. So that you can display an alert and Push in any view
NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]);
}
}
2)アプリケーションが起動しない場合(閉じる) then application:didFinishedLaunchingWithOptions
メソッドが呼び出されます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (launchOptions != nil)
{
// opened from a Push notification when the app is closed
NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (userInfo != nil)
{
NSLog(@"userInfo->%@", [userInfo objectForKey:@"aps"]);
}
}
else
{
// opened app without a Push notification.
}
}
)現在、特定の通知を削除する方法はありません。ユーザーがいずれかのアプリからアプリを開いたときに通知センターに表示されないようにアプリからすべての通知を削除するには、アプリのバッジを0に設定します。
アプリは、プッシュ通知をバックグラウンドで処理しません。実際にOSが行うことは、通知を押してからアプリを起動することです。次の方法でこの瞬間をキャッチできます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
// Your app has been awoken by a notification...
}
}
getDeliveredNotifications(completionHandler:)
メソッドを使用して、アプリに配信された通知を取得できます。これは、通知センターに現在表示されている通知のみを返し、ユーザーが手動でクリアした通知は返しません。
UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
// notifications: An array of UNNotification objects representing the local
// and remote notifications of your app that have been delivered and are still
// visible in Notification Center. If none of your app’s notifications are
// visible in Notification Center, the array is empty.
// As said in the documentation, this closure may be executed in a background
// thread, so if you want to update your UI you'll need to do the following:
DispatchQueue.main.sync { /* or .async {} */
// update UI
}
}
アプリケーション側でこれを処理する方法はありません。サーバーで未読バッジの数を維持する必要があります。アプリが強制終了されると、サーバーからバッジの値が更新されます。
そのため、いつでもアプリケーションを開くと、Webサービスを呼び出して必要な通知を取得し、Tabbarのバッジを更新する必要があります(使用されている場合)。
次のような通知から以前に終了したアプリを起動した後、アラートを表示できます。
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { // display the alert }