klink0v (klink0v) wrote,
klink0v
klink0v

Какая же гадость этот ваш iPhone

Поручили мне тут на работе развернуть средства внутрикорпоративного общения посредством электропочты, IM и VoIP, в том числе и для "разъездных" сотрудников. То есть с поддержкой наиболее популярных мобильных платформ. Я, конечно, догадывался, что столкнусь с определёнными трудностями. Не предполагал только, что с настолько экзотическими. И вот что я вам скажу, братцы-кролики. Android, спору нет, — говно. Но Apple — ещё хуже.

В качестве главного и основного недостатка "андрюши" по сравнению с "огрызком" обычно называют его чрезмерную прожорливость. Мол, батарейки едва хватает на двое суток работы. Так-то оно, конечно, так. Только вот при этом постоянно упускают из виду почему так происходит. Давайте попробуем разобраться.

Как известно, чудес не бывает. При одинаковых габаритах и массе два аккумулятора всегда будут иметь если не одинаковую, то по крайней мере сопоставимую ёмкость. А дальше уже время автономной жизни устройства будет полностью зависеть от того, каким образом оно будет расходовать накопленную в аккумуляторе энергию. Хотите верьте, хотите проверьте, но главный и основной её потребитель — радиомодули телефона: GSM/3G, Wi-Fi, Bluetooth. Стало быть, гаджет будет тем экономичнее, чем лучше в нём реализованы алгоритмы отключения-включения радиосвязи. Второе место по прожорливости займут фоновые процессы. Но тут энергоэффективность больше зависит от авторов конкретного приложения: насколько хорошо оно умеет "засыпать", "просыпаться" и требовать вычислительных ресурсов только тогда, когда это действительно необходимо.

Дык вот, что касается конкретно Apple и конкретно iPhone, то тут инженеры в погоне за экономичностью перешли все разумные границы.

Начнем с того, что они жестко постулировали: в фоне могут выполняться и получать системные события только три типа приложений: VoIP, воспроизведение звука и навигация. Всё. Приложения всех остальных типов, будь то VPN-клиент, IM-клиент или электропочта, в момент блокировки (lock) телефона принудительно отправляются в глубокий анабиоз. То есть приложение получает уведомление о предстоящем "засыпании" устройства и уведомление о состоявшемся "пробуждении". Всё. Какие-либо события между этими двумя моментами будь то входящий IP-пакет, запрос на соединение, дисконнект сети или что-либо ещё будут безусловно проигнорированы.

Разумеется, разработчиков прикладных программ такой подход не устроил. И они начали извращаться кто на что горазд. Например, IM-клиент начинает "косить" под VoIP-приложение, для того чтобы получить возможность невозбранно выполняться в background-е. Отсюда вместо стандартизированности мы получили разброд и шатание, а также неочевидность и непредсказуемость работы каждого конкретного приложения в каждом конкретном случае.

Некоторые программисты стали запихивать в свои творения костыли типа вот такого.

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

Почему программисты так делают? Да потому что просто не существует другого способа поддерживать связь в внешним миром. Если программа не выполняется в background-е, то в спящем режиме телефона предназначенные ей входящие UDP-пакеты гарантированно отправятся в никуда. До приложения дойдут только те TCP-пакеты, которые принадлежат заранее установленным (уже инициированным) TCP-сессиям. Все остальные будут отброшены (DROPнуты). И как бе никого не волнует, что эта сессия может по каким-либо причинам и разорваться: потеря сигнала сотовой связи, переход из соты в соту, переключение с 3G на Wi-Fi и обратно, NAT провайдера "решит" что клиент уже "отвалился" по таймауту и т.п. Приложение об этом всё равно никак не узнает: события-до него никакие не доходят. Упс!

А если оставаться в background-е? Ну да, это решает проблему. Только мы вернулись к тому, с чего начинали: к адской прожорливости аппарата.

Но сказав "не существует другого способа поддерживать связь в внешним миром", я всё же немного слукавил. На самом деле, такой способ есть. Он называется "Push-уведомления". Смысл там в том, что включенный iPhone всегда поддерживает связь с серверами Apple aka "iCloud". Обладатели iPhone знают, что перед первым использованием телефон нужно обязательно выпустить в интернет и залогиниться/зарегистрироваться в iCloud, без этого он просто не будет работать. А дальше реализуется вот такая схема (отсюда).

Что она означает? Допустим, вы разработали свой собственный почтовый клиент и хотите чтобы пользователь получал уведомления о вновь пришедших письмах. Что вы делаете? Вы в интернете разворачиваете свой собственный сервис-посредник, на котором (важный момент!) ваши пользователи сохранят свои пароли в открытом виде (!). Этот самый ваш сервер-посредник от имени пользователя Вася Пупкин зарегистрируется на почтовом сервере Васи от его имени и будет проверять Васину почту. Как только Васе придет новое письмо, об этом узнает посредник. Тот примет (прочитает письмо), возьмет оттуда заголовок (от кого, тема), первые несколько строчек и перешлет всё это на один из серверов iCloud с пометкой "для Васиного iPhone". А уже Apple-вский сервер перешлет всё это непосредственно на сам iPhone. Который покажет Васе, что ему пришло новое письмо. Но! Ваш почтовый клиент при этом даже не проснется. И он по-прежнему не будет знать о том, что пришла новая почта. Только когда Вася разблокирует телефон и запустит ваш клиент, он заново свяжется с Васиным почтовым сервером (на этот раз напрямую, без посредников) и покажет Васе его письмо целиком. Вот такая вот загогулина получается ©.

Чем это плохо для Васи? Да тем, что во-первых, его пароли в открытом виде хранятся на стороннем сервисе сомнительной чистоплотности и надежности. Во-вторых, у Васи не может быть никаких секретов ни от вас, ни от корпорации Apple. И тот, и другой при желании без проблем ознакомятся с содержанием предназначающихся Васе писем (если конечно они не шифрованные). В-третьих, в случае если почта является сугубо приватной/внутрикорпоративной (то есть не имеет публичного доступа из интернета), то вся эта технология работать, увы, не будет. А если она работать не будет, то и с оперативными уведомлениями о новых письмах придётся распрощаться (почему — смотри выше).

Таким образом, в сухом остатке мы имеем следующее.


  • Если приложение не "висит" в фоне, то его пользователь не может получать уведомления о событиях из внешнего мира: входящие сообщения, входящие звонки и т.п.

  • Если приложение "висит" в фоне, то прожорливость iPhone ничуть не уступает андроидофонам: одного полного заряда аккумулятора хватает лишь на 20 часов работы (мои личные замеры).

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

  • Если ни один из трёх вышеописанных вариантов не устраивает, то для решения поставленных задач остаётся только разрабатывать своё собственное приложение и интегрировать Push в свои сервисы. Многие ли могут себе это позволить с экономической точки зрения?

И особо заострю ваше внимание на том, что это вовсе не баги или косяки в конкретной реализации. Это архитектурные особенности, заложенные в основу всего аппаратно-программного комплекса.

Устали читать многобукаф? Сочувствую, это ещё не все. Продолжу тем, что iPhone просто отвратительно работает с Wi-Fi. Еще с 4-й версии iOS-а вплоть до 6-й (а возможно, и 7-ой, никто не проверял) тянется неисправленным откровенный баг, когда iPhone продолжает использовать динамический IP-адрес после истечения срока его аренды (пруф). Далее, ойфончег совершенно не заботится о том, чтобы своевременно обновлять ARP-кэш ближайшего к себе маршрутизатора, дабы запись о MAC-адресе не устаревала и роутер не забывал бы о факте существования устройства внутри его сети. Таким образом, мне удавалось экспериментально смоделировать ситуации, в которых до пользователя не доходило вообще ничего, в том числе и пресловутые Push-сообщения. С точки зрения сисадмина огрызки в локальной сети тоже представляют определенную головную боль: в спящем режиме они не откликаются ни на ICMP, ни на ARP-запросы. В случае возникновения каких-либо неприятностей диагностировать всё это барахло становится крайне проблематично.

Я уж не знаю что там творится по части GPRS/3G. Мне было бы интересно "пощупать" железку и в том направлении тоже, да вот незадача: для этого требуется запустить сетевой отладчик на оборудовании оператора сотовой связи. Одно я знаю точно. В спящем режиме операционная система телефона также совершенно не заботится о том, чтобы периодически обновлять данные о себе на NAT-сервере провайдера. А "обычное" приложение сделать это просто не в состоянии (уже упоминал почему). Стало быть, TCP-сессии от приложения до сервера почти что гарантированно порвутся через какое-то весьма короткое время после их установления. Ну и толку тогда от такой платформы, когда для создания нормального интерактивного клиента под неё приходится дико выё изворачиваться?

И да. В процессе своих изысканий я понял, почему "афони" стоят так дорого, а их код никогда не будет открытым. Ещё бы, ведь в цену конечного изделия заложены расходы на содержание монстрообразного iCloud-а (сервера, датацентры, трафик, электричество, обслуживающий персонал) на протяжении всего жизненного цикла смартфона. При этом конечный пользователь лишен всякой возможности отказаться от подобных услуг, даже если они ему реально не нужны. За него всё уже давно решила Apple. Наличие учётной записи в iCloud обязательно, без оной телефон невозможно даже подготовить к первому использованию. Да и впоследствии без ведома и позволения Apple ни чихнуть, ни пукнуть. Вам нравится такой подход? Мне — нет.

Чем ещё могут похвастаться огрызки? Как выяснилось, долгое время работы от одной зарядки на поверку оказалось пшиком. Безглючностью работы, вылизанностью и жёсткой модерацией приложений? Тоже ерунда, там багов не меньше чем в андроиде, даже в built-in утилитах. Usability? Ага, SD-карту не вытащить, никакие данные без iTunes c PC не скопировать. К тому же, у меня есть данные от реального usability-специалиста, которые говорят о том, что неподготовленные люди в среднем с Android-приложениями разбираются быстрее, чем с iOS-овскими. Ну и за что деньги платить? За понты да за религию?

Короче говоря, закончу свой псто боянистой байкой. Знаете, почему Apple в роли производителя серверов вылетела с рынка? Да потому что сервер, в отличие от телефона, должен работать, а не создавать впечатление!

Занавес.

Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 7 comments