Нейрохирурги

Если вы не провели последнее время на безлюдном и отключенном от связи острове в Тихом океане, вы наверняка в курсе последнего шума насчет сторонних приложений для iPhone, которые нельзя оставлять работать в фоновом режиме. Если сказать прямо, я никогда не видел столько экспертов, которые нихрена не понимают. И если вы не писали код для iPhone через инструменты jailbreak, ваше мнение про iPhone SDK, которое основано исключительно на том, что вы видели в симуляторе, ровным счетом ничего не значит. С таким же успехом вы можете объяснять нюансы операции на мозге.
Как человек, который занимался разработкой для iPhone последние 6 месяцев, я выдам вам хорошую дозу отрезвляющего средства.

Twitterrific на iPhone однозначно мог бы выиграть от работы в фоновом режиме. На самом деле прототипная версия именно так и работала. И это оказалось огромной проблемой: после опрашивания XML каждые 5 минут, батарея телефона практически умерла за 4 часа. Первое, что я сказал Груберу (автору блога daringfireball.net), отдавая ему бета-версию на поиграться – “не используй автоматическое обновление”.

Суть проблемы заключается в радиосигнале. И EDGE, и WiFi передатчики потребляют немало питания. И чем больше работает аппаратная часть, тем хуже время работы от батареи. Мое еже-пяти-минутное обновление приводило к тому, что аппаратная часть все время работала, и использовала ценный заряд батареи.
(Те из вас, у кого подписан договор о неразглашении об iPhone SDK, можете посмотреть в документации по Core Location. Когда выпрочтете, как его надо использовать, вы поймете, почему получение местоположения в Maps и похожих приложениях делается только в ситуации “когда надо”.)
И где-то сейчас, вы думаете “Но я буду умным по поводу того, как я буду использовать железо”. Извини, чувак, но именно ты и являешься причиной, почему у нас нет возможности запускать приложения в фоновом режиме в текущей версии SDK. Ты живешь в своем собственном маленьком иллюзорном мирке.
Что случится, если приложение А будет использовать сеть спустя 5 минут после часа, а приложение Б – спустя 10 минут, а приложение С – спустя 15 минут, и так далее? И у тебя нет возможности узнать, что делают другие приложения. А батарея тем временем страдает за всех.
По моему мнению, такой вариант вполне возможен. Как сопутствующее устройство, iPhone требуется контакт с другими устройствами для всяких разных интересных штук. Периодическое опрашивание сети – основная причина, по которой разработчикам нужна работа в фоновом режиме.
Кто-то утверждает, что Apple ограничивает инновации. Мое мнение такое, что они на самом деле помогают нам избежать коллективной проблемы себе на голову.
Потребуется несколько месяцев фактической разработки для iPhone, чтобы наконец понять, что iPhone требует совершенно другого состояния разума. До тех пор, пока это не случилось, вы будете делать предположения, основываясь на опыте разработки для настольной ОС, а это в свою очередь приведет к появлению огромного количества плохих результатов.
Так или иначе, я думаю, что Apple решит эту проблему в будущем. Я могу себе представить решение, базированное на архитектуре модулей, которое позволяет вашему приложению делать какие-то вещи, когда телефон решает, что сейчас это можно сделать (а не когда вы решили, что сейчас подходящее время.) Если радиоканал активен, потому что проверяется почта, тогда вы можете получить уведомление “сеть активна” и возможность запустить какое-то краткосрочное TCP/IP подключение. Если оно занимает слишком долго – его “прибьют”, так как Safari поступает с JavaScript, который работает слишком долго.
Жду ли я такой сложной системы в бета-версии продукта 1.0? Конечно, нет. И вы тоже не ждите.
Отсюда