이 주제와 관련된 많은 스택 오버플로 스레드가 있지만 여전히 좋은 해결책을 찾지 못했습니다.
앱이 배경에 없으면, 내가 확인하실 수 있습니다 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
}
자세한 정보 확인 :
답변
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) {
}