iOS 11의 앱에 자동 푸시가 제공되지 않음
2에서 11로 전달되지 않는다는 것을 알게 되었습니다.application:didReceiveRemoteNotification:fetchCompletionHandler앱의 상태(배경/포그라운드)에 관계없이 사용할 수 있습니다.
는 다을구습다니를 했습니다.UIApplicationDelegete 법application:didReceiveRemoteNotification:fetchCompletionHandler그리고 나는 다음과 같은 무언의 푸시를 보냅니다.
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
그러나 iOS 11에서는 대리자 메소드가 호출되지 않습니다.
다른 버전의 iOS에서는 정상적으로 작동하며 설명서 섹션에서는 다른 작업을 수행해야 한다고 언급하지 않습니다.
이것은 iOS 11의 버그입니까, 아니면 제가 iOS 11의 새로운 것을 놓쳤습니까?
제가 말하는 것도 아니고 사용하는 것도 아닙니다.UserNotification무음 푸시 전송에 필요하지 않은 프레임워크.
다음은 문제를 설명하는 샘플 프로젝트입니다(사용자가 직접 번들 ID를 설정해야 함).
샘플 프로젝트를 런치하고 앱에 위 페이로드를 보낼 때 macOS 콘솔을 사용하여 푸시가 장치에 올바르게 전달되지만 앱에는 전달되지 않음을 확인할 수 있습니다.
업데이트 10.08
동작이 무작위인 것 같습니다.장치를 다시 시작한 후 페이로드가 올바르게 전달되지만 시간이 지나면 작동이 중지되는 경우가 있습니다.
다음 스크린샷에서 볼 수 있듯이 1로 표시된 푸시는 단말기에만 전달되고 푸시 2(단말기 재시작 후)도 앱에 전달됩니다.
업데이트 14.08 - iOS 11 베타 6
여전히 같은 행동입니다.작동해야 하지만 작동하지 않는 또 다른 것은 다음과 같습니다.응용 프로그램의 구성이 "실행 파일이 시작될 때까지 대기"로 설정되면 자동 푸시는 응용 프로그램을 실행하고 백그라운드에서 시작합니다.
업데이트 21.08 - iOS 11 베타 7
여전히 동일한 동작이며 버그 보고서에서 Apple의 업데이트가 아닙니다.
업데이트 29.08 - iOS 11 베타 8
여전히 같은 문제입니다.제가 지금 사용하는 복제 단계는 다음과 같습니다.
- Xcode 프로젝트 구성표에서 "실행 파일이 시작될 때까지 대기"를 선택합니다.
- 에
didReceiveRemoteNotification: fetchCompletionHandler - 장치에서 앱 시작
- 위의 자동 푸시 전송
예상:앱이 일시 중단 상태에서 백그라운드로 전환되고,didReceiveRemoteNotification: fetchCompletionHandler를 라고 합니다.
실제: 아무 일도 일어나지 않습니다.
업데이트 06.09 - iOS 11 베타 10
저는 여전히 같은 벌레 같은 행동을 하고 있습니다.Apple의 티켓이 다음과 같은 답변으로 업데이트되었습니다.
Apple Developer Relations 2017년 9월 6일 오후 10시 42분 엔지니어링 팀에서 이 문제와 관련하여 다음과 같은 피드백을 제공했습니다.
우리는 샘플 앱을 실행하고 동작을 테스트할 수 있었습니다.설명한 대로 테스트했을 때는 문제가 없었습니다.
푸시가 백그라운드에서 실행될 때 앱에 도달하는 것이 보장되지 않으며, 여기 로그는 앱이 실행될 만큼 충분히 사용되고 있지 않다고 생각함을 나타냅니다.
우리는 상황이 좋을 때 가끔 우리가 추진력을 전달하는 것을 봅니다.
우리는 이것이 올바르게 작동하고 있다고 믿습니다.
업데이트 11.09
내 Apple 버그 보고서가 닫혔고 복제로 표시되었습니다.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
지연된 배송 문제
- 데이터 푸시 전달이 연기되고 앱이 실행되면 향후 몇 분이 될 수 있는 배송 날짜에 도달해야만 데이터 푸시가 전달됩니다.이는 데이터 푸시를 사용하여 새 앱의 콘텐츠를 다음 출시를 위해 준비해야 하는 목적을 완전히 좌절시킵니다.Apple의 문서를 다시 한 번 인용합니다.
"자동 알림 기능은 앱이 실행되지 않는 경우에도 앱을 최신 상태로 유지할 수 있도록 지원하여 사용자 환경을 개선합니다."
- 일시 중단된 앱에 두 번의 데이터 푸시가 전송되면 앱을 직접 깨우는 대신 iOS 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 10에서는 올바르게 전송되지 않습니다.
업데이트 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센트를 추가하고 싶었습니다. 그리고 애플이 이 문제에 대해 몇 개의 레이더를 재생산할 수 없다고 폐쇄했다는 것을 알게 되었습니다.흥미로운 사실은 앱이 디버거에 연결되어 있는 동안 백그라운드에서 실행되면 푸시가 전달된다는 것입니다.
내가 디버거를 죽이고, 내 전화기의 플러그를 뽑고, 앱을 실행하고, 자동 푸시 페이로드를 보내면 앱이 깨지지 않습니다.콘솔 로그에서 시스템이 내 앱으로 페이로드 전송을 취소하는 것을 확인합니다.
저는 그 문제를 재현하는 작은 샘플 앱이 있는 레이더를 제출했습니다.저는 또한 레이더에서 제 티켓을 작업하는 사람이 문제를 재현하기 위해 디버거에 연결된 앱을 실행하지 않아야 한다고 명시적으로 언급했습니다.링크는 다음과 같습니다. 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 데몬은 앱에 자동 푸시가 전달되어야 하는지 여부(예: 배터리 수준)를 결정하기 위해 몇 가지 정책을 사용합니다.어젯밤에 한 번의 무음 푸시를 받을 수 있었지만, 그때 아이폰이 충전기에 연결되어 있었습니다. 아마도 배터리일 것입니다.레벨 정책 점수가 자동 푸시 한 번을 받을 수 있을 정도로 높았습니다.
Apple은 iOS 측 동작에 대한 공식적인 정보를 제공하지 않으며, 서버 측 조절에 대한 정보만 제공합니다.
자동 알림은 앱을 백그라운드에서 절전 모드로 유지하기 위한 것이 아니며, 우선 순위가 높은 업데이트를 위한 것도 아닙니다. APN은 자동 알림을 낮은 우선 순위로 처리하고 총 수가 초과되면 전송을 완전히 제한할 수 있습니다.실제 제한은 동적이며 조건에 따라 변경될 수 있지만 시간당 몇 개 이상의 알림을 보내지 않도록 합니다.
저는 행운을 빌어요. 그들이 그 행동을 바꿨습니다. 왜냐하면 그것은 제 앱을 고칠 것이기 때문입니다. :) 반면에, 이 변화는 좋은 것입니다. 아이폰 배터리가 안드로이드 폰보다 더 오래 지속되도록 만드는 많은 것 중 하나입니다.
iOS 11.1 베타 릴리스 노트는 다음과 같습니다.알림 해결 문제 자동 푸시 알림이 더 자주 처리됩니다. (33278611)
iOS 11.1 베타 2는 또한 다음을 포함합니다.
Notifications
Resolved Issues
• Silent push notifications are processed more frequently. (33278611)
릴리스 정보 - 지금 테스트합니다.
업데이트 - 2017.10.11 - iOS 11.1 베타 2
"실제 시나리오"에서 이틀 동안 앱을 사용한 결과, 이 iOS 버전이 실제로 개선된 것으로 보입니다.나는 이것이 고쳐졌다고 조심스럽게 믿기 시작했습니다.
Apple Developer Relations는 방금 제 레이더에 코멘트를 추가했습니다.
우리는 이 문제가 최신 iOS 11.2 베타에서 해결되었다고 생각합니다.
최신 iOS 베타 버전으로 테스트 부탁드립니다.여전히 문제가 있는 경우, 버그 보고서를 조사하는 데 도움이 될 수 있는 관련 로그 또는 정보로 업데이트하십시오.
현재 iOS 11.2 베타 설치 중 - 자동 푸시 동작을 테스트합니다.
나는 iOS 10이 푸시 알림을 받기 전까지 내 앱에 비슷한 문제가 있었습니다.application:didReceiveRemoteNotification:fetchCompletionHandler정확하게 호출되고 있었습니다.그러나 iOS 11로 업데이트되었을 때 푸시 알림이 작동하지 않습니다.
내 코드의 문제는 푸시 알림 페이로드에서 content-available:1 및 mutable-content:1을 사용하고 있음에도 불구하고 Background Fetch 옵션이 켜지지 않았다는 것입니다.하지만 iOS 10까지는 완벽하게 작동했습니다.
백그라운드 가져오기 기능을 켠 후 지금 작동합니다.
iOS 11.4.1, Swift 4
(CloudKit에서) 사일런트 푸시가 도착하지 않아 문제가 발생하여 모두가 여기서 언급한 모든 것을 시도했습니다.그리고 나서 저는 빈칸을 설정하기로 결정했습니다.alertBody나에게CKNotificationInfo()다음과 같은 개체:
let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""
이로 인해 푸시가 더 높은 우선순위로 전송되었으며(그러나 여전히 자동 푸시임) 장치 로그에서 푸시가 무시되고 있다는 오류를 더 이상 확인할 수 없었습니다.
그게 누군가에게 도움이 되길 바랍니다.:)
이것은 실제로 iOS 11의 버그이며 현재 iOS 11 베타 3에서 수정되었습니다.그application:didReceiveRemoteNotification:fetchCompletionHandler이제 포그라운드 또는 백그라운드에서 자동 푸시가 수신될 때 올바르게 호출됩니다.
갱신하다
아니요, 그것은 고정되지 않았고 iOS 베타 3과 4에서 여전히 발생하고 있습니다.
해결 방법으로 "알림" 키를 추가하고 빈 문자열을 값으로 하는 "제목" 안에 추가합니다.이것은 appDelegate에서 didReceive 콜백을 깨웁니다.
이 답변을 작성하는 시점에서 저는 빌 더니의 답변과 정확히 같은 문제에 직면해 있습니다.
제 요구 사항은 앱이 포그라운드에 있고 앱이 백그라운드에 있거나 실행되고 있지 않을 때 아무 것도 없을 때 자동 알림을 받는 것이었습니다.저의 해결책은 이것이었습니다.저는 배지를 사용하지 않기 때문에 0으로 설정하는 것은 문제가 되지 않습니다.
{
"aps" : {
"badge" : 0,
"sound" : ""
},
"mydata": {
"foo": "bar"
}
}
의도적으로 "content-available"을 사용하지 않습니다.iOS 최적화 로직이 알림 전달을 지연/취소하도록 하는 설정입니다.
일부 알림에 대해 동일한 문제가 발생했습니다(반드시 침묵할 필요는 없음).
모든 업데이트와 답변을 검토한 후 다음과 같은 도움이 될 수 있는 두 가지 업데이트를 추가할 수 있습니다.
에 액세스할 때
UIApplication.shared.isRegisteredForRemoteNotifications알림을 수신하는 동안 메서드는 Xcode에 아무것도 보고하지 않고 응용 프로그램을 중지시킵니다.메서드에 액세스하는 알림을 받은 후 일부 코드를 실행 중인지 확인합니다.(isRegisteredForRemoteNotifications는 semapore_wait_trap을 사용하여 UI를 잠급니다.)- 다음으로 인해 콘솔에서 푸시 알림 구문 분석 오류가 발생했습니다.
"title-loc-args" : [3333]3333을 문자 그대로 받아들이는 것이 아니라 문자열로 받아들이는 것."title-loc-args" : ["3333"]이것은 제가 위의 방법에 접속한 후에 제 전체 인터페이스를 정지시켰는데, iOS 11에서만 작동하고, iOS 12에서 작동합니다.
- 다음으로 인해 콘솔에서 푸시 알림 구문 분석 오류가 발생했습니다.
또한 iOS 12.0(16A5366a)에서도 동일한 코드로 문제없이 작동한다는 것을 알게 되었습니다.하지만 iOS 11에서는 이런 일이 일어나고 있습니다.
나의 경우 서버 사이트에서 작업이 완료된 후 ui를 업데이트하기 위해 사일런트 알림을 사용했기 때문에 앱에 관련이 없는 콘텐츠가 있는 것은 매우 괴로웠습니다.무음 알림 페이로드에는 제목과 본문이 짝수로 포함되어 있기 때문에 충전이 아닌 활성/비활성 앱에서 작동 알림을 받기 위해 이러한 방법을 구현하고 백그라운드 앱 새로 고침이 꺼지고 저전력 상태에서도 작동합니다.
하고 이작을수려대면추리를다가만확사다듭니장을여용하음을고하업으로 을 만듭니다.UNUserNotificationCenterDelegate 및 전과willPresent notification 10 (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)
}
}
}
무음 있을 때 을 받습니다. 그앱 리 백 그 려 작 면 하 동 호 를 마 지 하 십 시 오 출 드 메 서 내 상 를 태 한 이 고 이 러 때 있 알 을 림 자 동 라 이 있 운 고 드 에 ▁directly ▁is ▁and ▁when ▁app ification ▁center ▁states ▁silent ▁from ifications 그 ification ▁not 오 ▁not리 알림 센터에서 직접 알림을 받습니다.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`
}
})
}
}
제 경우 아이폰 설정에서 "백그라운드 앱 새로 고침"이 해제되었습니다.이 때문에 푸시 알림이 단말기에 전달되었지만 앱에는 전달되지 않았습니다.백그라운드 앱 새로 고침을 설정하면 앱에서 자동 푸시가 수신됩니다.
만약 누군가 확인이 필요하다면, 이것은 이 질문에 대한 실제 답이 아닐 수도 있습니다.
언급URL : https://stackoverflow.com/questions/44796613/silent-pushes-not-delivered-to-the-app-on-ios-11
'itsource' 카테고리의 다른 글
| git-diff 및 git 로그가 새 파일 및 삭제된 파일을 무시하도록 만드는 방법은 무엇입니까? (0) | 2023.07.06 |
|---|---|
| 가장 간단한 RGB 이미지 형식은 무엇입니까? (0) | 2023.07.01 |
| SQL 서버에서 쿼리의 텍스트를 연결하려면 어떻게 해야 합니까? (0) | 2023.07.01 |
| 숫자 열거형을 사용하여 유형 스크립트 '기록 <> (0) | 2023.07.01 |
| "경로를 업데이트하는 동시에 분기로 전환할 수 없음" (0) | 2023.07.01 |


