Это интересный вопрос, поскольку он в основном касается проблемы наименования этой довольно сложной функции.
Короче говоря, я боюсь, что ответ отрицательный. Хотя мне самому не приходилось сталкиваться с этим, я был свидетелем многих других в том же положении, что и вы.
Мне помогает думать, что вся «функция тихого удаленного уведомления» имеет меньшее отношение к приложение находится на переднем плане или в фоновом режиме, и многое другое с «вводом удаленного приложения»:
Если оно активировано, т. е. у вас есть UIBackgroundRefreshStatusAvailable
, ваш сервер может отправлять ему, в этом случае, сообщения, в которых это реагирует. По сути, сервер вводит данные аналогично тому, как нажимает пользователь (хотя, очевидно, через другие вызываемые функции). Неважно, находится ли приложение на переднем плане или в фоновом режиме, этот ввод происходит .
Если функция неактивна, т.е. у вас есть UIBackgroundRefreshStatusDenied
или UIBackgroundRefreshStatusRestricted
, вся функция отключается . Это означает, что такой способ получения ввода не работает, application:didReceiveRemoteNotification:fetchCompletionHandler:
вообще не вызывается. По общему признанию, это имя метода отражает проблему лучше, чем случаи перечисления состояний.
Два обходных пути :
- Самый очевидный: регистр и отменить регистрацию для удаленных уведомлений в
applicationDidBecomeActive:
и applicationWillResignActive:
. К сожалению, это может стать уродливым, поскольку в результате на вашем сервере постоянно меняются токены для пользователей, но если вы хотите избежать получения уведомлений в фоновом режиме любой ценой, go таким образом. - Зарегистрируйтесь для получения уведомлений один раз и действительно пусть ваш logi c обрабатывает уведомления на переднем плане и , как вы (кажется) уже делаете, но просто сделайте так, чтобы он игнорировал уведомления, пока он находится в фоновом режиме (используя
UIApplication.shared.applicationState
). Технически это «тратит впустую» немного времени выполнения, так как ваше приложение может проснуться, а затем не сделать ничего значимого, но я думаю, что это не так уж плохо.
Я бы go с вариантом 2 сам так как я редко вижу случай, когда мне больно получать тихое уведомление в фоновом режиме.
Как правило, я бы не стал делать ничего, что полагается на включенные уведомления (фоновый или передний план). Другими словами: да, если мое приложение находится на переднем плане, и мне нужно отреагировать на что-то, происходящее на моем сервере, я боюсь, что мне нужно «проверить» указанный сервер, то есть получить от него в какой-то форме.
Или я бы, в зависимости от сценария, проинформировал пользователя, что они должны включить его, иначе приложение не будет иметь особого смысла ... Хм ...
В качестве примечания : Ага, Apple SDK немного сбивает с толку с именами и объяснением всех различных фоновых вещей и уведомлений. Даже само состояние приложения (активно, неактивно, фон, передний план, приостановлено, ...) сложнее, чем кажется по названиям. Я думаю, что причина тому исторический характер. До того, как у нас вообще появились фоновые режимы и уведомления, люди просто опрашивали данные, чтобы получить что-то вроде «тихих уведомлений переднего плана», то есть то, что вам нужно. В итоге они захотели иметь возможность делать это и тогда, когда приложение не было на переднем плане, громко запрашивая выполнение в фоновом режиме. Apple на самом деле не хотела предоставлять это без ограничений, поэтому постепенно развивалась концепция уведомлений, но поскольку это было связано, термин «фон» проник туда (кроме того, у нас также была фоновая выборка ...), даже если это не обязательно имеет смысл. Можно также возразить, что это все еще действует, потому что это более важно, когда приложение находится в фоновом режиме / приостановлено. Вариант использования «получить тихое уведомление только на переднем плане» все еще можно охватить простым опросом (хотя я согласен, что это некрасиво), а если вы используете pu sh, это не так больно , чтобы они тоже были в фоновом режиме.