Опыт
Отвращение и ненависть в Лас-Вегасе
Привет тебе, дорогой читатель. По мотивам выпущенного приложения Sharmus, я решил накидать статью что же было сделано.
Моё приложение делает следующее: по одному нажатию рассылает в подключенные соцсети сообщение о том, какую музыку в плеере устройства вы сейчас слушаете, ну и плюс навешивает хэш-тег и картинку, если она доступна. Программа не использует какого-то крутого функционала оси, поэтому без проблем могла бы идти и на 3-ем iPhone, но тут то мы натыкаемся на первый гвоздь от Apple.
1. Дело в том, что в Apple ребята не шибко морочатся об обратной совместимости, и так с выходом 4-го xCode ребята рубанули с плеча и поменяли внутреннюю архитектуру файла, отвечающего за визуализацию. Таким образом интерфейсы из 4-го xCode поддерживаются только с 5ой ОС. Это, конечно, слегка напрягло, но потом я подумал «Да и х.. с ним» и пошел себе дальше.
Далее я начал искать пути взаимодействия с соцсетями. Т.к. писать собственные либы было тупо лень, я начал шерстить интернет. Нашел я замечательную библиотеку ShareKit, её и стал использовать. Тут надо сказать спасибо разрабам, а так же сказать им, что они *вырезано цензурой*, потому что на основной страничке сайта лежит древняя и мохнатая версия либы, с которой работать уже нет смысла, но никакого сообщения или чего-либо не имеется. Совершенно случайно я наткнулся в интернетах на упоминание форума, связанного с этой либой, и вот уже там я нашел свежую сборку.
Идем дальше, следующим шагом была работа с аудио потоком, с первого раза механизм управления аудиопотоком я как-то не нашел - видимо «гугл плохо искал» (ну кроме там прев, некст). Разобравшись таки, вышло что особо проблем с получением текущего трека и информации о нем не возникло, благо за все это отвечает один класс.
Потом пришло время бороться с апи соцсетей, а именно с твиттером запиленным в iOS. Надо сказать спасибо разрабам из эпл, апи экстра убогое. Там всего 3 или 4 класса. Да, конечно, для простой отправки в аккаунт по умолчанию сделано всё в один метод, практически без параметров на вход. НО стоит помнить, что сама ОС поддерживает добавление нескольких твиттер аккаунтов (в отличии от фейсбука), и вот тут начинается веселье.
2. Нет способа простого для отправки твита в интересующий тебя аккаунт. Более того, нет даже метода для выбора дефолтного аккаунта! Необходимо наворотить вагон кода, реализовать своё окно выбора твиттер аккаунта, и после выбора, реализовать работу с лентой путем обращения по прямым ссылкам к апи твиттера. Это, кстати, один из способов сделать аккаунт по умолчанию, надо вот таким хитрым способом считать ленту или отправить твит, и после этого упрощенная работа с твиттером будет работать с текущим аккаунтом. Правда не ясно, на срок жизни приложения или же до тех пор, пока не будет сделана такая же операция с другим аккаунтом.
Подумав и решив не морочиться с собственным окном выбора аккаунта, а оставить это на совести разрабов эпла, я пошел дальше.
Состоялся первый релиз на айпаде.
Далее была задача перепилить интерфейс на айфон. Естественно кишки остались нетронутыми (почти).
3.По пути переделывания я узнал что класс выпадающего списка который я использовал под iPad просто напросто отсутвует под iPhone. Честно говоря, сакральный смысл отсутствия я не врубил и быстро нашел кастомизируемую замену, которую потом и в айпад впилил .
Я снова вернулся к вопросу управлению аудиопотоком. Основная проблема заключалась в том, что класс работающий и мотающий песенки вперед назад, после того как песенки в очереди закончились, не умеет перезапускать очередь! А если её не было, то взять все песни и фигачить их. Ну не дано ему и всё тут, хоть play ты его хоть stop, ничего происходить не будет. Углубление гугления помогло разобраться что нужно заюзать еще один класс который предоставляет работу с очередью MPMediaQuery и принудительно вталкивать это плееру. И вот здесь начинается очередная офигительная история .
4. Забава в том, что при таком принудительном назначении очереди класс MPMusicPlaybackState начинает нагло и бесцеремонно врать, да, кстати, это отдельный класс который смотрит текущее состояние песни (пауза, стоп, плей). Погуглив обширно эту тему я нашел что этот баг уже лет 5 где-то присутствует и ребята из эпл откровенно на него класть хотели, многочисленные баг репорты программеров не дают результатов. Пришлось другими средствами узнавать текущее состояние. И тут на помощь приходят великие программерские костыли, решение тупое до гениальности. Заключается оно в том, что ребята проверяют идет ли сейчас звук, и если идет сравнивают из какого аудио процесса это происходит. Не сказать что это дофига изящный выход, но это выход и это работает!
Хотелось бы затронуть нюансы стадии подготовки и заливки в аппстор.
5. Значит инфы про то, как это сделать вагон, НО нигде не говорится, что при первой заливке начнут «делать мозги» сертификаты, выданные тебе, как программеру, самим эпл специально для твоей проги. Т.е. всё время, пока ты ведешь подготовительную работу, отлаживаешь на девайсе и прочее - сертификаты норм, НО как только ты хочешь залить код, они не валид.
Решение тупое - удаляем сертификаты - ставим заново - PROFIT!
6. Ну и последнее, не важно, сколько ты проделал работы для адаптации своего приложения под 4 дюйма экран, всё пойдёт лесом, если не будет сплэш скрина! Без него аппстор просто не воспринимает код под новые айфоны .
Получается 6 замечательных, не совсем логичных вещей, с которыми пришлось столкнуться, пока писалась прога.
Вместо послесловия: Как могло показаться читателю, автор является ненавистником эпла, на самом деле это не совсем так. В разработке под эпл есть свои плюсы, которые очень облегчают работу программиста. Эта же статья направлена на подчеркивание минусов подхода компании эпл к созданию своих фреймворков и на изливание желчи по этому поводу =)
Chief Technical Officer,
Ilya Dolgov