Я хочу показать, как, не используя приватных API ( = не используя приватных фреймворков/классов/функций) можно собирать разнообразные данные о использовании устройства.
Вот описание информации, которую можно получить:
Мощность сигнала сотовой сети: RSSI в дБм и относительную мощность в «палках»
Качество сигнала WiFi (0 — плохо, 4 — хорошо)
Состояние регистрации в сотовой сети: наличие SIM, поиск сети
Тип сети передачи данных: 2G, 3G, WiFi
Заряд аккумулятора с точностью до процента (стандартные средства дают точность в 5%)
Включен ли «режим самолёта» («airplane mode»)
Включены ли различные сервисы: будильник, Airplay, VPN, перенаправление звонков, Nike+
Вот вчера случайно наткнулся на такую уязвимость iOS. Проверено на iPhone 4, 4S и 5 с iOS 6.1.2.
Чтобы воспроизвести баг, который приводит к перезапуску SpringBoard'a (что в свою очередь приводит к прекращению работы всех запущенных пользователем приложений), нужно сделать всего две вещи:
Скрыть все окна (т.е. объекты UIWindow) в приложении.
Из этой главы, да и из всей этой книги понятно, что самые лакомые куски программирования под iOS включены в публичные фреймворки, но не в SDK. Неофициальная политика Apple насчет этого проста: вы можете всё это использовать, но только на свой страх и риск. Ваш код может сломаться при следующем обновлении прошивки. Вам самим придётся искать компромисс между риском и прибылью.
Erica Sadun, The iPhone Developer's CookBook
Оригинал
As you’ve seen in this chapter, and throughout this book, some of the nicest bits of iPhone programming are included in the public iPhone frameworks but not in the SDK. Apple’s unofficial policy on this is clear:You can use these items in your programs, but you do so at your own risk.Your code may break at each firmware release. Striking the balance between risk and reward is up to you.
Дисклеймеры
Приведенные здесь куски кода работают на обычных iPhone (включая 4S) и iPad (включая new iPad) и не требуют jailbreak.
Все решения написаны и протестированы на iOS 5. Все решения также протестированы на совместимость с iOS 4.3, т.е. работают с iOS 4, если не сказано обратное. Основная часть статьи была написана до выхода iOS 6, так что приведенные решения не тестировались на совместимость с iOS 6.
Использование недокументированных API может привести к тому, что ваше приложение не допустят в AppStore. А может и не привести :-)
Для тех, кому интересно, как Apple опрделяет использование приваетных API:«Как Apple узнаёт, что ты используешь приватные API?»
Apple может изменить реализацию вместе со следующим релизом iOS, и в вашем коде что-то сломается. Впрочем, это решаемо, и ничем принципиально не отличается от реализации обратной совместимости для документированных API. Ниже я рассмотрел эту проблему чуть подробнее.
Я не могу гарантировать, что у найденных мной API нет побочных эффектов. Используйте на свой страх и риск.
Лицензионное соглашение Apple Developer Program запрещает реверс-инжинеринг iOS.
Статья в процессе доработки. Конструктивная критика приветствуется!
Краткая инструкция по поиску в SDK
Допустим, вам нужно сделать что-то, выходящее за рамки официальной документации.
Мне сложно рассуждать, используя неточные термины, такие как «большая», «сильная» или как в данном случае: «невероятно высокая». Если вы утверждаете, что проблема Android — это большая доля пиратства на основе субъективного высказывания одного разработчика или на основе общего мнения, то это не аргумент.