development

performFetchWithCompletionHandler가 실행되지 않습니다.

big-blog 2020. 12. 27. 20:38
반응형

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. The timing of when the OS performs background fetch is dictated by poorly documented rules that may change in the future. But the relevant factors include:

    • Whether the device is connected to power and/or is sufficiently charged;

    • Whether connected to WiFi or not;

    • How often the user actually fires up the app;

    • Whether the device is doing other network related tasks (e.g. whether background fetch can be coalesced with other network operations);

    • How frequently past background fetch requests resulted in there being data available.


    In my experience, after the app is run the first time, if connected to wifi and power, if you wake the device about 5 minutes later, the app will perform background fetch. This isn't a hard and fast rule, but just what we've experienced in the past.

    But many new developers post on Stack Overflow with questions like "how can I have app request data ever x minutes (or hours)", "how can I request data every day at 2 am time", etc. The short answer is that you can't. The OS decides the timing of background at its own discretion. You cannot control this (other than the minimum request interval; but you cannot control the maximum interval, as the OS controls that).

  9. This may seem obvious to many, but make sure you've got a reliable way of knowing whether background fetch process is running correctly or not. User Notifications framework can be used to present some alert so you know if the background request resulted in something. Alternatively, os_log "Unified Notifications" can be used to post messages on device that can be monitored on macOS Console app. But more than once, I've seen users do something like waiting for message to show up in Xcode or waiting for UIAlertController. You need some mechanism that works when not connected to Xcode and when the app never enters foreground.


(It only works if I simulate the fetch with "XCode->Debug->Simulate Background Fetch".)

It's because you're in Debug mode. Please try launch app without XCode.


Using your device you can fire application:performFetchWithCompletionHandler with the following steps:

  • Put your app in the Background state
  • Lock your device and wait 5 minutes.
  • Unlock your device, this will fire the method

Another thing to check is your plist file. Make sure the UIApplicationExitsOnSuspend key is not present.

Many people here on Stack Overflow have recommended using that setting as a way to force your app to start fresh each time it's launched. That does work, but the side effect is that it prevents the new iOS 7 background fetch feature from being triggered.


If application: performFetchWithCompletionHandler: never gets fired (unless you simulate it using Xcode), check also if "Background App Refresh" preference is "On" for your app. (Settings app -> General -> Background App Refresh)


Also, background fetch is disabled if the iPhone is in Low Power Mode.


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

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

반응형