Отображение знакового баннера уведомлений iOS, когда ваше приложение открыто и находится на переднем плане?



4 Answers

Для отображения сообщения баннера, когда приложение находится на переднем плане, используйте следующий метод.

iOS 10, Swift 3 :

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

Когда официальное приложение Apple iOS Messages открыто и на переднем плане, новые сообщения от других контактов запускают запасной, собственный оповещение о предупреждении iOS. См. Изображение ниже.

Возможно ли это в сторонних приложениях в App Store? Локальные и / или Push-уведомления для вашего приложения, пока ваше приложение открыто и находится на переднем плане ?

При тестировании моего приложения уведомления получаются, но не отображается пользовательский интерфейс iOS .

Но это поведение наблюдается в официальном приложении Apple для приложений:

Руководство по программированию локального и удаленного уведомлений гласит:

Когда операционная система отправляет локальное уведомление или удаленное уведомление, и целевое приложение не работает на переднем плане , оно может передать уведомление пользователю через предупреждение , номер значка значка или звук.

Если приложение выполняется на переднем плане при доставке уведомления, делегат приложения получает локальное или удаленное уведомление.

Поэтому да, мы можем получать данные уведомления, находясь на переднем плане. Но я не вижу возможности представить собственный пользовательский интерфейс уведомления об уведомлениях iOS .

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

Являются ли сообщения затем с помощью частного API для отображения предупреждения на переднем плане?

Для целей этого вопроса, пожалуйста, не предлагайте никаких всплывающих предупреждений сторонних производителей на github или т. Д. Мне интересно, только если это можно сделать, используя локальный пользовательский интерфейс iOS Local или Push Notification, когда ваше приложение открытыми и на переднем плане .




UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.body = body;
content.userInfo = userInfo;
content.sound = [UNNotificationSound defaultSound];
[content setValue:@(YES) forKeyPath:@"shouldAlwaysAlertWhileAppIsForeground"];

UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"Notif" content:content trigger:nil];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    DLog(@"Error:%@", error);
}];

Я могу показать push-уведомление, когда приложение активно для iOS 10.

  1. Сообщение push с сервера должно быть тихим .

  2. При получении удаленного уведомления с сервера вы отправляете локальное уведомление и устанавливаете значение для keyPath: shouldAlwaysAlertWhileAppIsForeground = True




Чтобы показывать уведомления, пока приложение открыто, мы должны обрабатывать его вручную. Итак, что я делаю ниже, нужно обработать уведомление после его получения.

Добавить все ниже в AppDelegate.m

  1. Обращаться с призывом к уведомлению
  2. Создайте представление, добавьте сообщение AppIcon, Notification и покажите его как анимацию
  3. Добавить Touch распознаватель для удаления, если коснуться или удалить через 5 секунд анимацию.

Дайте мне знать, если это одобренное решение. Работала хорошо для меня, но я не уверен, что это правильный путь.

- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {


NSString *notifMessage = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

//Define notifView as UIView in the header file
[_notifView removeFromSuperview]; //If already existing

_notifView = [[UIView alloc] initWithFrame:CGRectMake(0, -70, self.window.frame.size.width, 80)];
[_notifView setBackgroundColor:[UIColor blackColor]];

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10,15,30,30)];
imageView.image = [UIImage imageNamed:@"AppLogo.png"];

UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 15, self.window.frame.size.width - 100 , 30)];
myLabel.font = [UIFont fontWithName:@"Helvetica" size:10.0];
myLabel.text = notifMessage;

[myLabel setTextColor:[UIColor whiteColor]];
[myLabel setNumberOfLines:0];

[_notifView setAlpha:0.95];

//The Icon
[_notifView addSubview:imageView];

//The Text
[_notifView addSubview:myLabel];

//The View
[self.window addSubview:_notifView];

UITapGestureRecognizer *tapToDismissNotif = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                                    action:@selector(dismissNotifFromScreen)];
tapToDismissNotif.numberOfTapsRequired = 1;
tapToDismissNotif.numberOfTouchesRequired = 1;

[_notifView addGestureRecognizer:tapToDismissNotif];


[UIView animateWithDuration:1.0 delay:.1 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{

    [_notifView setFrame:CGRectMake(0, 0, self.window.frame.size.width, 60)];

} completion:^(BOOL finished) {


}];


//Remove from top view after 5 seconds
[self performSelector:@selector(dismissNotifFromScreen) withObject:nil afterDelay:5.0];


return;


}

//If the user touches the view or to remove from view after 5 seconds
- (void)dismissNotifFromScreen{

[UIView animateWithDuration:1.0 delay:.1 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{

    [_notifView setFrame:CGRectMake(0, -70, self.window.frame.size.width, 60)];

} completion:^(BOOL finished) {


}];


}



Если цель развертывания> = iOS10, используйте UNUserNotification, например,

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    {
        // Change this to your preferred presentation option
        completionHandler([.alert, .sound])
    }



Версия Swift 3

Это показывает предупреждение, когда приложение находится на переднем плане.

if #available(iOS 10.0, *)
{
    // need to setup the global notification delegate somewhere when your app starts
    //
    UNUserNotificationCenter.current().delegate = applicationDelegate

    // to show a message
    //
    let content = UNMutableNotificationContent()
    content.body = "MESSAGE"

    let request = UNNotificationRequest(identifier: "fred", content: content, trigger: nil)
    UNUserNotificationCenter.current().add(request)
    {
       error in // called when message has been sent

       debugPrint("Error: \(error)")
    }
}

Применение ApplicationDelegate UNUserNotificationCenterDelegate

@available(iOS 10.0, *)
public func userNotificationCenter(_ center : UNUserNotificationCenter, willPresent notification : UNNotification, withCompletionHandler completionHandler : @escaping (UNNotificationPresentationOptions) -> Void)
{
    completionHandler([.alert]) // only-always show the alert
}



Related