J'utilise le service de notification Push dans mon application. Lorsque l'application est en arrière-plan, je peux voir la notification sur l'écran de notification (écran affiché lorsque nous glissons depuis le haut du périphérique iOS). Mais si application est au premier plan, la méthode déléguée
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
est appelé mais la notification ne s'affiche pas dans l'écran de notification.
Je souhaite afficher la notification sur l'écran de notification, que l'application soit en arrière-plan ou en avant-plan. Je suis fatigué de chercher une solution. Toute aide est grandement appréciée.
Si l'application est exécutée au premier plan, iOS n'affichera pas de bannière/alerte de notification. C'est par conception. Mais nous pouvons y arriver en utilisant UILocalNotification
comme suit
Vérifier si l'application est dans l'état actif lors de la réception d'une télécommande
notification. S'il est actif, déclenchez une notification 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];
}
Rapide:
if application.applicationState == .active {
var localNotification = UILocalNotification()
localNotification.userInfo = userInfo
localNotification.soundName = UILocalNotificationDefaultSoundName
localNotification.alertBody = message
localNotification.fireDate = Date()
UIApplication.shared.scheduleLocalNotification(localNotification)
}
Pour afficher le message de bannière lorsque l'application est au premier plan, utilisez la méthode suivante.
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])
}
Vous devez également enregistrer votre délégué d'application en tant que délégué du centre de notifications:
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
...
}
Le code ci-dessous sera un travail pour vous:
- (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];
}
}
Pour ceux qui sont intéressés, j'ai fini par créer une vue personnalisée qui ressemble à la bannière système en haut, mais qui ajoute un bouton de fermeture (petit X bleu) et une option permettant de toucher le message pour une action personnalisée. Il prend également en charge le cas de plusieurs notifications arrivées avant que l'utilisateur ait eu le temps de lire/de rejeter les anciennes (sans limite du nombre de piles pouvant être accumulées ...)
L'utilisation est fondamentalement sur ligne:
[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];
Et cela ressemble à ceci sur iOS7 (iOS6 a une apparence et une sensation iOS6 ...)
Objectif C
Pour iOS 10
nous avons besoin d'intégrer la méthode willPresentNotification
pour afficher la bannière de notification dans foreground
.
Si application en mode avant-plan (actif)
- (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);
}
Si l'application est exécutée au premier plan, iOS n'affichera pas de bannière/alerte de notification. C'est par conception. Vous devez écrire du code pour traiter de la situation dans laquelle votre application reçoit une notification alors qu'elle est au premier plan. Vous devez afficher la notification de la manière la plus appropriée (par exemple, ajouter un numéro de badge à une icône UITabBar
, simuler une bannière du Centre de notifications, etc.).
Vous pouvez créer votre propre notification qui imite l'alerte de la bannière.
Une solution consiste à créer un affichage personnalisé qui ressemble à la bannière et qui peut animer les contacts et y répondre. Dans cet esprit, vous pouvez créer des bannières encore meilleures avec encore plus de fonctionnalités.
Ou vous pouvez rechercher une API qui le fait pour vous et les ajouter en tant que podfiles à votre projet.
Voici un couple que j'ai utilisé:
Voici le code pour recevoir les notifications Push lorsque l'application est à l'état actif (au premier plan ou ouverte). documentation UNUserNotificationCenter
@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge])
}
Si vous devez accéder à userInfo de notification, utilisez le code: notification.request.content.userInfo
Selon Apple documentation , Oui, vous pouvez afficher une notification lorsque l'application est en cours d'exécution
Xcode 10 Swift 4.2
Pour afficher la notification push lorsque votre application est au premier plan -
Étape 1: ajouter un délégué UNUserNotificationCenterDelegate dans la classe AppDelegate.
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
Étape 2: Définir le délégué UNUserNotificationCenter
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.delegate = self
Étape 3: Cette étape permettra à votre application d'afficher une notification push, même lorsque votre application est au premier plan.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .sound])
}
Étape 4: Cette étape est facultatif. Vérifiez si votre application est au premier plan et si elle est au premier plan, puis affichez la notification locale.
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()
}
}
Fonction de notification locale -
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)
}
Dans votre application, utilisez le code ci-dessous.
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])
}
}
L'ajout de cette ligne de complétion à la méthode déléguée a résolu le même problème pour moi:
//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])
}
Comme mentionné ci-dessus, vous devez utiliser UserNotification.framework
pour y parvenir. Mais pour mes besoins, je dois quand même le montrer dans l'application et je voulais avoir le style iOS 11
, alors j'ai créé une petite vue d'aide, ce serait peut-être utile pour quelqu'un.