Pull to refresh

Обратная совместимость в iOS SDK

Reading time 5 min
Views 5.3K

Apple никогда официально не заявляла о несовместимостях между разными версиями своих OS. И всё же каждый крупный релиз они что-то меняют в ядре операционки — фиксят баги и привносят новые. И иногда именно фикс багов, с которыми все привыкли жить, добавляет новых трудностей – в iOS 3 ты не задумываясь добавлял 20 пикселей там, где iOS 4 добавляет их сама, и в итоге твоя модальная вьюшка уезжает на 20 лишних пикселей вверх.

Но это не самая страшная разновидность несовместимостей – их можно продебажить, пофиксить и выпустить новый билд. Также легко устраняется, например, ставшее уже традиционным изменение стандартного контрола для проигрывания видео – в каждой новой iOS Apple что-то добавляет, модифицирует, причём полностью забивая на старый интерфейс без всяких там deprecated за пару версий до выпиливания – так, например, в iOS 3 он был обычной вьюшкой от UIView, а в iOS 4 стал резко вью-контроллером, а старая MPMoviePlayerView исчезла.

Но это тоже подвластно дебагеру, на форумах можно за 10 секунд найти готовый гибридный код фикса такой, что код будет работать везде.

Но относительно новая iOS 5 принесла ещё больше неожиданностей. Об этом свидетельствует хотя бы тот факт, что в последних релизах популярных айфон-приложений обязательно присутствует строчка “Fixed iOS 5 issues” – средний пользователь айпада находит примерно по 10 апдейтов приложений каждый день. Ниже я расскажу о неочевидной проблеме обратной совместимости iOS 4 и iOS 5, с которой мне пришлось столкнуться на своей шкуре и сполна хлебнуть горя.

Проблема

Как-то под конец октября моим заказчикам начали приходить сообщения от пользователей приложения о том, что внезапно перестала работать одна из второстепенных, но довольно важных вьюшек. Приложение не крашилось, навигация оставалась доступна, но вместо данных они созерцали белый экран Малевича.
Ни у заказчиков, ни у моей команды, ни у более чем двухсот других пользователей этот баг не воспроизводился. Более того, приложение уже как 2 месяца находилось в AppStore и никто до этого не жаловался. Вьюшка была построена по абсолютно такому же принципу, как и десятки соседних – данные брались из базы, обрабатывались опеределённым образом и клались на довольно кастомный UI.
Было решено до поры до времени ничего не предпринимать – подождать, пока баг воспроизведётся хоть на одном из обширного парка наших девайсов, и спокойно зафиксить.

Кошмар

Однако проблема не локализовалась – с каждым днём всё больше и больше пользователей стали жаловаться на отсутствие вьюшки. Надо признать, что она была далеко не ключевой и, судя по статистике Google Analytics, использовалась каждым десятым юзером раз в неделю. Но вспомним о психологии американцев – они сами того не осознавая, любым путём, пытаются выбить скидку на любую услугу – похоже, это у них в крови как у славян на… обмануть.
Мысль о том, что платная программа не выполняет 100% своих функций, хоть и выполняет 99,9%, будоражит мозг буржуя, лишает его сна и вкуса к жизни.
В письмах он подолгу описывает чувство невообразимого frustrating, когда видит белый экран вместо данных, за которые его компания заплатила $0,099, черпая вдохновение у Хэмингуэя. Please fix this ASAP!!!, we don’t know what we are paying for!!!, I don’t want to pay for something that does not work properly!!! – и это ещё только начало списка электронных писем, любезно форвардящихся заказчиками на мою электронную почту. В довершение ко всему баг стал воспроизводиться на трети (именно трети, не на всех!) девайсах моих заказчиков. К гневным письмам конечных покупателей стали добавляться 5-7 писем в день от самих заказчиков, написанные верхним регистром и молящих о помоще ASAP.
Не стоит и говорить, что они стали ставить в копию руководство, которое в свою очередь также стало требовать фикса.

Мы сделали всё, что могли, даже сделали больше. Тестили под дебагом все билды за последние месяцы, включая продакшн и продакшн Release Candidate. Ставили разное время и разные локали. У нас всё работало, не было ни одной конфигурации (iOS 4.2.1, iOS 4.3, iOS 5.0), на которой мы вообще могли бы воспроизвести баг!

Наш QA беспомощно пожимал плечами, мы через день (потому что всё-таки нужно спать и иногда вовремя уходить с работы) дебажили по TeamViewer девайсы заказчика – под дебагером всё работало идеально. Но как только я собирал им очередной Ad-Hoc, всё продолжалось по новой. Моя почта потеряла упорядоченность. Мой скайп потерял покой и комфорт. Я потерял покой на несколько недель, осознавая собственное бессилие. Это был первый в моей карьере баг (я работаю в разных областях IT около 5 лет), к которому я не мог найти способа даже подойти – я перепробовал всё, что мог придумать и что могли придумать ребята.

Решение

Итак, опять повторю – под дебагером всё работало. Это стало первой зацепкой. Надо отметить, что на моём маке стоял xCode 3.2.6 c SDK 4.3, тогда как на маках моей команды – 4.2 c SDK 5. Просто мне пока лень было переходить на новый для меня, и такой непохожий на предыдущую версию, xCode 4.
Я, как тимлид, всегда собирал AppStore и Ad-Hoc билды на своём маке. Когда же нужно было подебажить – мы дебажили айпады с iOS 4.X на моём маке (дебажить на маке с iOS SDK 5 можно, но нужно обязательно докачивать большой образ iOS 4.3), а айпады с iOS 5 – на их маках (дебажить такие на маке с предыдущей iOS SDK 4 невозможно). Надо сказать, что сам Objective-C в некоторых местах несовместим в SDK 4 и SDK 5 (тот же @autorelease{}), а ребята любят новомодные фишки, так что при переброске версий из нового xCode в старый приходилось перелинковывать некоторые либы и чуть-чуть править код. Это последнее обстоятельство и навело меня на финальную мысль.

Проверили быстро – я поставил себе наконец SDK 5 и xCode 4 и выслал ipa файл (аналог старых Ad-Hoc билдов) заказчикам – как и ожидалось, всё заработало.
Вероятно, вы уже догадались в чём проблема. Не важно, какой код компилировался – важно, где он компилировался. Тот же самый код, исправно работавший на AppStore многие месяцы, был скомпилен для iOS 4 в iOS 4 SDK ещё до выхода iOS 5. Потом стал неверно работать, когда пользователи обновились до iOS 5.

Решается эта проблема простым пересобиранием того же самого кода на iOS SDK 5. Что именно изменила Эппл, так и осталось загадкой, т.к. дебажить девайс с SDK 5 из xCode c SDK 4 нельзя, а время на обвешиванеи кода ассертами нам никто оплачивать не будет. Остаётся только выпустить новый билд и ждать апрува от Apple. Что я и советую всем хабраюзерам – апдейтите свои приложения, просто пересобрав под iOS SDK и, следуя best practices от Apple, добавьте пару графических вкусняшек, чтобы средний пользователь в безвоздушном пространстве понял, для чего он качает новый билд.

После написанного

Всё же я считаю, что Apple делает правильно, забивая каждый новый релиз на все старые версии – это помогает операционке всегда пахнуть хорошо, удерживает ядро от обрастания хард-кодом и хард-фиксами. Ведь именно из-за необходимости поддержки обратной совместимости умерли Symbian и ветка Windows mobile. Да и большая Windows до недавнего времени была построена на старом как смерть ядре.

К тому же Apple предоставляет превосходный механизм обновления операционок, знакомый всем пользователям продукции компании. Они не просто просят пользователей обновиться – пользователи сами хотят обновиться до новых версий, т.к. за это им обещают очередные улучшения UI почтового менеджера, больше рингтонов для будильника или другие простые и понятные ништяки. Фермерше из штата Канзас невдомёк, что, обновляя свой айфончик с выходом каждой новой ОС, она дарит часы спокойного сна программистам по ту сторону океана :)
Tags:
Hubs:
+30
Comments 63
Comments Comments 63

Articles