Подтвердить что ты не робот

Тихие push-уведомления предоставляются только в том случае, если устройство заряжается и/или приложение находится на переднем плане

Я внедрил молчание push-уведомлений, но я заметил какое-то странное поведение. Бесшумные push-уведомления обрабатываются через:

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

Тихие push-сообщения, по-видимому, принимаются только в том случае, если устройство заряжается (т.е. подключен кабель) и/или если мое приложение находится на переднем плане.

Если я отсоединяю устройство от зарядного устройства (или Mac), то тихие push-уведомления больше не принимаются, если приложение не находится на переднем плане.

В обоих случаях я получаю не-молчащие push-уведомления.

Если я снова подключу USB-кабель, я получаю ожидаемое поведение, а молчащие push-уведомления получаются независимо от того, является ли приложение передним или фоновым.

Я использую UILocalNotification, поэтому я знаю, что получает.

Тот факт, что все работает отлично с подключенным устройством, говорит о том, что мои тихие нажатия уведомлений настроены правильно и что приложение имеет правильные фоновые режимы, установленные в plist и т.д.

Это поведение повторяется на iPhone 5s, 6 и iPad 2, работающих либо на IOS 8, либо на 8.1.

Кто-нибудь еще испытал это? Это должно быть легко воспроизвести. Почему простой способ подключения устройства к зарядному устройству меняет способность получать бесшумные push-уведомления?

4b9b3361

Ответ 1

Мы испытали такое же поведение и пытаемся понять, почему iOS решает предоставить некоторые уведомления, а не другие.

То, что мы разработали до сих пор:

  • Сообщения получаются более надежно в фоновом режиме, если на Wi-Fi тогда на сотовые данные. Фактически, если в сотовой сети (3g/4g), если уровень сигнала недостаточно, iOS получает push-сообщение, но не пробуждает ваше приложение. Мы размещаем на форумах Apple об этом здесь: https://devforums.apple.com/message/1069814#1069814. Мы также открыли билет поддержки, и команда поддержки сообщила нам, чтобы он подал его в виде отчета об ошибке, который мы сделали пару недель назад, и все еще ожидаем услышать ответ.

  • Когда вы получаете push-сообщение, вам нужно как можно скорее вызвать fetchCompletionHandler. Технически у вас есть 30 секунд для выполнения фоновой обработки, но у iOS есть формула, в которой тем чаще вы отправляете push-сообщения и в зависимости от количества времени, которое вы тратите на обработку этого сообщения, прежде чем вернуть приложение в приостановленное состояние, iOS может уменьшить сумму раз ваше приложение проснется в будущем.

См. здесь Apple didReceiveRemoteNotification: fetchCompletionHandler: документация:

Как только вы закончите обработку уведомления, вы должны позвонить блок в параметре обработчика или ваше приложение будет прекращено. Ваш приложение имеет до 30 секунд времени настенных часов для обработки уведомление и вызов указанного блока обработчика завершения. В практике, вы должны вызвать блок обработчика, как только вы закончите обрабатывая уведомление. Система отслеживает прошедшее время, мощность использования и затрат на данные для загрузки фонограмм приложений. Приложения, которые использовать значительную мощность при обработке push-уведомлений не всегда можно разбудить рано для обработки будущих уведомлений.

В нашем тестировании мы отправляем частые молчащие push-уведомления в наше приложение (каждые 10-30 секунд). И приложение пробуждается около 3 секунд, прежде чем мы вернем его спать. Мы определенно заметили со временем ухудшение частоты, в которой наше приложение пробуждается до такой степени, что iOS будет только разбудить приложение каждые 15 - 30 минут. Таким образом, на самом деле существует какая-то формула распада/дросселирования, но мы не можем найти никакой документации о том, как она работает. Мы запросили эту формулу и переменные из apple в качестве запроса поддержки, но они сказали: "Запрошенная вами информация не является общедоступной" и снова попросила нас предоставить отчет об ошибке.

Итак, надеюсь, это полезно? Мы все еще пытаемся узнать больше о себе, поэтому я нашел этот вопрос:)

Ответ 2

С изменением фоновой загрузки iOS8 в приложениях. В некоторых случаях фоновое нажатие будет доставлено только в приложение. Apple не прямо заявила, каковы эти обстоятельства, но из моих обширных экспериментов в основном сводится к тому, что телефон заряжается или нет. В игре есть и другие переменные (например, тип сети, тип устройства, поддержка Wi-Fi), но основным основным фактором является то, заряжается ли устройство или нет, когда наступает нажатие.

Если телефон заряжается через прямой источник электропитания или опосредованно подключается через USB к компьютеру, то фоновые нажатия будут доставлены в приложение подавляющее большинство времени. Но отключите телефон от источника питания или USB, и фоновая кнопка почти никогда не будет доставлена ​​в приложение, даже если батарея телефона имеет 100% -ный заряд.

Вы можете легко протестировать это для себя, просто отправив несколько нажатий, пока телефон заряжается, пока его нет. НО вы должны принять во внимание, что фоновые шаги с помощью сборки разработки и использования среды песочницы. Не ведите себя так же, как фоновые шаги с производственной сборкой и производственной средой, фоновые нажатия, скорее всего, будут доставляться в приложение в процессе разработки то они находятся в производстве, поэтому очень важно, чтобы вы тестировали с использованием производственной сборки и производственной среды Apple, чтобы увидеть фактические результаты.

Обратите внимание, что есть два шага доставки push, во-первых, он должен быть доставлен на самом телефоне, второй - когда он у него есть, тогда ему нужно доставить ОС в приложение. В iOS7 такие вещи, как turing на Wifi, сделали шансы на то, что толчок приближается к телефону. Однако с iOS8, хотя нажатие успешно доставляется на телефон, ОС не пересылает его в фоновое приложение, если телефон не заряжается. Это означает, что телефон получает уведомление и держится за него, иногда в течение нескольких часов, прежде чем он сможет перенаправить его в приложение, если телефон не заряжается.

Ответ 3

У меня возникла одна и та же проблема, и причина, по которой не получает push-уведомление, когда приложение не заряжается, заключается в том, что когда режим Low Power включен с Settings > Battery, он отключает функцию background-fetch для всех приложений.

Что мешает устройству получать push-уведомления.

Эта ссылка может быть полезна. Документация Apple

Ответ 4

Я также заметил то же самое и потратил немного времени на выяснение. См. fooobar.com/questions/110741/...

Если вы отключили приложение Bg App Refresh, тихое дистанционное нажатие будет тихо отбрасываться (ирония).

Тем не менее, мое наблюдение заключается в том, что если вы подключаетесь к Xcode по кабелю, как-то параметр Bg App Refresh игнорируется, и все тихие нажатия для вашего приложения работают.

Я очень подозреваю, что это недокументированная функция: зарядка заставляет игнорировать параметр обновления Bg App.

Ответ 5

Это не работает, потому что вы включили неправильный фоновый режим в plist. Вам нужно включить тег remote-notification (приложение загружает контент в ответ на push-уведомления), а не извлекать. Fetch используется для чего-то другого. Возможно, вам также понадобится использовать доступный контент в вашей полезной нагрузке JSON, например,

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

Ответ 6

Надеюсь, вы используете APNS приоритет доставки "CONSERVE_POWER" (5), попробуйте изменить его как "IMMEDIATE" (10)

Ответ 7

Я уже некоторое время испытываю эту проблему, и очень благодарен за этот вопрос, а @Kevin D. делится своим пониманием. Я начинаю думать, что fooobar.com/questions/110740/... и https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 (см. priority в одной из таблиц) описывают, почему у моего приложения возникают проблемы:

Ошибка использования этого приоритета для нажатия, содержащего только клавишу content-available.

Чтобы отправить уведомления, я использую node-apn, где по умолчанию (который мне также нужен), чтобы установить приоритет max (10 [будьте осторожны, это похоже, что только 10 и 5 являются правильными значениями в это время]), но так как я хотел получить молчаливое уведомление, у меня нет alert, badge или sound.

Ответ 8

Если ваше приложение не поддерживает VoIP, вы не сможете выполнить этот ответ [ваше приложение будет отклонено]

Я нашел другое решение, которое работает для меня, используя PushKit Framework

Push-сигналы VoIP предоставляют дополнительную функциональность в дополнение к стандартному push-запросу, который необходим приложениям VoIP для выполнения обработки push-уведомлений перед отображением уведомления для пользователя

Когда я отправляю VOIP Push, приложение просыпается независимо от состояния приложения и может выполнять любые операции

.Зарегистрироваться для Push-уведомления VOIP в didFinishLaunchingWithOptions

 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

enter image description here