web-dev-qa-db-ja.com

アプリがフォアグランドiOSにあるときにプッシュ通知を受ける

私は自分のアプリでプッシュ通知サービスを使用しています。アプリがバックグラウンドにあるときは通知画面(iOSデバイスの上から下にスワイプすると表示される画面)で通知を見ることができます。しかし、アプリケーションがフォアグラウンドにある場合、デリゲートメソッド

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo

が呼び出されていますが、通知画面に通知が表示されません。

アプリがバックグラウンドにあるかフォアグラウンドにあるかに関係なく、通知画面に通知を表示します。私は解決策を探すことにうんざりしています。任意の助けは大歓迎です。

158
Ab'initio

アプリケーションがフォアグラウンドで実行されている場合、iOSは通知バナー/警告を表示しません。それは仕様によるものです。しかし、次のようにUILocalNotificationを使うことでそれを達成できます。

  • リモート受信時にアプリケーションがアクティブ状態かどうかを確認
    お知らせ。アクティブ状態の場合はUILocalNotificationを発行します。

    if (application.applicationState == UIApplicationStateActive ) {
    
        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        localNotification.userInfo = userInfo;
        localNotification.soundName = UILocalNotificationDefaultSoundName;
        localNotification.alertBody = message;
        localNotification.fireDate = [NSDate date];
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    }
    

迅速:

if application.applicationState == .active {
    var localNotification = UILocalNotification()
    localNotification.userInfo = userInfo
    localNotification.soundName = UILocalNotificationDefaultSoundName
    localNotification.alertBody = message
    localNotification.fireDate = Date()
    UIApplication.shared.scheduleLocalNotification(localNotification)
}
21
Ab'initio

アプリがフォアグラウンドのときにバナーメッセージを表示するには、次の方法を使用します。

iOS 10、Swift 3/4

// This method will be called when app received Push notifications in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 
{
    completionHandler([.alert, .badge, .sound])
}

iOS 10、Swift 2.

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
    //Handle the notification
    completionHandler(
       [UNNotificationPresentationOptions.Alert,
        UNNotificationPresentationOptions.Sound,
        UNNotificationPresentationOptions.Badge])
}

アプリデリゲートを通知センターのデリゲートとして登録する必要もあります。

import UserNotifications

// snip!

class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate

// snip!

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      // set the delegate in didFinishLaunchingWithOptions
      UNUserNotificationCenter.current().delegate = self
      ...
   }
152
chengsam

以下のコードはあなたのために働くでしょう:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  {
    application.applicationIconBadgeNumber = 0;             
    //self.textView.text = [userInfo description];
    // We can determine whether an application is launched as a result of the user tapping the action
    // button or whether the notification was delivered to the already-running application by examining
    // the application state.

    if (application.applicationState == UIApplicationStateActive) {                
        // Nothing to do if applicationState is Inactive, the iOS already displayed an alert view.                
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Did receive a Remote Notification" message:[NSString stringWithFormat:@"Your App name received this notification while it was running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];          
    }    
}
53
Mahesh P

興味のある方は、システムプッシュバナーのように見えるカスタムビューを作成しましたが、閉じるボタン(小さな青いX)とカスタムアクションのメッセージをタップするオプションを追加しました。また、ユーザーが古い通知を読んだり却下したりする時間がある前に、複数の通知が到着した場合もサポートされます(何個まで積み上げることができるかに制限はありません...)

GitHubへのリンク:AGPushNote

使い方は基本的には裏書です:

[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];

そして、それはiOS 7ではこんな感じです(iOS 6はiOS 6のルックアンドフィールを持っています...)

enter image description here

38
Aviel Gross

目標C

enter image description here

iOS 10では、show notification bannerのwillPresentNotificationメソッドをforegroundに統合する必要があります。

アプリがフォアグラウンドモードの場合(アクティブ)

- (void)userNotificationCenter:(UNUserNotificationCenter* )center willPresentNotification:(UNNotification* )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
    NSLog( @“Here handle Push notification in foreground" ); 
    //For notification Banner - when app in foreground

    completionHandler(UNNotificationPresentationOptionAlert);

    // Print Notification info
    NSLog(@"Userinfo %@",notification.request.content.userInfo);
}
31

アプリケーションがフォアグラウンドで実行されている場合、iOSは通知バナー/警告を表示しません。それは仕様によるものです。アプリケーションがフォアグラウンドにある間に通知を受け取る状況に対処するには、コードをいくつか書く必要があります。通知は最も適切な方法で表示する必要があります(たとえば、UITabBarアイコンにバッジ番号を追加する、Notification Centerバナーをシミュレートするなど)。

13
Daniel Martín

バナーアラートを模した独自の通知を作成できます。

1つの方法は、バナーのように見え、アニメーション化してタッチに応答できるカスタムのuiviewを作成することです。これを念頭に置いて、さらに多くの機能を備えたさらに優れたバナーを作成できます。

それともあなたのためにそれを行うAPIを探して、あなたのプロジェクトにポッドファイルとしてそれらを追加することができます。

これが私が使ったカップルです。

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages

9
marshy101

これは、アプリがアクティブ状態(フォアグラウンドまたはオープン)のときにプッシュ通知を受け取るためのコードです。 NUserNotificationCenterのドキュメント

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
     completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge])
}

通知のuserInfoにアクセスする必要がある場合は、コードを使用します:notification.request.content.userInfo

アップルによれば ドキュメント 、はい、アプリの実行中に通知を表示できます enter image description here

7
SPatel

Xcode 10 Swift 4.2

アプリがフォアグラウンドにあるときにプッシュ通知を表示するには-

ステップ1: AppDelegateクラスにデリゲートUNUserNotificationCenterDelegateを追加します。

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

ステップ2: UNUserNotificationCenterデリゲートを設定します

let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.delegate = self

ステップ3:このステップにより、アプリがフォアグラウンドにある場合でもプッシュ通知を表示できます

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])

    }

ステップ4:このステップはオプションです。アプリがフォアグラウンドにあるかどうかを確認し、フォアグラウンドにある場合は、ローカルPushNotificationを表示します。

func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler:@escaping (UIBackgroundFetchResult) -> Void) {

        let state : UIApplicationState = application.applicationState
        if (state == .inactive || state == .background) {
            // go to screen relevant to Notification content
            print("background")
        } else {
            // App is in UIApplicationStateActive (running in foreground)
            print("foreground")
            showLocalNotification()
        }
    }

ローカル通知機能-

fileprivate func showLocalNotification() {

        //creating the notification content
        let content = UNMutableNotificationContent()

        //adding title, subtitle, body and badge
        content.title = "App Update"
        //content.subtitle = "local notification"
        content.body = "New version of app update is available."
        //content.badge = 1
        content.sound = UNNotificationSound.default()

        //getting the notification trigger
        //it will be called after 5 seconds
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)

        //getting the notification request
        let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)

        //adding the notification to notification center
        notificationCenter.add(request, withCompletionHandler: nil)
    }
3

あなたのアプリデリゲートで以下のコードを使用してください

import UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
 var currentToken: String?
 var window: UIWindow?
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        application.registerForRemoteNotifications()
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in

            // Enable or disable features based on authorization.
            if granted == true
            {
                print("Allow")
                UIApplication.shared.registerForRemoteNotifications()
            }
            else
            {
                print("Don't Allow")
            }
        }
        UNUserNotificationCenter.current().delegate = self

        return true
    }
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        currentToken = token  //get device token to delegate variable

    }
 public class var shared: AppDelegate {
        return UIApplication.shared.delegate as! AppDelegate
    }
 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
         completionHandler([.alert, .badge, .sound])
    }
}
2
Varun Naharia

そのcompletionHandler行をデリゲートメソッドに追加しても同じ問題が解決しました。

//Called when a notification is delivered to a foreground app.
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

completionHandler([.alert, .badge, .sound])
} 
2
Furkan S. Dağ

前述のように、これを実現するにはUserNotification.frameworkを使用する必要があります。しかし、私の目的のために私はとにかくアプリでそれを見せなければならなくて、そしてiOS 11スタイルを持ちたかったので、私は小さい補助ビューを作成しました、多分誰かにとって役に立つでしょう。

GitHub iOS 11プッシュ通知ビュー

0
Orest Savchak