programing

기기가 충전 중이거나 앱이 포 그라운드 인 경우에만 무음 푸시 알림이 전달됩니다.

projobs 2021. 1. 15. 07:30
반응형

기기가 충전 중이거나 앱이 포 그라운드 인 경우에만 무음 푸시 알림이 전달됩니다.


자동 푸시 알림을 구현했지만 이상한 동작을 발견했습니다. 자동 푸시 알림은 다음을 통해 처리됩니다.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

무음 푸시 메시지는 장치가 충전 중이거나 (예 : 케이블 연결됨) 내 앱이 포 그라운드 인 경우에만 수신되는 것 같습니다.

충전기 (또는 Mac)에서 장치를 분리 하면 앱이 포 그라운드 상태가 아니면 더 이상 무음 푸시 알림이 수신 되지 않습니다 .

두 경우 모두 일반적으로 무음 푸시 알림을받습니다.

USB 케이블을 다시 연결하면 앱이 포 그라운드인지 백그라운드인지에 관계없이 예상되는 동작과 무음 푸시 알림이 수신됩니다.

UILocalNotification을 사용하고 있으므로 수신되는 내용을 알고 있습니다.

연결된 장치에서 모두 잘 작동한다는 사실은 내 무음 푸시 알림이 올바르게 구성되어 있고 앱에 plist 등에 올바른 배경 모드가 설정되어 있음을 나타냅니다.

이 동작은 모두 IOS 8 또는 8.1을 실행하는 iPhone 5s, 6 및 iPad 2에서 반복됩니다.

다른 사람이 이것을 경험 한 적이 있습니까? 재현하기 쉬워야합니다. 장치를 충전기에 꽂는 간단한 동작이 자동 푸시 알림 수신 기능을 변경해야하는 이유는 무엇입니까?


우리는 동일한 행동을 경험했으며 iOS가 다른 알림이 아닌 일부 알림을 전달하기로 결정한 이유를 이해하려고 노력해 왔습니다.

지금까지 우리가 알아 낸 것은 :

  • Wi-Fi에서 셀룰러 데이터를 사용하면 백그라운드에서 메시지가 더 안정적으로 수신됩니다. 실제로 셀룰러 네트워크 (3g / 4g)에서 신호 강도가 충분히 강하지 않은 경우 iOS는 푸시 메시지를 수신하지만 앱을 깨우지 않습니다. Apple 포럼에 https://devforums.apple.com/message/1069814#1069814 에 게시했습니다 . 우리는 또한 지원 티켓을 열었고 지원 팀은이를 버그 보고서로 제출하라고했는데, 우리는 몇 주 전에 수행했으며 여전히 답변을 기다리고 있습니다.

  • 푸시 메시지를 받으면 가능한 한 빨리 fetchCompletionHandler를 호출해야합니다. 기술적으로는 백그라운드 처리를 수행하는 데 30 초가 걸리지 만 iOS에는 푸시 메시지를 더 자주 보낼수록 앱을 일시 중지 상태로 되돌리기 전에 해당 메시지를 처리하는 데 소비하는 시간에 따라 iOS가 그 양을 줄일 수있는 공식이 있습니다. 앞으로 앱이 깨어나는 경우가 많습니다.

Apple didReceiveRemoteNotification : fetchCompletionHandler : 문서 에서 여기를 참조하십시오 .

알림 처리를 완료하자마자 handler 매개 변수에서 블록을 호출해야합니다. 그렇지 않으면 앱이 종료됩니다. 앱은 알림을 처리하고 지정된 완료 핸들러 블록을 호출하는 데 최대 30 초의 벽시계 시간이 있습니다. 실제로 알림 처리를 완료하자마자 핸들러 블록을 호출해야합니다. 시스템은 앱의 백그라운드 다운로드에 대한 경과 시간, 전력 사용량 및 데이터 비용을 추적합니다. 푸시 알림을 처리 할 때 상당한 양의 전력을 사용하는 앱은 향후 알림을 처리하기 위해 항상 일찍 깨어나는 것은 아닙니다.

테스트에서 우리는 앱에 잦은 자동 푸시 알림을 전송했습니다 (10-30 초마다). 그리고 앱은 다시 잠들기 전에 약 3 초 동안 깨어 있습니다. 시간이 지남에 따라 앱이 깨어나는 빈도가 iOS가 15 ~ 30 분마다 깨어나는 지점까지 저하된다는 사실을 확실히 알아 차 렸습니다. 따라서 일종의 감쇄 / 조절 공식이있는 것처럼 보이지만 정확히 어떻게 작동하는지에 대한 문서를 찾을 수 없습니다. 지원 요청으로이 공식과 변수를 Apple에 요청했지만 "요청하는 정보는 공개적으로 사용할 수 없습니다"라고 말하고 다시 버그 보고서를 제출하도록 요청했습니다.

이게 도움이 되길 바랍니다. 우리는 여전히 더 많은 것을 배우려고 노력하고 있으며 이것이 내가이 질문을 찾은 이유입니다. :)


iOS8에서 앱에 대한 백그라운드 푸시 전달이 변경되었습니다. 백그라운드 푸시는 이제 특정 상황에서만 앱에 전달됩니다. Apple은 이러한 상황이 정확히 무엇인지 명시 적으로 밝히지 않았지만 광범위한 실험을 통해 기본적으로 전화가 충전되고 있는지 여부가 결정됩니다. 다른 변수 (예 : 네트워크 유형, 장치 유형, Wi-Fi 활성화)가 있지만 주요 주요 요인은 푸시가 도착했을 때 장치가 충전되고 있는지 여부입니다.

전화가 직접 주전원 공급 장치를 통해 충전되거나 USB로 컴퓨터에 연결되어 간접적으로 충전되는 경우 백그라운드 푸시가 대부분의 시간 동안 앱에 전달됩니다. 그러나 전원 공급 장치 또는 USB에서 휴대폰을 분리하면 휴대폰 배터리가 100 % 충전되어 있어도 백그라운드 푸시가 앱에 거의 전달되지 않습니다.

전화가 충전되는 동안과 그렇지 않은 동안에 약간의 푸시를 보내는 것만으로 이것을 매우 쉽게 테스트 할 수 있습니다. 그러나 개발 빌드 및 샌드 박스 환경을 사용하는 백그라운드 푸시는 프로덕션 빌드 및 프로덕션 환경의 백그라운드 푸시와 동일하게 작동하지 않는다는 점을 고려해야합니다. 백그라운드 푸시는 실제로 개발중인 앱에 전달 될 가능성이 더 높습니다. 그런 다음 실제 결과를 보려면 프로덕션 빌드와 Apple의 프로덕션 환경을 사용하여 테스트하는 것이 중요합니다.

푸시 전달에는 두 단계가 있습니다. 첫 번째 단계는 휴대 전화 자체로 전달되어야하고, 두 번째 단계는 휴대 전화에 수신 된 후 OS에서 앱으로 전달해야한다는 것입니다. iOS7에서는 Wi-Fi에서의 튜링과 같은 것들이 전화를받을 가능성을 높였습니다. 그러나 iOS8에서는 푸시가 휴대폰으로 성공적으로 전달되지만 휴대폰이 충전되지 않으면 OS가 백그라운드 앱으로 푸시를 전달하지 않습니다. 즉, 휴대 전화가 알림을 받고 알림을 유지하며, 휴대 전화가 충전되지 않는 경우 앱으로 전달되기 전에 때로는 몇 시간 동안 유지됩니다.


나는 같은 문제를 경험했고 앱이 충전되지 않는 동안 푸시 알림을받지 못한 이유는 저전력 모드가 활성화 Settings > Battery되면 background-fetch모든 응용 프로그램의 기능을 비활성화 하기 때문입니다.

장치가 푸시 알림을 수신하지 못하도록합니다.

이 링크가 유용 할 수 있습니다. Apple 문서


나는 또한 똑같은 것을 알아 차리고 시간을 낭비했습니다. 참조 https://stackoverflow.com/a/31237889/1724763를

Bg App Refresh를 끄면 자동 원격 푸시가 자동으로 삭제됩니다 (아이러니).

그러나 내 관찰은 케이블을 통해 Xcode에 연결하면 어떻게 든 Bg App Refresh 설정이 무시되고 앱에 대한 모든 자동 푸시가 작동한다는 것입니다.

이것이 문서화되지 않은 기능이라고 생각합니다. 충전하면 Bg 앱 새로 고침 설정이 무시됩니다.


plist에서 잘못된 백그라운드 모드를 활성화했기 때문에 작동하지 않습니다. remote-notification가져 오기가 아닌 태그 (앱이 푸시 알림에 대한 응답으로 콘텐츠를 다운로드 함) 를 활성화해야합니다 . Fetch는 다른 용도로 사용됩니다. JSON 페이로드에서 사용 가능한 콘텐츠 키를 사용해야 할 수도 있습니다. 예 :

{
   "aps": {
      "content-available": 1
    },
    "yourdatakey":{data}
}

우선 순위를 제공하는 APNS 를 사용하시기 바랍니다. 다음과 같이 "CONSERVE_POWER" (5)변경해보십시오."IMMEDIATE" (10)


나는이 문제를 한동안 경험해 왔으며이 질문과 @Kevin D.의 이해에 대해 매우 감사드립니다. https://stackoverflow.com/a/30834566/1449799https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#/ 생각하기 시작했습니다. / apple_ref / doc / uid / TP40008194-CH101-SW4 ( priority표 중 하나 참조 )는 내 앱에 문제가있는 이유를 설명합니다.

content-available키만 포함 된 푸시에이 우선 순위를 사용하는 것은 오류 입니다.

, 내가 사용 알림을 보내려면 노드 APN (기본값은 (나는 또한 필요로하는) 최대에 우선 순위를 설정하는 것입니다 10[그것은 단지처럼 보이는, 조심을 10하고 5있습니다 정확한 값을이 시간에),하지만 난 원부터 침묵 통지, 내가이없는 alert, badge또는 sound세트.


앱이 VoIP가 아닌 경우이 답변을 따를 수 없습니다. [앱이 거부됩니다.]

PushKit Framework를 사용하여 저에게 적합한 다른 솔루션을 찾았습니다.

VoIP 푸시는 사용자에게 알림을 표시하기 전에 푸시의 주문형 처리를 수행하기 위해 VoIP 앱에 필요한 표준 푸시 외에 추가 기능을 제공합니다.

VOIP Push를 보내면 앱이 애플리케이션의 상태에 관계없이 깨어나 모든 작업을 수행 할 수 있습니다.

didFinishLaunchingWithOptions에서 VOIP PushNotification에 등록

 PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];


- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
if([credentials.token length] == 0) {
    NSLog(@"voip token NULL");
    return;
}

NSString *originalToken=[NSString stringWithFormat:@"%@",credentials.token];
NSString *token = [originalToken stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"PushCredentials: %@",token);}

그런 다음 VOIP PushNotification을 받으면이 함수에서 모든 백그라운드 가져 오기를 처리 할 수 ​​있습니다.

-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type

참고 : VoIP 서비스 인증서를 활성화하는 인증서를 사용해야합니다.

여기에 이미지 설명 입력

참조 URL : https://stackoverflow.com/questions/26959472/silent-push-notifications-only-delivered-if-device-is-charging-and-or-app-is-for

반응형