백그라운드 - ios 앱 종료 푸시




iOS 푸시 알림:앱이 백그라운드에있을 때 사용자가 알림을 탭했는지 감지하는 방법은 무엇입니까? (7)

"배경 모드"> "원격 알림"이 == 예인 경우, 알림 이벤트를 탭하면 다음이 나타납니다.

-(void)userNotificationCenter:(UNUserNotificationCenter *)center **didReceiveNotificationResponse**:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler.

그것은 나를 도왔다. 즐기세요 :)

이 주제와 관련하여 많은 스택 오버 스레드가 있지만 여전히 좋은 해결책을 찾지 못했습니다.

앱이 백그라운드에 launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] application:didFinishLaunchingWithOptions: 호출에서 launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] 를 확인하여 알림에서 앱이 launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] 있는지 확인할 수 있습니다.

앱이 백그라운드에있는 경우 모든 게시물은 application:didReceiveRemoteNotification: 을 사용하고 애플리케이션 상태를 확인하도록 제안합니다. 그러나 내가 실험 한 것처럼 (이 API의 이름에서 알 수 있듯이)이 메서드는 알림이 수신 될 때 탭되는 대신 호출됩니다.

따라서 문제는 응용 프로그램이 시작되고 백그라운드로 실행되고 application:didReceiveNotification ( application:didFinishLaunchWithOptions: 이 시점에서 트리거되지 않음)에서 알림을 받았다는 것을 알고 있다면 사용자가 앱을 다시 시작했는지 어떻게 알 수 있습니까? 알림을 누르거나 앱 아이콘을 누르면 사용자가 알림을 탭한 경우 해당 알림에 언급 된 페이지를 열어야합니다. 그렇지 않으면 안됩니다.

사용자 지정 작업 알림에 handleActionWithIdentifier 를 사용할 수 있지만 사용자가 알림 handleActionWithIdentifierhandleActionWithIdentifier 때가 아니라 사용자 지정 작업 버튼을 누를 때만 트리거됩니다.

감사.

편집하다:

아래의 답변 하나를 읽은 후에, 나는 이런 식으로 내 질문을 명확히 할 수 있다고 생각했습니다.

이 두 가지 시나리오를 어떻게 차별화 할 수 있습니까?

(A) 1. 앱이 배경으로 이동합니다. 2. 알림 수신; 3. 사용자가 알림을 탭합니다. 4. 앱이 포 그라운드로 진입

(B) 1. 앱이 배경으로 이동합니다. 2. 알림 수신; 3. 사용자는 알림을 무시하고 나중에 앱 아이콘을 탭합니다. 4. 앱이 포 그라운드로 진입

application:didReceiveRemoteNotification: 이 두 경우 모두 2 단계에서 트리거됩니다.

또는 (A)에 대해서만 3 단계에서 application:didReceiveRemoteNotification: 이 트리거되어야하지만 어떻게 든 내 앱을 잘못 구성하여 2 단계에서 볼 수 있습니까?


OK 나는 마침내 알아 냈습니다.

대상 설정 ➝ 기능 탭 ➝ 백그라운드 모드에서 "원격 알림"을 ​​선택하면 application:didReceiveRemoteNotification: 한 알림이 도착하자마자 application:didReceiveRemoteNotification: 이 트리거 application:didReceiveRemoteNotification: 경우에는 사용자가 알림을 탭할지 여부를 알려주는 방법.

이 상자를 선택 취소하면 알림을 누를 때만 application:didReceiveRemoteNotification: 이 트리거됩니다.

이 상자를 선택하면 앱 대리자 메서드 중 하나의 동작 방식이 변경되는 것이 조금 이상합니다. 해당 상자를 선택하면 Apple이 알림 수신 및 알림 탭에 서로 다른 두 가지 위임 방법을 사용합니다. 나는 대부분의 개발자가 항상 알림을 눌렀는지 여부를 알고 싶어한다고 생각합니다.

이 문제가 발생하는 다른 사람에게 도움이 되길 바랍니다. Apple은 또한 here 명확하게 문서화하지 않았으므로 알아내는 데 시간이 걸렸습니다.


나는 당신과 같은 것을 찾고 있었고 실제로 원격 알림이 필요없는 솔루션을 찾았습니다.

사용자가 앱을 탭했는지 또는 앱이 백그라운드인지 또는 활성 상태인지 확인하려면 애플리케이션 상태를 확인하면됩니다.

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

    if(application.applicationState == UIApplicationStateActive) {

        //app is currently active, can update badges count here

    }else if(application.applicationState == UIApplicationStateBackground){

        //app is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here

    }else if(application.applicationState == UIApplicationStateInactive){

        //app is transitioning from background to foreground (user taps notification), do what you need when user taps here

    }

자세한 정보 확인 :

UIKit 프레임 워크 참조> UIApplication 클래스 참조> UIApplicationState


내부에 수신 된 PushNotification을 처리하는 두 가지 기능이 있습니다.

class PushNotificationManager: NSObject, MessagingDelegate, UNUserNotificationCenterDelegate{

}

알림이 도착하자마자 첫 번째 트리거를 테스트했을 때

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    completionHandler(UNNotificationPresentationOptions.alert)

    //OnReceive Notification
    let userInfo = notification.request.content.userInfo
    for key in userInfo.keys {
         Constants.setPrint("\(key): \(userInfo[key])")
    }

    completionHandler([])

}

그리고 알림을 두 드렸을 때 두 번째 것 :

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    //OnTap Notification
    let userInfo = response.notification.request.content.userInfo
    for key in userInfo.keys {
        Constants.setPrint("\(key): \(userInfo[key])")
    }

    completionHandler()
}

너무 원격 알림 (백그라운드 모드) On / Off 상태로 테스트했습니다.


새로운 UserNotifications Framework가있는 iOS 11 UserNotifications 문제가 발생했습니다.

나를 위해 여기는 다음과 같습니다

  • 새로운 시작 : application:didFinishLaunchingWithOptions:
  • 포 그라운드에서 수신 : application:didReceiveRemoteNotification:fetchCompletionHandler:
  • 백그라운드에서 수신 : userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:

앱이 백그라운드에있을 때 앱 델리게이트의 application:didReceiveRemoteNotification:fetchCompletionHandler: 메서드를 호출하도록 푸시 알림의 페이로드를 구성 할 수 있습니다. 다음에 사용자가 응용 프로그램을 시작할 때 작업을 수행 할 수 있도록 일부 플래그를 설정할 수 있습니다.

Apple의 설명서에서이 방법을 사용하여 푸시 알림과 관련된 새 컨텐츠를 다운로드해야합니다. 또한이 기능을 사용하려면 백그라운드 모드에서 원격 알림을 활성화해야하며 푸시 알림 페이로드에는 값이 1로 설정된 content-available 키가 포함되어 있어야합니다. 자세한 내용은 developer.apple.com/library/ios/documentation/iPhone/Conceptual/… 에서 Apple Doc의 푸시 알림을 사용하여 다운로드 시작 섹션을 참조 developer.apple.com/library/ios/documentation/iPhone/Conceptual/… .

다른 방법은 푸시 알림 페이로드에 배지 수를 두는 것입니다. 다음에 응용 프로그램을 시작할 때 응용 프로그램 배지 수를 확인할 수 있습니다. 그 수가 0보다 크면 서버에서 작업을 수행하고 배지 수를 0으로 설정하십시오.

이것이 도움이되기를 바랍니다.








apple-push-notifications