UFO ET IT

performFetchWithCompletionHandler가 실행되지 않습니다.

ufoet 2020. 12. 26. 15:47
반응형

performFetchWithCompletionHandler가 실행되지 않습니다.


1) 배경 모드를 제공하는 내 plist 구성 :

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
</array> 

2) didFinishLaunchingWithOptions나는 :

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:1.0];

3) UIApplicationDelegate대리인 에게 프로토콜 선언했습니다 .

4) 다음 방법을 구현했지만 해고되지 않습니다. ( "XCode-> Debug-> Simulate Background Fetch"로 가져 오기를 시뮬레이션하는 경우에만 작동합니다.)

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

왜? DP5 베타 오류입니까? 이것을 레이더해야합니까?


지정한 시간 내에 호출된다는 보장이 없기 때문에 디바이스에서 디버그하기가 어렵습니다.

setMinimumBackgroundFetchInterval지정한 값보다 작은 간격으로 호출되지 않음을 의미합니다. 하지만 setMaximumBackgroundFetchInterval. 따라서 iOS가 앱을 하루에 한 번 또는 일주일에 한 번만 호출하기로 결정하면 minimumBackgroundFetchInterval. AFAIK iOS는 performFetchWithCompletionHandler사용자가 앱을 시작하는시기와 빈도를 패턴으로 측정 하여 호출 할시기를 결정 합니다.


Xcode 5 디버그 모드에서는 디버그> 배경 가져 오기 시뮬레이션 메뉴에서 배경 가져 오기를 강제 실행할 수 있습니다.

주름 옷깃!


다음과 같은 많은 고려 사항이 있습니다.

  1. 백그라운드 페치 기능이 plist에 설정되어 있는지 확인하십시오.

  2. 이 특정 앱 또는 일반적으로 기기의 설정 앱에서 백그라운드 가져 오기 기능이 비활성화되지 않았는지 확인합니다.

  3. 최소 가져 오기 간격을 설정해야합니다.

  4. 정상적으로 앱을 종료해야합니다 (예 : 홈 버튼을 누르고 다른 앱을 실행하거나 기기를 잠그십시오). 그러나 앱을 종료하면 (홈 버튼을 두 번 탭하고 위로 스 와이프하거나 무엇을 가지고 있는지) OS가 후속 백그라운드 가져 오기 요청을 실행할 기회를 제공하지 못하게됩니다 (적어도 사용자가 앱을 다시 실행할 때까지). ).

  5. 물리적 장치에서 테스트하고 Xcode 디버거를 통해 앱을 실행하지 않는지 확인하십시오. 디버거에 연결되면 백그라운드 작업의 동작이 변경됩니다.

  6. 앱이 실제로 일부 네트워크 요청을 수행하고 있는지 확인하십시오. 네트워크 요청을 전혀 수행하지 않는 앱이있는 경우 백그라운드 가져 오기에 참여하지 않습니다. 예를 들어 "백그라운드 가져 오기"가있는 작은 테스트 앱을 수행하고 네트워크 요청을 발행하지 않으면 백그라운드 가져 오기에 참여하지 않습니다.

    마찬가지로 OS가 백그라운드 모드에서 앱을 시작하여 백그라운드 가져 오기를 수행하는 경우 실제로 네트워크 요청을 수행하지 않으면 OS가 향후 백그라운드 가져 오기를 수행하는 기능을 앱에 제공하지 않을 수 있습니다.

  7. 완료 핸들러를 호출하고 할당 된 시간 내에 호출해야합니다. 그렇지 않으면 앱이 향후 백그라운드 가져 오기에 참여하지 않을 수 있습니다.

  8. OS가 백그라운드 가져 오기를 수행하는시기는 나중에 변경 될 수있는 잘못 문서화 된 규칙에 의해 결정됩니다. 그러나 관련 요소는 다음과 같습니다.

    • 장치가 전원에 연결되어 있는지 및 / 또는 충분히 충전되었는지 여부

    • WiFi 연결 여부;

    • 사용자가 실제로 앱을 실행하는 빈도

    • 장치가 다른 네트워크 관련 작업을 수행하고 있는지 여부 (예 : 백그라운드 가져 오기를 다른 네트워크 작업과 통합 할 수 있는지 여부)

    • 과거 백그라운드 가져 오기 요청으로 인해 사용 가능한 데이터가 생성 된 빈도입니다.


    내 경험상 앱을 처음 실행 한 후 Wi-Fi와 전원에 연결되어 있으면 약 5 분 후에 기기를 깨우면 앱이 백그라운드 가져 오기를 수행합니다. 이것은 어렵고 빠른 규칙이 아니라 우리가 과거에 경험 한 것입니다.

    그러나 많은 새로운 개발자가 Stack Overflow에 "어떻게 x 분 (또는 몇 시간) 에 걸쳐 앱 요청 데이터 를받을 수 있습니까?", "매일 오전 2시에 데이터를 요청하는 방법" 등과 같은 질문을 게시합니다 . 짧은 대답은 캔트. OS는 자체 재량에 따라 백그라운드 타이밍을 결정합니다. 최소 요청 간격 외에는이를 제어 할 수 없지만 OS가 제어하므로 최대 간격은 제어 할 수 없습니다.

  9. 이것은 많은 사람들에게 명백해 보일 수 있지만 백그라운드 가져 오기 프로세스가 올바르게 실행되고 있는지 여부를 알 수있는 신뢰할 수있는 방법이 있는지 확인하십시오. 사용자 알림 프레임 워크를 사용하여 일부 경고를 표시 할 수 있으므로 백그라운드 요청으로 인해 발생했는지 알 수 있습니다. 또는 os_log"통합 알림"을 ​​사용하여 macOS Console앱에서 모니터링 할 수있는 장치에 메시지를 게시 할 수 있습니다 . 하지만 한 번 이상 사용자가 Xcode에 메시지가 표시 될 때까지 기다리거나 UIAlertController. Xcode에 연결되어 있지 않고 앱이 포 그라운드로 들어 가지 않을 때 작동하는 메커니즘이 필요합니다.


( "XCode-> Debug-> Simulate Background Fetch"로 가져 오기를 시뮬레이션하는 경우에만 작동합니다.)

디버그 모드에 있기 때문입니다. XCode없이 앱을 실행 해보세요.


장치를 사용하여 application:performFetchWithCompletionHandler다음 단계에 따라 실행할 수 있습니다 .

  • 앱을 백그라운드 상태로 전환
  • 장치를 잠그고 5 분 동안 기다립니다.
  • 장치를 잠금 해제하면 메서드가 실행됩니다.

확인해야 할 또 다른 사항은 plist파일입니다. UIApplicationExitsOnSuspend키가 없는지 확인하십시오 .

Stack Overflow의 많은 사람들은 앱이 시작될 때마다 새로 시작하도록 강제하는 방법으로이 설정을 사용하도록 권장했습니다. 작동하지만 부작용은 새로운 iOS 7 백그라운드 가져 오기 기능이 트리거되지 않는다는 것입니다.


실행 application: performFetchWithCompletionHandler:되지 않는 경우 (Xcode를 사용하여 시뮬레이션하지 않는 한) 앱에 대해 "Background App Refresh"환경 설정이 "On"인지 확인하십시오. (설정 앱-> 일반-> 백그라운드 앱 새로 고침)


또한 iPhone이 저전력 모드 인 경우 백그라운드 가져 오기가 비활성화됩니다.


Apple은 앱 사용에 따라 백그라운드 가져 오기가 트리거되는 빈도를 정의하는 알고리즘을 제공합니다. 많이 사용하면 가능한 한 자주 가져 오지만 매일 오후 4시에 사용하면 백그라운드 가져 오기가 바로 전에 트리거되므로 데이터가 실행될 때 업데이트됩니다. 링크 참조

참조 URL : https://stackoverflow.com/questions/18315771/performfetchwithcompletionhandler-never-gets-fired

반응형