performFetchWithCompletionHandler никогда не увольняется
1) моя конфигурация plist для обеспечения backgroundmode:
<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? Должен ли я радар это?
9 ответов:
Я боюсь, что это трудно отладить на устройстве, потому что вы не гарантируете, что он вызывается в указанное вами время.
setMinimumBackgroundFetchIntervalозначает, что он не вызывается в интервале, который меньше указанного вами значения. Но там нетsetMaximumBackgroundFetchInterval. Поэтому, если iOS решит позвонить вашему приложению только один раз в день или даже только один раз в неделю, чем он не будет вызываться чаще, независимо от вашегоminimumBackgroundFetchInterval. Насколько мне известно, в iOS решает, когда звонитьperformFetchWithCompletionHandlerизмеряемый образец, когда и как часто пользователи запускают приложение.
в режиме отладки Xcode 5 Вы можете принудительно выполнить фоновую выборку из меню: Debug > Simulate Background Fetch.
С помощью вашего устройства вы можете стрелять
application:performFetchWithCompletionHandlerследующим образом:
- поместите приложение в фоновом режиме
- заблокировать устройство и подождите 5 минут.
- разблокировать устройство, это метод
(это работает только если я имитирую выборку с помощью "XCode - > Debug - >Simulate Фоновая Выборка".)
это потому, что вы находитесь в режиме отладки. Пожалуйста, попробуйте запустить приложение без XCode.
есть много соображений:
убедитесь, что функция фоновой выборки была установлена в plist.
убедитесь, что функция фоновой выборки не была отключена для этого конкретного приложения или вообще в приложении настроек устройства.
убедитесь, что установлен минимальный интервал.
убедитесь, что вы изящно покинуть приложение (например, просто нажмите кнопку home и запустите другое приложение и/или просто заблокировать устройство). Но если вы убьете приложение (дважды нажав на кнопку "Домой" и проводя вверх, или что у вас есть), это помешает ОС предложить вашему приложению возможность запускать последующие запросы на фоновую выборку (по крайней мере, до тех пор, пока пользователь не запустит приложение снова).
убедитесь, что вы тестируете это на физическом устройстве и не запускаете приложение через отладчик Xcode. Присоединение к отладчику изменяет поведение фона оперативный.
убедитесь, что приложение на самом деле делает некоторые сетевые запросы. Если у вас есть приложение, которое вообще не выполняет сетевых запросов, оно не будет участвовать в фоновой выборке. Если вы делаете, например, небольшое тестовое приложение с "фоновой выборкой" и не выдаете никаких сетевых запросов, вы не будете участвовать в фоновой выборке.
аналогично, если ОС запускает ваше приложение в фоновом режиме, чтобы он мог выполнять фоновую выборку, если вы на самом деле не выполняете сетевой запрос, ОС может перестать предлагать вашему приложению возможность выполнять фоновые выборки в будущем.
обязательно вызовите обработчик завершения и сделайте это в течение отведенного времени, иначе ваше приложение может не участвовать в фоновой выборке в будущем.
время, когда ОС выполняет фоновую выборку, диктуется плохо документированными правилами, которые могут измениться в будущем. Но соответствующие факторы включают в себя:
подключено ли устройство к источнику питания и / или достаточно заряжено;
подключен ли к Wi-Fi или нет;
как часто пользователь запускает приложение;
выполняет ли устройство другие задачи, связанные с сетью (например, может ли фоновая выборка быть объединена с другими сетевыми операциями);
как часто мимо фона выборки запросы привели к тому, что данные были доступны.
по моему опыту, после того, как приложение запускается в первый раз, при подключении к Wi-Fi и мощности, если вы разбудите устройство примерно через 5 минут, приложение выполнит фоновую выборку. Это не жесткое правило, но только то, что мы испытали в прошлом.но многие новые разработчики публикуют на Stack Overflow с такими вопросами, как " как я могу получить данные запроса приложения когда-либо x минут (или часов)", "как я могу запрашивать данные каждый день в 2 часа ночи" и др. Короткий ответ заключается в том, что вы не можете. ОС решает время фона по своему усмотрению. Вы не можете управлять этим (кроме минимального интервала запроса; но вы не можете управлять максимальным интервалом, поскольку ОС управляет этим).
это может показаться очевидным для многих, но убедитесь, что у вас есть надежный способ узнать, работает ли процесс фоновой выборки правильно или нет. Уведомления Пользователей фреймворк может быть использован для представления некоторых предупреждений, так что вы знаете, если фоновый запрос привел к чему-то. Кроме того,
os_log"унифицированные уведомления" можно использовать для отправки сообщений на устройстве, которое можно отслеживать на macOSConsoleприложение. Но не раз я видел, как пользователи делают что-то вроде ожидания появления сообщения в Xcode или ожиданияUIAlertController. Вам нужен какой-то механизм, который работает, когда он не подключен к Xcode и когда приложение никогда не выходит на передний план.
еще одна вещь, чтобы проверить это ваш . Убедитесь, что
UIApplicationExitsOnSuspendключа нет.многие люди здесь, в Stack Overflow, рекомендовали использовать этот параметр как способ заставить ваше приложение начинать новый каждый раз, когда оно запускается. Это действительно работает, но побочный эффект заключается в том, что он предотвращает запуск новой функции фоновой выборки iOS 7.
Если
application: performFetchWithCompletionHandler:никогда не запускается (если вы не имитируете его с помощью Xcode), проверьте также, если "фоновое обновление приложения" предпочтительно "включено" для вашего приложения. (Настройки приложения - > общие - > фоновое обновление приложения)
Apple предоставляет алгоритм, который определяет, как часто фоновая выборка должна запускаться, на основе вашего собственного использования приложения. Если вы используете его много, то он будет получать как можно чаще, но если вы используете, как в 4 часа дня каждый день, фоновая выборка должна запускаться непосредственно перед этим, поэтому ваши данные обновляются при запуске. Обратитесь к этому ссылке

Comments