Поведение setKeepAliveTimeout iOS: превышено 15 пробуждений за 300 сек.

Я пишу приложение VOIP для iOS 5 и пытаюсь понять, как фактическое общение может оставаться в живых в фоновом режиме.

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

превысил 15 пробуждений за 300 секунд

Чего я действительно не понимаю, так это того, как сокет должен иметь возможность постоянно отправлять и получать данные через него (для нужд VOIP), если существует ограничение на объем данных, которые он может получить за определенное время?

Допустим, сокет получает голосовые данные для голосового разговора, который происходит в фоновом режиме. Разве голосовые данные не должны проходить через сокетное соединение? Если да, то как это может работать, если существует ограничение на активность сокета за определенное время?


person zumzum    schedule 05.01.2012    source источник


Ответы (2)


VOIP app behavior at background (iOS 4.0+):

  • Having a single socket that remains open, flagged as Voip
  • This VOIP socket is maintained by the system, while app suspended at BG
  • You may schedule a keep-alive block, and the OS will wake your app every X time
  • X >= 10min (See [[UIApplication sharedApplication] setKeepAliveTimeout: handler:)
  • this socket is NOT the media socket, it uses only to receive invitations for incoming calls
  • App wake up on every incoming data on the socket (iOS 5.0+ limit is 15 times in 300 seconds)
  • Once you've received an incoming call, your app will wake up, and you may open an Audio Session for this call.

    Приложения VOIP должны быть помечены в info.plist в разделе «Необходимые фоновые режимы» как «voip» и «аудио».

    После открытия аудиосеанса (для активного звонка) ваше приложение может полностью работать в фоновом режиме и больше не будет приостановлено до тех пор, пока этот аудиосеанс не будет закрыт.

    В любом случае, другая альтернатива — использовать Push-уведомления в качестве триггеров для входящих вызовов.
    Кроме того, это избавит вас от необходимости поддерживать розетку в режиме 24/7, сэкономит заряд батареи
    и будет работать, даже если пользователь закрыл приложение (чего нельзя сказать о первом варианте).

    person avishic    schedule 14.03.2012

  • Какая версия IOS, устройство, которое вы используете?

    Это известная «функция»/проблема, представленная Apple в IOS5 для уменьшения расхода заряда батареи приложениями Voip...

    person Michael    schedule 01.02.2012
    comment
    Не могли бы вы добавить ссылку на это? - person Johan Karlsson; 06.02.2012
    comment
    Это также вызвало у меня множество проблем с iOS 5. Были ли какие-либо разговоры о разрешении этой проблемы или предоставлении обходного пути/предложенной реализации для тех пользователей, у которых есть веские причины быть активными? - person MobileVet; 15.02.2012
    comment
    Пожалуйста, добавьте больше информации. У нас сейчас тоже проблемы с этим. - person IBG; 01.03.2012