it-swarm.com.ru

Получите Push-уведомление, пока приложение на переднем плане iOS

Я использую сервис push-уведомлений в своем приложении. Когда приложение находится в фоновом режиме, я могу видеть уведомление на экране уведомлений (экран отображается, когда мы проводим вниз с верхней части устройства 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];
    }
    

Swift:

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

Для всех, кого это может заинтересовать, я создал пользовательское представление, которое выглядит как системный баннер Push сверху, но добавляет кнопку закрытия (маленький синий X) и возможность нажать на сообщение для настраиваемого действия. Он также поддерживает случай, когда поступило более одного уведомления до того, как пользователь успел прочитать/отклонить старые (без ограничения на то, сколько может накапливаться ...)

Ссылка на GitHub: AGPushNote

Использование в основном on-liner:

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

И это выглядит на iOS7 (iOS6 выглядит и чувствует iOS6 ...)

enter image description here

38
Aviel Gross

Цель C

enter image description here

Для iOS 10 нам нужно интегрировать метод 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
Ashwini Chougale

Если приложение работает на переднем плане, iOS не будет показывать баннер/предупреждение. Это по замыслу. Вы должны написать некоторый код, чтобы справиться с ситуацией, когда ваше приложение получает уведомление, пока оно находится на переднем плане. Вы должны показывать уведомление наиболее подходящим способом (например, добавляя номер значка к значку UITabBar, имитируя баннер Центра уведомлений и т.д.).

13
Daniel Martín

Вы можете создать свое собственное уведомление, которое имитирует предупреждение баннера.

Одним из способов является создание пользовательского интерфейса, который выглядит как баннер и может анимировать и реагировать на прикосновения. Имея это в виду, вы можете создавать еще лучшие баннеры с еще большей функциональностью.

Или вы можете найти API, который сделает это за вас, и добавить их в виде подфайлов в ваш проект.

Вот пара, которую я использовал:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages

9
marshy101

Вот код для получения Push-уведомления, когда приложение находится в активном состоянии (передний план или открыт). документация UNUserNotificationCenter

@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

8
Kavin Kumar Arumugam

Согласно Apple документация , Да, вы можете отображать уведомления во время работы приложения enter image description here

7
SPatel

В вашем приложении делегат использует приведенный ниже код

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

Добавление строки завершение в метод делегата решило ту же проблему для меня:

//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 Push Push Notification View .

0
Orest Savchak