포 그라운드 iOS의 앱에서 푸시 알림 받기


191

내 앱에서 푸시 알림 서비스를 사용하고 있습니다. 앱이 백그라운드에있을 때 알림 화면 (iOS 기기 상단에서 아래로 스 와이프하면 화면이 표시됨)에서 알림을 볼 수 있습니다. 그러나 응용 프로그램이 포 그라운드에 있으면 델리게이트 메소드

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

메시지가 표시되지만 알림 화면에 알림이 표시되지 않습니다.

앱이 백그라운드인지 전경인지에 관계없이 알림 화면에 알림을 표시하고 싶습니다. 해결책을 찾아 피곤하다. 도움을 주시면 감사하겠습니다.


35
Apple의 : 앱이 포 그라운드에서 실행되는 동안 로컬 또는 원격 알림을받는 경우, 앱별 방식으로 사용자에게 정보를 전달할 책임이 있습니다.
Lauri Lehmijoki

2
최신 (oct "16) 사과 링크 : here , there and there
azmeuk

1
iOS 9.3 이하의 푸시 알림을 포 그라운드로 지원하지 않습니까?
Anurag Sharma

@Lauri Lehmijoki 링크? 나는 공식 웹 사이트에서 그것을 찾지 못했습니다
Vyachaslav Gerchicov

1
나는 이온에 같은 문제에 직면하고있다 ...
사예드 흐드 알리

답변:


206

앱이 포 그라운드에있는 동안 배너 메시지를 표시하려면 다음 방법을 사용하십시오.

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.3 :

@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
      ...
   }

이 메소드가 호출되면?
Uma Madhavi

내 응용 프로그램 배경 또는 포 그라운드에서 맨 위에 알림을 표시하는 데 도움이됩니다 .2 주 이후 푸시 알림으로 작업하고 있습니다. 서버에서 메시지를받을 수 있습니다.
Uma Madhavi

@UmaMadhavi 푸시 알림을받을 수 있습니까?
chengsam

21
응용 프로그램 대리인으로 알림 센터 대리자를 설정하는 것을 잊지 마세요 : UNUserNotificationsCenter.current().delegate = self응용 프로그램의 didFinishLaunchingWithOptions에
Achintya 쇼크를

2
여전히 어려움을 겪고있는 사람들을 위해 UNUserNotificationCenter는 센터 앞에 's'가있는 UNUserNotificationsCenter가 아닙니다.
Raj

58

아래 코드가 도움이 될 것입니다.

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

작동합니다. 그것이하는 일에 대한 좀 더 자세한 정보; 응용 프로그램이 포 그라운드에있을 때 알림 텍스트가 포함 된 기본 UI 경고 상자가 나타납니다 ( title약간의 굵은 텍스트이고 그 message아래의 작은 텍스트입니다. 해제 할 '확인'단추가 맨 아래에 있습니다). applicationIconBadgeNumber 옵션이 0으로 설정되면 Springboard의 앱 아이콘 위에 표시되는 숫자를 숨기는 것입니다 (예 : 메일 앱에서 읽지 않은 메시지 수를 나타냄). 이 예에서는 해당 옵션이 필요한지 잘 모르겠습니다.
jwinn

이것은 UNnotification과 UILocalNotification 모두에 적용됩니까?
user6631314

38

누구나 관심을 가질 수 있도록 상단의 시스템 푸시 배너처럼 보이는 사용자 정의보기를 만들었지 만 닫기 버튼 (작은 파란색 X)과 사용자 정의 작업을 위해 메시지를 탭하는 옵션을 추가했습니다. 또한 사용자가 이전 알림을 읽거나 닫을 시간이되기 전에 도착한 둘 이상의 알림의 경우를 지원합니다 (얼마나 많은 사람이 쌓일 수 있는지에 대한 제한은 없습니다 ...)

GitHub에 링크 : AGPushNote

사용법은 기본적으로 라이너입니다.

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

그리고 iOS7에서 이와 같이 보입니다 (iOS6에는 iOS6 모양과 느낌이 있습니다 ...)

여기에 이미지 설명을 입력하십시오


1
또한 Swift에서 다시 상상했습니다 : github.com/charliewilliams/CWNotificationBanner
빌드 됨

멋지다, 이것은 유용 할 것이다.
无 夜 之 星辰

36

목표 C

여기에 이미지 설명을 입력하십시오

에 알림 배너 표시를위한 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);
}

1
코드를 복사하고 UNUserNotificationCenterDelegate 프로토콜을 사용하는 것을 잊지 마십시오.
Nik Kov

이 알림 대신 경고를 표시하려면 어떻게해야합니까?
Mihir Oza

@MihirOza UIAlertController를 원하십니까?
Ashwini Chougale

알고 있지만 앱이 활성화되어있을 때 알림 팝업을 원하지 않습니다. 내 앱에서만 경고하고 싶습니다.
Mihir Oza

25

애플리케이션이 포 그라운드에서 실행중인 경우 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];
    }

빠른:

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

86
나는 이것이 도움이 될 것이라고 생각하지 않습니다. 로컬 및 원격 알림은 동일하게 처리되므로이 로컬 알림이 실행되고 앱이 실행중인 경우 배지 / 배너 또는 사운드가 표시 / 재생되지 않습니다.
RPM

3
또한 iOS의 알림 센터에 엔트리를 떠나
Ab'initio

3
그러나 푸시 알림이 올 때 로컬 알림을 시작하지 않습니다. @ Rick77이 언급 한 것과 비슷한 동작을 시작합니다 : 경고 또는 토스터 표시. 운영 체제에서 처리하도록 요구하는 작업을 위해 운영 체제를 다시 거치지 않아도됩니다.
Fábio Oliveira

3
이 솔루션은 로컬 및 원격이 동일한 방식으로 처리되므로 앱이 포 그라운드에있을 때 원격 알림이 올 때 위치 알림을 생성해도 아무 것도 표시하지 않으므로 작동합니다. 경고 또는 사용자 정의 경고를 사용하는 것이 해결책입니다
Hammer

19
실제로 작동하지 않습니다. UILocalNotification 문서에서 :If the app is foremost and visible when the system delivers the notification, the app delegate’s application:didReceiveLocalNotification: is called to process the notification. Use the information in the provided UILocalNotification object to decide what action to take. The system does not display any alerts, badge the app’s icon, or play any sounds when the app is already frontmost.
Chris Morse

15

애플리케이션이 포 그라운드에서 실행중인 경우 iOS는 알림 배너 / 경고를 표시하지 않습니다. 의도적으로 설계된 것입니다. 앱이 포 그라운드에있는 동안 알림을받는 상황을 처리하려면 코드를 작성해야합니다. 가장 적절한 방법으로 알림을 표시해야합니다 (예 : UITabBar아이콘에 배지 번호 추가 , 알림 센터 배너 시뮬레이션 등).


1
그러나 iOS 메일 응용 프로그램에서는 메일 알림을받는 동안 새 알림 배너 / 경고를
받습니다.

3
@ Ab'initio 확실하지 않지만 iOS에서는 모든 응용 프로그램이 동일하게 생성되지 않습니다. 주식 메일 앱이 공개 SDK에서 사용할 수없는 일종의 개인 API를 사용하고 있다고 가정합니다. 또는 알림 코드가 Apple의 Mail 앱 ID에서 예외를 만들고있을 수 있습니다.
Daniel Martín

1
뭐?? 하피 레이지 공격을하려고합니다.
Josh

DanielMartín 유 내가 아이폰 OS 8.0에서 전경 상태에서 알림을 수신하는 방법을 말해 줄 수 @
딜립 Tiwari 보낸

10
이 답변은 iOS 9 이하에서만 적용 됩니다 . iOS 10부터 Apple은 알림을 처리하기위한 새로운 API ( UNUserNotificationCenter API) 를 도입했습니다 . 새로운 API와 함께 애플리케이션이 포 그라운드에있는 경우 알림을 표시 할 수 있습니다. 따라서이 질문의 다른 답변으로 인해 혼란 스럽다면 일부 답변이 너무 오래되어 iOS 9 이전 버전의 동작 만 설명하기 때문입니다. 다른 답변 UNUserNotificationCenter
tomacco

12

Xcode 10 스위프트 4.2

앱이 포 그라운드에있을 때 푸시 알림을 표시하려면-

1 단계 : AppDelegate 클래스에 델리게이트 UNUserNotificationCenterDelegate를 추가합니다.

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

2 단계 : UNUserNotificationCenter 대리인 설정

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

3 단계 : 이 단계에서는 앱이 포 그라운드에있는 경우에도 앱에서 푸시 알림을 표시 할 수 있습니다.

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

    }

4 단계 : 이 단계는 선택 사항 입니다. 앱이 포 그라운드에 있는지 확인하고 포 그라운드에 있으면 로컬 PushNotification을 표시하십시오.

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

지역 알림 기능-

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

1
이것은 모든 답글을 스레드로 읽어야하는 좋은 예입니다. 이전 스레드는 대리자보다 메서드를 언급하며 마지막으로 세 단계를 모두 수행해야합니다. 완전한 답변을 원하십니까?
user3069232

도움이되었음을 알게되어 기쁩니다. 행복한 코딩
Prashant Gaikwad

11

애플 문서 에 따르면 , 예, 앱이 실행되는 동안 알림을 표시 할 수 있습니다여기에 이미지 설명을 입력하십시오


앱 델리게이트 또는 specififc 클래스에서 해당 함수를 어디에서 쓸 수 있습니까?
iOS 개발자

뷰에서 해당 메소드를 작성하려면 어떻게해야합니까 ??
iOS 개발자

UNUserNotificationCenterDelegate프로토콜을 준수해야하는 조건은 어디든지 쓸 수 있습니다
SPatel

당신은 쓸 수 없습니다viewDidLoad
SPatel

1
나는 당신이 extension AppDelegate: UNUserNotificationCenterDelegate
SPatel

9

배너 알림을 모방하는 고유 한 알림을 만들 수 있습니다.

한 가지 방법은 배너처럼 보이고 사용자 정의 애니메이션에 반응하고 반응 할 수있는 사용자 정의 uiview를 작성하는 것입니다. 이를 염두에두고 더 많은 기능으로 더 나은 배너를 만들 수 있습니다.

또는 자신에게 맞는 API를 찾아 프로젝트에 podfile로 추가 할 수 있습니다.

내가 사용한 커플은 다음과 같습니다.

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages


1
이 링크가 질문에 대답 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
Robert

1
TWMessageBarManagersingleton 디자인 패턴을 사용하므로 appdelegate 자체를 통해 쉽게 호출하고 사용할 수 있습니다. 링크 주셔서 감사합니다.
Jay Mayu

8

다음은 앱이 활성 상태 (전경 또는 열린 상태) 일 때 푸시 알림을 수신하는 코드입니다. 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


이 함수를 어디에서 볼 수 있습니까? 또는보기 컨트롤러 클래스에서?
iOS 개발자

중첩 함수로 함수에서 호출 할 수 있다면 어떻게 될까요?
iOS 개발자

1
이것을 AppDelegate 클래스에 넣습니다. 이 함수를 호출 할 필요는 없습니다.
밀라노 자야와 르 데네

4

메소드를 위임하기 위해 completionHandler 행을 추가하면 동일한 문제가 해결되었습니다.

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

3

swift 5에서 PushNotification 사전을 파싱하려면

    func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
            if application.applicationState == .active {
                if let aps1 = data["aps"] as? NSDictionary {
                    if let dict = aps1["alert"] as? NSDictionary {
                        if let strTitle = dict["title"] as? String , let strBody = dict["body"] as? String {
                            if let topVC = UIApplication.getTopViewController() {
                                //Apply your own logic as per requirement
                                print("strTitle ::\(strTitle) , strBody :: \(strBody)")
                            }
                        }
                    }
                }
            }
        }

topBanner를 표시하는 top viewController를 가져 오려면

extension UIApplication {

    class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {

        if let nav = base as? UINavigationController {
            return getTopViewController(base: nav.visibleViewController)

        } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
            return getTopViewController(base: selected)

        } else if let presented = base?.presentedViewController {
            return getTopViewController(base: presented)
        }
        return base
    }
}

guard진술은 당신의 친구입니다 :-)
Nicolas Miari

2

앱 델리게이트에서 다음 코드를 사용하십시오.

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

0

위에서 언급했듯이 UserNotification.framework이를 달성하기 위해 사용해야 합니다. 그러나 내 목적을 위해 어쨌든 앱에 표시하고 iOS 11스타일을 원했기 때문에 작은 도우미보기를 만들었으므로 누군가에게 유용 할 수 있습니다.

GitHub iOS 11 푸시 알림보기 .


0

이를위한 가장 좋은 방법은 추가하는 것입니다 UNUserNotificationCenterDelegate에서 AppDelegate사용하여 extension AppDelegate: UNUserNotificationCenterDelegate 사용시 알림을받을 수 있도록 응용 프로그램을 그 확장을 알려줍니다

그리고이 방법을 구현

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

이 메서드는 응용 프로그램이 Foreground 에있는 경우에만 대리자에서 호출됩니다 .

최종 구현 :

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

그리고이 전화를하려면에 AppDelegate에있는 대리자를 설정해야 didFinishLaunchingWithOptions이 줄을 추가

UNUserNotificationCenter.current().delegate = self

당신은 수정할 수 있습니다

completionHandler(.alert) 

completionHandler([.alert, .badge, .sound]))

0

스위프트 5

1) 다음을 통해 AppDelegate의 대리인을 확인하십시오. UNUserNotificationCenterDelegate

2) UNUserNotificationCenter.current().delegate = self에서didFinishLaunch

3)의 방법을 아래에 구현하십시오 AppDelegate.

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

그게 다야!


-2

@Danial Martine이 말했듯이 iOS는 알림 배너 / 경고를 표시하지 않습니다. 의도적으로 설계된 것입니다. 그러나 실제로해야한다면 한 가지 방법이 있습니다. 나는 또한 이것으로 이것을 달성했다.

1. Parse FrameWork 에서 구문 분석 프레임 작업을 다운로드하십시오.

2. 가져 오기 #import <Parse/Parse.h>

3. didReceiveRemoteNotification 메소드에 다음 코드를 추가하십시오.

 - (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    [PFPush handlePush:userInfo];
}

PFPush는 원격 알림 처리 방법을 관리합니다. 앱이 포 그라운드에 있으면 경고를 표시하고 그렇지 않으면 맨 위에 알림을 표시합니다.


경보? 경고보기를 의미합니까?
iphondroid

1
하지만 경고 버튼 작업을 위해 전화를받는 방법
Charlie

-2

애플리케이션이 포 그라운드 상태 인 경우 현재 동일한 앱을 사용하고 있음을 의미합니다. 따라서 일반적으로 상단에 알림을 표시 할 필요가 없습니다.

그러나이 경우에도 알림을 표시하려면 토스트와 같은 사용자 지정 알림보기 또는 사용자 지정보기 또는 사용자에게 알림을 받았다는 것을 표시해야합니다.

앱에 이러한 기능이있는 경우 상단에 배지를 표시 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.