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

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



답변

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

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

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

일시 중단 상태

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

전경 상태

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


답변

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

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

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

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


답변

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은 자동 알림을 우선 순위가 낮은 것으로 취급하며 총 수가 너무 많아지면 배달을 제한 할 수 있습니다. 실제 제한은 동적이며 조건에 따라 변경 될 수 있지만 시간당 몇 가지 알림을 보내지 마십시오.

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


답변

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


답변

iOS 11.1 베타 2도 포함

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

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

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

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


답변

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

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

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

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

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


답변

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

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

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

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