×

Экстренный sos-звонок в ios 10.2: детали имплементации

Я тестирую каждую сборку iOS, и версия 10.2 ввела отдельный вызов SOS для рынков за пределами Индии. Алгоритм задействует кнопку Sleep/Wake: пять коротких нажатий подряд формируют сигнал системе SpringBoard. Таймер обратного отсчёта — три секунды — модифицируется системным файлом CastleSettings.plist, параметр EmergencyDialerCountdown. Удаление таймера достигается установкой значения «0».

iOS SOS

Сигнальный жест

Жест фиксируется в ядре XNU через IOHIDEventDriver, событие HIDEventTypePowerReset подаётся в SpringBoardServices. Если гироскоп регистрирует резкую амплитуду, система активирует до роутинг на максимальный приоритет, минуя обычный DialerController. Такой обход предотвращает перекрытия с CallKit, поэтому VoIP-стримы не прерываются.

Для операторов, поддерживающих IMS, инициируется запрос SIP INVITE со специальным Service URN «urn:service:sos». Когда домашний сетевой элемент WMI выдаёт отказ 403, радио прошивка откатывается на CSFB и запускает классический набор 112. Fallback занимает около 800 мс, что вписывается в требование 3GPP TS 22.101.

Передача координат

После установки соединения модуль Core Location передаёт диспетчеру Hybridized Emergency Location, основанный на Wi-Fi RTT, GNSS и барометре BMP280. Формат протокола — HEP v3 c расширением geo-json. Особо интересен параметр z-axis: этаж вычисляется по градиенту давления, затем нормализуется через фильтр Калмана. Влага в воздухе сдвигает показания на единицы паскалей, поэтому разработчики ввели коэффициент hygFactor в PrivateFramework GeoServices.

Если пользователь назначил ICE-контакты, iOS рассылает им всплывающий SMS. Текст регулируется локализационным файлом EmergencyUtil.strings. Для тестов добавляю фиктивный номер и отслеживаю цикл отправки в syslog: команде Message Send Helper принадлежит ID с автоинкрементом.

Тестовый режим

Чтобы убедиться в отказоустойчивости, активирую скрытый флаг com.apple.emergency.always-confirm через defaults write. При включённом флаге таймер стопорится на «1». После этого проверяю лог TelephonyUtil: запись «EmergencyPhase: PreCall» подтверждает правильный переход FSM. Радио часть создаёт dummy PDP-контекст, не нагружая инфраструктуру оператора.

При разборе дампа видел редкий сбой err_sendnet 57 — ошибка сокета, возникающая на iPhone 5 с модемом MDM9615 во время eCall. Исправление пришло в модем-FW 7.60.03. Советую перепрошивку, иначе риск повторного сбоя при слабом RSSI.

Функция SOS в iOS 10.2 вложила аварийный звонок в отдельный стек, почти как изолированный модуль в надводной части подводного интернета: воду он разрежет без всплеска, но цель достигнет. При корректной настройке задержка до гудка не превышает полутора секунд даже в ячейке edge-coverage.