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

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

앱이 배경에 없으면, 내가 확인하실 수 있습니다 launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]application:didFinishLaunchingWithOptions:이 통지에서 연 것 있는지 확인하기 위해 전화.

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

따라서 문제는 앱이 시작된 후 백그라운드로 설정되고 알림이 수신 된 경우 application:didReceiveNotification( application:didFinishLaunchWithOptions:이 시점에서 트리거되지 않음) 사용자가 알림을 탭하거나 탭하여 앱을 다시 시작했는지 어떻게 알 수 있는가 앱 아이콘? 사용자가 알림을 탭한 경우 해당 알림에 언급 된 페이지가 열릴 것으로 예상됩니다. 그렇지 않으면 안됩니다.

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

감사.

편집하다:

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

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

(A) 1. 앱이 백그라운드로 이동합니다. 2. 통지 접수 3. 사용자가 알림을 탭합니다. 4. 앱이 포 그라운드로 들어감

(B) 1. 앱이 백그라운드로 이동합니다. 2. 통지 접수 3. 사용자가 알림을 무시하고 나중에 앱 아이콘을 탭합니다. 4. 앱이 포 그라운드로 들어감

이후로는 application:didReceiveRemoteNotification:2 단계에서 두 경우 모두에서 실행됩니다.

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



답변

OK 마침내 알아 냈습니다.

대상 설정에서 ➝ 기능 탭 ➝ 백그라운드 모드에서 “원격 알림”을 ​​선택 application:didReceiveRemoteNotification:하면 알림이 도착하는 즉시 (앱이 백그라운드에있는 한) 트리거되며,이 경우 알 수있는 방법이 없습니다. 사용자는 알림을 탭합니다.

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

이 체크 박스를 선택하면 앱 델리게이트 메서드 중 하나가 작동하는 방식이 변경된다는 것은 조금 이상합니다. 이 확인란을 선택하면 Apple은 알림 수신 및 알림 탭에 대해 두 가지 다른 위임 방법을 사용합니다. 대부분의 개발자는 알림이 탭되었는지 여부를 항상 알고 싶어합니다.

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

여기에 이미지 설명 입력


답변

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

사용자가 탭했는지, 앱이 백그라운드에 있는지 또는 활성화되었는지 확인하려면 다음에서 애플리케이션 상태를 확인하면됩니다.

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


답변

iOS / XCode 에 따르면
: 알림 또는 스프링 보드 앱 아이콘을 클릭하여 앱이 시작되었는지 확인하는 방법은 무엇입니까?
다음과 같이 didReceiveLocalNotification에서 애플리케이션 상태를 확인해야합니다.

if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive)
{
    // user has tapped notification
}
else
{
    // user opened app from app icon
}

나에게 완전히 이해가되지는 않지만 작동하는 것 같습니다.


답변

누군가가 신속한 3.0에서 원하는 경우

switch application.applicationState {
    case .active:
        //app is currently active, can update badges count here
        break
    case .inactive:
        //app is transitioning from background to foreground (user taps notification), do what you need when user taps here
        break
    case .background:
        //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
        break
    default:
        break
    }

신속한 4

switch UIApplication.shared.applicationState {
case .active:
    //app is currently active, can update badges count here
    break
case .inactive:
    //app is transitioning from background to foreground (user taps notification), do what you need when user taps here
    break
case .background:
    //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
    break
default:
    break
}


답변

“백그라운드 모드”> “원격 알림”이 선택되어있는 경우 == 예, 알림 이벤트를 탭하면 다음 위치에 도착합니다.

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

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


답변

나도이 문제에 부딪 혔지만 새로운 UserNotifications프레임 워크 가있는 iOS 11에서 .

여기에서는 다음과 같습니다.

  • 새로운 출시 : application:didFinishLaunchingWithOptions:
  • 종료 상태에서 수신 : application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
  • 포 그라운드에서 수신 :
    userNotificationCenter(_:willPresent:withCompletionHandler:)
  • 백그라운드에서 수신 : userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:

답변

제 경우에는 백그라운드 모드 OFF가 아무런 차이가 없었습니다. 그러나 앱이 일시 중지되고 사용자가 알림을 탭했을 때이 콜백 메서드에서 케이스를 처리 할 수 ​​있습니다.

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

}