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



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



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



при проверке Мои приложения уведомления получены, но нет iOS alert UI показано.



но такое поведение и видно в приложении официальных сообщений Apple:



Messages is open and in the foreground. Still shows a notification alert.



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




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



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




Так что да, мы можем получить данные уведомления находясь на переднем плане. Но я не вижу способа представьте собственный интерфейс уведомлений 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 для отображения предупреждения во время на переднем плане?



для целей этого вопроса,пожалуйста, не предлагайте никаких всплывающих предупреждений 3rd party "toast" на github или etc. Мне интересно только, если это можно сделать с помощью акции, Родной iOS локальные или Push-уведомления оповещения UI пока ваше приложение открыто и находится на переднем плане.

610   5  

5 ответов:

iOS 10 добавляет UNUserNotificationCenterDelegate протокол для обработки уведомлений, когда приложение находится на переднем плане.

The UNUserNotificationCenterDelegate протокол определяет методы получения уведомлений и обработки действий. Когда приложение находится на переднем плане, поступающие уведомления доставляются в объект делегата, а не отображаются автоматически с помощью системы межфазные границы.

Swift:

optional func userNotificationCenter(_ center: UNUserNotificationCenter, 
                     willPresent notification: UNNotification, 
      withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)

Цель-C:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
       willPresentNotification:(UNNotification *)notification 
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler;

The UNNotificationPresentationOptions флаги позволяют указать UNNotificationPresentationOptionAlert для отображения предупреждения с использованием текста, предоставленного уведомлением.

это ключ, так как он позволяет отображать предупреждение пока ваше приложение открыто и на переднем плане, что является новым для iOS 10.

пример кода:

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

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

iOS 10, Swift 3:

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

EDIT:

предупреждения переднего плана теперь возможны в iOS 10! пожалуйста, смотрите этот ответ.

для iOS 9 и ниже:

кажется, что невозможно показать оповещение об уведомлении iOS, когда ваше приложение открыто и находится на переднем плане. Сообщения.приложение должно использовать частный API.

система не отображает никаких предупреждений, значок значок приложения, или воспроизводить любые звуки, когда приложение уже самый передний. - UILocalNotification docs

The UIApplicationDelegate методы будет по-прежнему вызывается, что позволяет вашему приложению реагировать на локальное или удаленное уведомление:

application:didReceiveLocalNotification:
application:didReceiveRemoteNotification:

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

лучшее, что вы можете сделать-это свернуть свой собственный баннер оповещения или использовать существующий рамки:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{    
    // Use a 3rd party toast alert framework to display a banner 
    [self toastAlertFromGithub]
}

Я открыл радар для такого поведения здесь:rdar://22313177

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

добавить все ниже в AppDelegate.м

  1. обрабатывать вызов для уведомления
  2. создайте представление, добавьте AppIcon, уведомление и покажите его как анимацию
  3. добавить распознаватель прикосновений для удаления при прикосновении или удалить в течение 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) {


}];


}

вот код для получения уведомления толчка, когда приложение на переднем плане или в открытой стадии, iOS 10 & Swift 2.3

@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

метод userNotificationCenter(_:willPresent:withCompletionHandler:) вызывается только при добавлении в текст атрибута content-available:1. Конечная полезная нагрузка должна быть примерно такой:

{
     "aps":{
          "alert":"Testing.. (7)",
          "badge":1,"sound":"default"
     },
     "content-available":1
}

Comments

    Ничего не найдено.