1. ホーム
  2. ios

[解決済み] アプリが開いていてフォアグラウンドの時にiOS純正の通知バナーを表示させる?

2022-06-28 23:47:12

質問

Apple の公式 iOS メッセージ アプリが開いていてフォアグラウンドにある場合、他の連絡先からの新しいメッセージは、iOS のネイティブの通知アラート バナーをトリガーします。以下の画像を参照してください。

これは、App Store のサードパーティ製アプリで可能ですか? アプリのローカルおよび/またはプッシュ通知の間に、アプリが 開いていてフォアグラウンドにいるとき ?

テストするとき 私のアプリ の場合、通知は受信されますが iOSのアラートUIが表示されない .

しかし、この動作は は、Apple の公式メッセージ アプリで確認できます。

この ローカルおよびリモート通知プログラミングガイド には、こう書かれています。

オペレーティング システムがローカル通知またはリモート通知を配信し、対象アプリが フォアグラウンドで動作していない である場合、その通知は アラート アイコン、バッジ番号、または音によってユーザーに通知することができます。

もしアプリが フォアグラウンド で動作している場合、アプリデリゲートはローカルまたはリモートの通知を受け取ります。

そうです、受信できるのは 通知データ を受け取ることができます。しかし、私は iOS のネイティブの通知アラート UI を表示する .

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{
    // I know we still receive the notification `userInfo` payload in the foreground.
    // This question is about displaying the stock iOS notification alert UI.

    // Yes, one *could* use a 3rd party toast alert framework. 
    [self use3rdPartyToastAlertFrameworkFromGithub]
}

では、MessagesはプライベートAPIを使って、フォアグラウンドにいる間にアラートを表示しているのでしょうか?

この質問の目的のために サードパーティの "トースト" ポップアップ警告を提案しないでください。 を提案しないでください。私は、これが を使用して実行できる場合にのみ興味があります。 純正、ネイティブのiOS ローカルまたはプッシュ通知のアラートUI アプリケーションが開いている間、フォアグラウンドで .

どのように解決するのですか?

iOS 10 UNUserNotificationCenterDelegate プロトコルを追加し、アプリがフォアグラウンドにあるときに通知を処理します。

UNUserNotificationCenterDelegate プロトコルは、通知を受け取り、アクションを処理するためのメソッドを定義しています。アプリがフォアグラウンドにある場合、到着した通知はシステムインターフェースを用いて自動的に表示されるのではなく、デリゲートオブジェクトに配信されます。

Swiftです。

optional func userNotificationCenter(_ center: UNUserNotificationCenter, 
                     willPresent notification: UNNotification, 
      withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)

Objective-Cです。

- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
       willPresentNotification:(UNNotification *)notification 
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler;

この UNNotificationPresentationOptions フラグを使用すると UNNotificationPresentationOptionAlert を指定して、通知によって提供されるテキストを使用してアラートを表示することができます。

を表示することができるので、これは重要です。 アプリが開いている間、フォアグラウンドで これはiOS 10の新機能です。


サンプルコードです。

class AppDelegate: UIResponder, UIApplicationDelegate {
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // Set UNUserNotificationCenterDelegate
        UNUserNotificationCenter.current().delegate = self
        
        return true
    }
    
}

// Conform to UNUserNotificationCenterDelegate
extension AppDelegate: UNUserNotificationCenterDelegate {
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
           willPresent notification: UNNotification,
           withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    {
        completionHandler(.alert)
    }
    
}