it-swarm.com.de

Erhalten Sie eine Push-Benachrichtigung, während die App in iOS im Vordergrund ist

Ich verwende den Push-Benachrichtigungsdienst in meiner App. Wenn sich die App im Hintergrund befindet, wird eine Benachrichtigung auf dem Benachrichtigungsbildschirm angezeigt (Bildschirm wird angezeigt, wenn wir vom oberen Rand des iOS-Geräts nach unten streichen). Wenn jedoch die Anwendung im Vordergrund steht, wird die Delegate-Methode verwendet

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

wird angerufen, aber die Benachrichtigung wird nicht im Benachrichtigungsbildschirm angezeigt.

Ich möchte eine Benachrichtigung auf dem Benachrichtigungsbildschirm anzeigen, unabhängig davon, ob sich die App im Hintergrund oder im Vordergrund befindet. Ich bin müde von der Suche nach einer Lösung. Jede Hilfe wird sehr geschätzt.

166
Ab'initio

Wenn die Anwendung im Vordergrund ausgeführt wird, zeigt iOS kein Benachrichtigungsbanner/keine Benachrichtigung an. Das ist so gewollt. Aber wir können es erreichen, indem wir UILocalNotification wie folgt verwenden

  • Überprüfen Sie, ob sich die Anwendung beim Empfang einer Fernbedienung im aktiven Zustand befindet
    Benachrichtigung. Im aktiven Zustand eine UILocalNotification abfeuern.

    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];
    }
    

Schnell:

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

Verwenden Sie die folgende Methode, um eine Bannermeldung anzuzeigen, während sich die App im Vordergrund befindet.

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])
}

Sie müssen Ihren App-Delegaten auch als Delegaten für das Benachrichtigungscenter registrieren:

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
      ...
   }
165
chengsam

Der folgende Code wird für Sie funktionieren:

- (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

Für alle, die interessiert sein könnten, habe ich eine benutzerdefinierte Ansicht erstellt, die aussieht wie das System. Es wird auch der Fall unterstützt, dass mehr als eine Benachrichtigung eingegangen ist, bevor der Benutzer Zeit hatte, die alten zu lesen/zu verwerfen.

Link zu GitHub: AGPushNote

Die Verwendung ist grundsätzlich on-liner:

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

Und so sieht es auf iOS7 aus (iOS6 hat ein iOS6-Look & Feel ...)

enter image description here

38
Aviel Gross

Ziel C

enter image description here

Zum iOS 10 wir müssen die willPresentNotification Methode zum Anzeigen des Benachrichtigungsbanners in foreground integrieren.

Wenn App im Vordergrundmodus (aktiv)

- (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

Wenn die Anwendung im Vordergrund ausgeführt wird, zeigt iOS kein Benachrichtigungsbanner/keine Benachrichtigung an. Das ist so gewollt. Sie müssen Code schreiben, um die Situation zu bewältigen, in der Ihre App eine Benachrichtigung erhält, während sie sich im Vordergrund befindet. Sie sollten die Benachrichtigung auf die am besten geeignete Weise anzeigen (z. B. Hinzufügen einer Ausweisnummer zu einem UITabBar -Symbol, Simulieren eines Notification Center-Banners usw.).

13
Daniel Martín

Sie können eine eigene Benachrichtigung erstellen, die den Banner-Alarm nachahmt.

Eine Möglichkeit besteht darin, eine benutzerdefinierte Ansicht zu erstellen, die dem Banner ähnelt und Berührungen animieren und darauf reagieren kann. In diesem Sinne können Sie noch bessere Banner mit noch mehr Funktionalität erstellen.

Oder Sie können nach einer API suchen, die dies für Sie erledigt, und sie als Poddateien zu Ihrem Projekt hinzufügen.

Hier sind ein paar, die ich benutzt habe:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages

9
marshy101

Hier ist der Code, um eine Push-Benachrichtigung zu erhalten, wenn sich die App im aktiven Zustand befindet (Vordergrund oder offen). NUserNotificationCenter-Dokumentation

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

Wenn Sie auf userInfo of notification zugreifen müssen, geben Sie den folgenden Code ein: notification.request.content.userInfo

Laut Apple Dokumentation , Ja, Sie können Benachrichtigungen anzeigen, während die App ausgeführt wird enter image description here

7
SPatel

Xcode 10 Swift 4.2

So zeigen Sie die Push-Benachrichtigung an, wenn sich Ihre App im Vordergrund befindet:

Schritt 1: Delegat UNUserNotificationCenterDelegate in AppDelegate-Klasse hinzufügen.

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

Schritt 2: Legen Sie den UNUserNotificationCenter-Delegaten fest

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

Schritt 3: In diesem Schritt kann Ihre App Push-Benachrichtigungen anzeigen, auch wenn sich Ihre App im Vordergrund befindet

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

    }

Schritt 4: Dieser Schritt ist optional. Überprüfen Sie, ob sich Ihre App im Vordergrund befindet und ob sie sich im Vordergrund befindet, und zeigen Sie dann Local PushNotification an.

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()
        }
    }

Lokale Benachrichtigungsfunktion -

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

Verwenden Sie in Ihrer App den folgenden Code

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

Das Hinzufügen dieser completionHandler-Zeile zur delegate-Methode löste das gleiche Problem für mich:

//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ğ

Wie oben erwähnt, sollten Sie UserNotification.framework Verwenden, um dies zu erreichen. Aber für meine Zwecke muss ich es trotzdem in der App zeigen und wollte den iOS 11 - Stil haben, also habe ich eine kleine Hilfsansicht erstellt, die vielleicht für jemanden nützlich wäre.

GitHub iOS 11 Push Notification View .

0
Orest Savchak