iOS 11에서 자동 푸시가 앱에 전달되지 않음


168

iOS 11 베타 2에서 자동 알림이 application:didReceiveRemoteNotification:fetchCompletionHandler앱의 상태 (배경 / 전경)에 관계없이 전달되지 않는 것으로 나타났습니다 .

UIApplicationDelegete방법을 구현하고 application:didReceiveRemoteNotification:fetchCompletionHandler다음 자동 푸시를 보냅니다.

{  
  "aps": {  
    "content-available": 1  
  },  
  "mydata": {  
    "foo": "bar"  
  }  
} 

iOS 11에서는 delegate 메소드가 호출되지 않습니다.

그것은 다른 버전의 iOS에서 잘 작동하며 문서 섹션 자동 알림 구성은 다른 작업을 언급하지 않습니다.

iOS 11의 버그입니까, 아니면 iOS 11의 새로운 점이 누락 되었습니까?

나는 UserNotification자동 푸시를 보내는 데 필요하지 않은 프레임 워크 에 대해 이야기하거나 사용 하지 않습니다.

다음은 문제를 보여주는 샘플 프로젝트 입니다 (자신의 번들 ID를 설정해야합니다)

샘플 프로젝트를 점심 식사하고 위의 페이로드를 앱으로 보내면 macOS 콘솔을 사용하여 푸시가 장치에는 제대로 전달되지만 앱에는 제대로 전달되지 않는지 확인할 수 있습니다.

업데이트 10.08

동작이 임의 인 것으로 보입니다. 때로는 장치를 다시 시작한 후 페이로드가 올바르게 전달되지만 잠시 후 작동이 중지됩니다.

다음 스크린 샷에서 볼 수 있듯이 1로 표시된 푸시는 장치에만 전달되고 푸시 2 (장치를 다시 시작한 후)도 앱으로 전달됩니다.

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

업데이트 14.08-iOS 11 Beta 6

여전히 같은 행동입니다. 작동하지만 작동하지 않는 또 다른 것은 다음과 같습니다. 응용 프로그램 구성표가 "실행 파일 실행 대기"로 설정되어 있으면 자동 푸시는 응용 프로그램을 깨우고 백그라운드에서 시작해야합니다.

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

업데이트 21.08-iOS 11 베타 7

버그 리포트에서 여전히 Apple과 동일한 동작을하고 업데이트하지는 않습니다.

업데이트 29.08-iOS 11 베타 8

여전히 같은 문제입니다. 지금 사용하는 재현 단계는 다음과 같습니다.

  • Xcode 프로젝트 구성표에서 "실행 파일 실행 대기"를 선택하십시오.
  • 에 중단 점 추가 didReceiveRemoteNotification: fetchCompletionHandler
  • 기기에서 앱을 시작합니다
  • 위의 자동 푸시 보내기

예상 : 앱이 일시 중단 된 상태에서 백그라운드로 가져와 didReceiveRemoteNotification: fetchCompletionHandler호출 됨

실제 : 아무 일도 일어나지 않습니다

업데이트 06.09-iOS 11 베타 10

나는 여전히 같은 벌레 같은 행동을하고 있습니다. Apple의 티켓은 다음 답변으로 업데이트되었습니다.

Apple 개발자 관계 2017 년 9 월 6 일 오후 10시 42 분 엔지니어링은이 문제와 관련하여 다음과 같은 피드백을 제공했습니다.

샘플 앱을 실행하고 동작을 테스트 할 수있었습니다. 설명 된대로이를 테스트 할 때 아무런 문제도 발견되지 않았습니다.

푸시가 백그라운드에서 실행될 때 앱에 도달한다고 보장 할 수 없으며 여기에있는 로그는 앱이 앱을 실행하는 데 충분히 사용되고 있다고 생각하지 않음을 나타냅니다.

우리는 상황이 좋은 때에 때때로 푸시를 제공하는 것을 보았습니다.

우리는 이것이 올바르게 동작한다고 생각합니다.

11.09 업데이트

내 애플 버그 보고서의 중복으로 폐쇄 및 표시되었다 33278611되는 열려

업데이트 13.09-iOS 11 GM

kam800의 의견 (아래 참조) 덕분에 나는 더 많은 테스트를 수행했으며 그 관찰 결과를 얻었습니다.

iOS 11 dasd DuetActivitySchedulerDaemon에는 데이터 푸시를 완전히 삭제하거나 데이터 푸시 전송을 지연 시키는 새로운 데몬이있는 것 같습니다 .

배송이 연기 됨

콘솔 로그

default 13:11:47.177547 +0200   dasd    DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>!   lifecycle   com.apple.duetactivityscheduler
default 13:11:47.178186 +0200   dasd    DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private>   default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200   dasd    DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017   default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200   dasd    DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>)  scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200   dasd    DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private>  default com.apple.duetactivityscheduler

연기 된 배송 문제

  • 데이터 푸시 전송이 연기되고 앱이 시작되면 데이터 푸시는 배달 날짜에 도달 한 경우에만 전달 되며, 앞으로 몇 분이 걸릴 수 있습니다 . 이것은 데이터 푸시를 사용하여 새로운 앱의 콘텐츠를 다음 출시에 대비할 수 있도록하는 목적을 완전히 상실합니다. 나는 애플 문서를 다시 한 번 인용한다.

"자동 알림은 앱이 실행 중이 아닌 경우에도 앱을 최신 상태로 유지하여 사용자 환경을 개선합니다."

  • 데이터 푸시가 일시 중단 된 응용 프로그램으로 전송됩니다 그들은 아이폰 OS (11) 대신에 직접 응용 프로그램을 깨어으로 연기된다. 전달 시간에 도달 하면 마지막 데이터 푸시 만 전달됩니다! 이전 푸시는 손실되고 대리자 메소드를 통해 전달되지 않아 데이터가 손실됩니다.

배송 취소

콘솔 로그

default 13:35:05.347078 +0200   dasd    DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
 ], FinalDecision: Must Not Proceed}    scoring com.apple.duetactivityscheduler

취소 된 배송 문제

이 경우 데이터 푸시가 완전히 손실되고 iOS 11에서 제대로 전달되는 동안 iOS 11에서는 전달되지 않습니다.

업데이트 19.09-iOS 11 GM

또한 응용 프로그램이 포 그라운드에 있고 알림이 앱에 전달되지 않으면 콘솔에 다음 로그가 표시됩니다.

default 08:28:49.354824 +0200   apsd    apsd    <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO   courier-oversized   com.apple.apsd

fault   08:33:18.128209 +0200   dasd    Foundation  <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
    NSArray,
    NSData,
    NSString,
    NSNumber,
    NSDictionary,
    NSUUID,
    _DASActivity,
    NSSet,
    _DASFileProtection,
    NSDate,
    NWParameters,
    NWEndpoint
)}'.    general com.apple.foundation.xpc

1
콘솔을 볼 때 베타 8에서는 여전히 수정되지 않았습니다. <NSXPCConnection : 0x123f43620> pid 58에서 연결 : 수신 된 메시지를 디코딩하는 동안 예외가 발생하여 수신 메시지를 삭제합니다. 예외 : 인수 0 (호출의 # 2)을 디코딩하는 중 예외 : 예외 : 'NS.objects'키 값이 예기치 않은 클래스 'NSNull'이었습니다. 허용되는 클래스는 '{(NWParameters, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDictionary, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}'입니다.
Thomas Einwaller

2
iOS 11과 동일한 결과를 얻습니다 (이전이 아님). with을 사용하여 보내면 "content-available": 1앱이 포 그라운드에 있으면 콜백이 시작되지 않습니다.
GoRoS

4
새로운 iOS11.1 베타 1로 테스트 한 후 이것은 현재 수정되어 iOS 10에서 이전과 같이 작동하는 것으로 보입니다.
Lee

3
WHATSAPP 비슷한 문제 있었다 것 같다 whatsappen.com/news/5465/...의 대부분의 개발자는 "습관적으로 가까운 앱을 강제로"라는 사용자에 대한 뭔가 ...
toxaq

3
그리고 11.1의 공개 릴리스와 정확히 동일합니다. 자동 푸시를 사용하고 있고 앱이 포 그라운드에있는 경우 장치가 전원 공급 장치에 연결되어 있어도 몇 가지 사항에 따라 배터리 수준이 제공 될 것으로 예상하지 마십시오.
Gruntcakes

답변:


31

iOS 11.1 베타 1의 릴리스 노트는

iOS 11.1 베타 1이 막 출시되었으며 다음과 같이 언급합니다. "알림 해결 된 문제 • 자동 푸시 알림이 더 자주 처리됩니다. (33278611)

나는 몇 가지 테스트를했는데 실제로 고정 된 것 같습니다.

일시 중단 상태

일시 중단 모드에서 앱을 시작하고 자동 푸시를 보내면 앱이 백그라운드로 다시 돌아와 didReceiveRemoteNotification:fetchCompletionHandler대리인이 호출됩니다.

전경 상태

마찬가지로 응용 프로그램이 포 그라운드에 있고 자동 푸시가 전송되면 대리자가 예상대로 호출되는 것 같습니다. 이전 iOS 11 버전에서는 무작위로 작동 하지 않았 으므로 추가 테스트 후이를 확인하겠습니다.


3
초기 테스트에서 문제가 해결되었다고 생각했습니다. 그것은 한동안 일했다. 그러나 약간의 테스트를 거친 후 일이 시작되었습니다. 갑자기 앱이 포 그라운드에 있더라도 모든 자동 푸시에 대해 델리게이트 호출을 중단했습니다. 분명히이 새로운 "듀엣"시스템은 "energyBudget"가 없어서 앱의 델리게이트가 전화를 걸지 못하게 막고 있습니다. 불행히도 여전히 수정되지 않았습니다.
Abras

믿어지지 않는 :(
Thomas Einwaller

내 경험은 위의 Abras와 동일합니다. 잠시 동안 일한 뒤 헤어져서 처리기가 더 이상 불려지지 않았습니다. – 이거 짜증나
Lee

더 많은 테스트를 한 후 장치가 알림을 다시 받도록하는 방법을 찾을 수있었습니다. 전원을 연결하십시오. 장치를 전원에 연결하자마자 모든 원격 알림을 다시 수신하기 시작합니다. 연결을 끊으면 중지됩니다. 모든 테스트에서 앱이 포 그라운드에 있었기 때문에 의미가 없습니다. 포 그라운드 앱은 원격 알림을 수신 할 수 있습니다.
Abras

나를 위해 그것은 전원에 연결하지 않고 셀룰러 연결시에도 잘 작동합니다. 장치를 절전 모드로 설정 한 경우에만 전경에있을 때 푸시를 얻지 못합니다. 그러나 그것은 내가 이해 한 것입니다
Jan

18

내가이 문제에 부딪 혔을 때 여기에 2 센트를 추가하고 싶었고 Apple 이이 문제에 대해 여러 가지 레이더를 닫아서 재현 할 수 없다는 것을 알았습니다. 내가 찾은 흥미로운 점은 앱이 디버거에 연결되어있는 동안 백그라운드로 앱을 푸시하면 푸시가 전달된다는 것입니다.

디버거를 종료하고 전화기를 분리하고 앱을 시작한 다음 자동 푸시 페이로드를 보내면 앱이 깨어나지 않습니다. 콘솔 로그에서 시스템이 페이로드의 앱 전달을 취소한다는 것을 알았습니다.

문제를 재현하는 작은 샘플 앱으로 레이더를 제출했습니다. 또한 레이더에서 내 티켓을 작업하는 사람이 문제를 재현하기 위해 디버거에 연결된 앱을 실행해서는 안된다는 것을 명시 적으로 언급했습니다. 여기 링크가 있습니다 : https://bugreport.apple.com/web/?problemID=34461063

이 문제에 대한 진전이 있기를 바랍니다.


2
보고서 주셔서 감사합니다. Btw, Apple 버그 링크는 비공개이므로 여기에서는 도움이되지 않으며 리포터와 Apple 만 볼 수 있습니다
Jan

나는 더 많은 사람들이 사용보고 싶은 openradar.appspot.com을 우리가 다른 사람들 레이더 추적 유지할 수 있도록
토마스 에인 월러

Apple @bill 버그 업데이트에 대한 업데이트가 있습니까?
MagicFlow

Apple에서 내 레이더에 대한 업데이트를받지 못했지만 iOS 11.1의 베타 버전을 설치했으며 문제가 해결 된 것으로 보입니다.
Bill Dunay

예, iOS 11.2.6에서도 동일한 문제가 발생합니다. 어떤 솔루션이나 업데이트가 있습니까?
Gopik

14

iOS 11의 새로운 동작처럼 보입니다. iOS 11 베타 10은이 문제에 대한 설명 로그를 제공합니다.

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

모든 자동 푸시가 iOS로 전달되는 것처럼 보이지만 dasd 데몬은 몇 가지 정책을 사용하여 자동 푸시를 앱에 전달해야하는지 (예 : 배터리 수준) 결정합니다. 어제 밤에 자동 푸시를받을 수 있었지만 당시 iPhone은 충전기에 연결되어있었습니다. 아마도 BatteryLevelPolicy 점수가 자동 푸시를 받기에 충분히 높을 것입니다.

Apple은이 iOS 측 동작에 대한 공식 정보를 제공하지 않으며 서버 측 스로틀 링에 대한 정보 만 있습니다.

자동 알림은 백그라운드에서 앱을 깨우는 방법이 아니며 우선 순위가 높은 업데이트를위한 것도 아닙니다. APN은 자동 알림을 우선 순위가 낮은 것으로 취급하며 총 수가 너무 많아지면 배달을 제한 할 수 있습니다. 실제 제한은 동적이며 조건에 따라 변경 될 수 있지만 시간당 몇 가지 알림을 보내지 마십시오.

나는 내 손가락을 엇갈리게 유지하면서 그 행동을 바꿨습니다. 왜냐하면 그것이 내 앱을 고칠 수 있기 때문입니다.) 반면에,이 변경은 좋은 일입니다.


1
예, 푸시는 기기에는 전달되지만 앱에는 전달되지 않습니다. 그게 내가 원래 게시물에 쓴 것입니다. "자동 알림은 백그라운드에서 앱을 깨울 수있는 방법이 아닙니다"이것은 "때때로"제공되는 한 괜찮습니다. 큰 문제는 자동 알림이 백그라운드에있을 때 iOS 11의 앱에 자동 알림이 전달 되지 않는다는 것입니다. 이것은 데이터 푸시의 전체 목적을 완전히 상실합니다.
Jan

예, 당신은 이미 이러한 새로운 푸시 정책에 관한 완전한 설명을 제공하고 싶었습니다. 나는 Apple 문서를 인용하여 이미 푸시 배달 불확실성에 대해 경고했다는 것을 보여주었습니다. 내가 쓴 것처럼 : "나는 어제 밤에 자동 푸시를받을 수있었습니다."(내가 의미하는 앱에서) 앱은 백그라운드에있었습니다. 그러나 당일 – 내 앱에는 푸시가 없습니다. 베타 버전 (예 : 10.3 키 체인 자동 삭제)
kam800

푸시가 수신되고 앱이 일시 중지되면 비슷한 로그가 표시됩니다. dasd 프로세스는 기록합니다 default 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017. 당시에는 자동 푸시가 전달 된 것 같습니다.
Jan

이미 iOS 11 GM으로 테스트를 시작했지만 여전히 이상한 행동을 com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
봅니다.

1
또한-일부 스텁 알림과 함께 무음 푸시를 전송하고 Notification Service Extension을 사용하여 올바른 콘텐츠로 알림을 작성하여 앱을 해결했습니다.
kam800

9

iOS 11.1 베타 릴리스 노트에는 다음이 포함됩니다. 알림 해결 된 문제 자동 푸시 알림이 더 자주 처리됩니다. (33278611)


7

iOS 11.1 베타 2도 포함

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

릴리즈 노트-지금 테스트 해 보겠습니다.

업데이트-11.10.2017-iOS 11.1 베타 2

"실제 시나리오"에서 2 일 동안 앱을 사용한 후에는이 버전의 iOS에서 실제로 개선 된 것으로 보입니다. 나는 이것이 고정되어 있다고 믿기 시작했다.


1
다른 시나리오를 테스트했습니다. 전경 및 배경 상태에서 작동했습니다. 불행히도 사용자가 앱을 종료 한 경우 작동하지 않습니다. 사용자가 앱을 다시 시작하지 않는 한 기기를 종료 한 후 자동 푸시가 수신되지 않습니다. 당신도 같은 경험을 했습니까?
AlexWoe89

이제 작동합니다 ... '다운 타임'약 후. 5 ~ 10 분 동안 자동 알림이 정상적으로 작동합니다. 이전에 죄송합니다. comment :)
AlexWoe89

1
사용자가 앱을 종료 할 때 자동 푸시가 작동 하지 않습니다. developer.apple.com/documentation/uikit/uiapplicationdelegate/…를 참조하십시오. 그러나 "사용자가 강제 종료 한 경우 시스템은 자동으로 앱을 시작하지 않습니다."
Thomas Einwaller

1
나는 iOS11.1 베타 3이 iOS10과 매우 비슷하게 작동하고 iOS11.1 베타 2보다 훨씬 잘 작동하는 것을보고 있습니다.
Lee

1
@Olecramoak for me iOS11.1 베타 4는 iOS 10처럼 작동합니다.
AlexWoe89

7

Apple Developer Relations은 방금 내 레이더에 주석을 추가했습니다.

우리는이 문제가 최신 iOS 11.2 베타에서 해결되었다고 생각합니다.

최신 iOS 베타 버전으로 테스트하십시오. 여전히 문제가있는 경우 조사에 도움이 될만한 관련 로그 나 정보로 버그 보고서를 업데이트하십시오.

https://developer.apple.com/download/

현재 iOS 11.2 베타 설치 중-자동 푸시 동작 테스트


이것이 iOS 11.1 GM이 문제를 해결하지 못한다는 것을 의미합니까? :(
Olecramoak

실제로 iOS11.1의 공식 출시를 언제쯤 기대할 수 있습니까?
AlexWoe89

11.2에 대한 Xcode가 없으므로 현재 앱을 설치할 수 없습니다. (그리고 기기에서 앱을 제거했습니다)
Rool Paap

3

iOS 10까지 푸시 알림이 수신되고 application:didReceiveRemoteNotification:fetchCompletionHandler올바르게 호출 되는 내 앱과 비슷한 문제가 있었지만 iOS 11로 업데이트하면 푸시 알림이 작동하지 않았습니다.

푸시 알림 페이로드에서 content-available : 1 및 mutable-content : 1을 사용하고 있지만 백그라운드 코드 옵션이 켜지지 않았습니다. 그러나 iOS 10까지 완벽하게 작동했습니다.

이 두 기능을 모두 켜십시오.

백그라운드 페치 기능을 켜면 작동합니다.


아니요 iOS11에서는 작동하지 않습니다. 앱을 한 번만 종료하면 앱 깨우기가 중지됩니다. 이 주제에 대한 답변과 의견을 읽으십시오
AlexWoe89

2
종료 된 앱의 경우 푸시 알림 (무음 또는 일반 푸시)은 앱 델리게이트에서 델리게이트 메소드를 실행하지 않습니다. 이것이 기본 동작입니다. iOS 11.0에는 특별한 경우가 없습니다.
Sudeep george

3

iOS 11.4.1, 스위프트 4

CloudKit에서 자동 푸시가 도착하지 않는 문제가 있었고 여기에서 언급 한 모든 것을 시도했습니다. 그런 다음 다음 과 같이 객체에 공백 alertBody을 설정하려고 CKNotificationInfo()했습니다.

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

이로 인해 푸시가 더 높은 우선 순위로 전송되었지만 여전히 조용한 푸시였습니다. 더 이상 푸시가 무시되고 있다는 내 장치 로그에 오류가 표시되지 않습니다.

누군가에게 도움이되기를 바랍니다. :)


CloudKit에서도 작동합니다. alertBody가 없으면 remoteNotifications를 얻기 위해 장치를 연결해야합니다. 매우 이상한 행동 ...
powertoold

2

따라서 이것은 실제로 iOS 11의 버그이며 이제 iOS 11 베타 3에서 수정되었습니다. application:didReceiveRemoteNotification:fetchCompletionHandler . 포 그라운드 또는 백그라운드에서 자동 푸시가 수신 될 때 올바르게 호출됩니다.

최신 정보

아니요 수정되지 않았으며 iOS 베타 3 및 4에서 여전히 발생합니다.


1
실제로 그것은 아닙니다 :( iOS 11 베타 3에서 여전히 일어나고 있습니다.
Jan

1
애플도 버그 보고서를 다시 열었다. 알려 드리겠습니다
Jan

1
iOS 11 베타 4에서는 자동 푸시가 수신되지 않습니다. 더 자세히 말하면 앱이 포 그라운드에 있지 않은 경우 때때로 일반 알림으로 표시됩니다. 확실히 뭔가!
벤 도슨

1
방금 iOS 11 베타 5를 설치했으며 앱이 didReceiveRemoteNotification 대리자를 통해 포 그라운드 또는 백그라운드에있을 때 자동 알림이 더 잘 보이고 자동 알림이 전달됩니다. 같은 행동?
Jan

1
테스트하면 두통이 생길 것입니다. 자동 푸시는 장치를 다시 시작한 후 무작위로 작동하거나 작동하지 않습니다. 원본 프로젝트를 샘플 프로젝트로 업데이트하여 모두 동일하게 사용
Jan

2

해결 방법으로 "알림"키와 "제목"안에 빈 문자열을 값으로 추가합니다. appDelegate에서 didReceive 콜백을 깨 웁니다.


1
이것은 애플이 버그를 수정할 때까지 DuetActivitySchedulerDaemon이 알림을 통해 앱을 깨울 수 있도록하는 해결 방법뿐만 아니라 저에게도 효과가있는 것처럼 보였습니다.
조 벤톤

빈 제목이 포함 된 JSON을 푸시해도 여전히 콘솔에 "경고, 소리 또는 배지없이 알림 무시 중 ..."{ "aps": { "alert": { "title": ""}, "content-available": "1"}, "gcm.message_id": "0 ... bb"}이 JSON 구조가 적합합니까?
Olecramoak

따옴표없이 1 (사용 가능한 컨텐츠의 값)을 보내지 않아야합니까?
elkorb

이것이 Google Firebase가 Json (“1”)을 포맷하는 방식이며 항상 작동합니다. dasd 말도 안되는 iOS 11 만 문제를 일으키고 있습니다. 당신을 위해 일하는 Json의 예를 게시 해 주시겠습니까?
Olecramoak

따라서 iOS 11.1에서 관찰 한 것은 장치가 배터리에서 실행 중 (충전 아님)이고 저 에너지 모드가 활성화되지 않은 경우에도 배터리 잔량이 20 % 미만인 경우 자동 푸시가 전달되지 않는다는 것입니다. 이것은 나쁘다. iOS 11의 자동 푸시는 전혀 신뢰할 수 없으며 거의 ​​쓸모가 없습니다.
Olecramoak

1

이 답변을 쓰는 ​​현재 Bill Dunay의 답변 과 똑같은 문제에 직면하고 있습니다.

내 요구 사항은 앱이 포 그라운드에있을 때 자동 알림을 수신하고 앱이 백그라운드에 있거나 실행 중이 지 않을 때는 아무것도받지 않는 것입니다. 그리고 내 해결 방법은 이것입니다. 배지를 사용하지 않으므로 0으로 설정해도 문제가되지 않습니다.

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

고의로 "콘텐츠 사용 가능"을 사용하고 있지 않습니다. iOS 최적화 로직이 알림 전달을 지연 / 취소하도록 설정하는 설정입니다.


1

일부 알림에 대해 동일한 문제가 발생했습니다 (반드시 침묵하지는 않습니다).

모든 업데이트와 답변을 검토 한 후 도움이 될 두 가지 업데이트를 추가 할 수 있습니다.

  • UIApplication.shared.isRegisteredForRemoteNotifications알림을받는 동안 메서드 에 액세스 하면 Xcode에 아무것도보고하지 않고 응용 프로그램이 중단됩니다. 메소드에 액세스하는 알림을받은 후 일부 코드를 실행 중인지 확인하십시오. ( semaphore_wait_trap을 사용하여 isRegisteredForRemoteNotifications 잠금 UI ).

    • "title-loc-args" : [3333]3333을 문자 그대로 받아들이지 않고 문자열로 받아 들여서 콘솔에 푸시 알림 파싱 오류가 있음을 발견했습니다 "title-loc-args" : ["3333"]. 위의 방법에 액세스 한 후 iOS 11에서만 전체 인터페이스가 중단되었습니다 .iOS 12에서만 작동합니다.
  • 또한 동일한 코드로 iOS 12.0 (16A5366a) 에서 아무런 문제없이 작동 한다는 것을 알았습니다 . 그러나 iOS 11에서는 발생합니다.


1

필자의 경우 자동 알림은 서버 사이트에서 작업이 완료된 후 UI를 업데이트하는 데 사용되었으므로 앱에 관련이없는 콘텐츠가있는 것은 고통 스럽습니다. 자동 알림에 대한 페이로드에는 제목과 본문이 포함되어 있기 때문에 충전 / 사용하지 않고 백그라운드 앱 새로 고침이 꺼져 있고 저전력 상태에서도 작동 / 비활성 응용 프로그램에서 작동 알림을 받기 위해 이러한 방법을 구현합니다.

이 작업을 수행하기 위해 올바른 페이로드로 매번 트리거되는 UNUserNotificationCenterDelegate프로토콜 및 willPresent notification(iOS 10+) 방법으로 대리자를 추가하고 확장을 만듭니다 . 앱이 활성화되었을 때 알림을 표시하지 않으려면 배지 또는 사운드로 완료를 호출하십시오. 나는 이런 식으로 끝났다

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

그리고 앱이 백그라운드에 있고 자동 알림이 내 메소드를 호출하지 않을 때 이러한 상태를 작동 시키려면 알림 센터에서 직접 알림을받습니다 applicationDidBecomeActive.

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

제 경우에는 "Background App Refresh"가 iPhone 설정에서 꺼져있었습니다. 이 푸시 알림으로 인해 장치에는 전달되었지만 앱에는 전달되지 않았습니다. 백그라운드 앱 새로 고침을 켜면 앱에서 자동 푸시가 수신됩니다.

누군가가 확인 해야하는 경우를 대비 하여이 질문에 대한 실제 답변이 아닐 수도 있습니다.

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