Выход за пределы песочницы в iOS
Пост боли. Так получилось, что сейчас ковыряю чужой проект, который рассчитан на работу на айфонах с Jailbreak. Да не просто рассчитан, а ему нужно иметь доступ за пределы песочницы.
Как известно, все приложения в iOS работают внутри песочницы, за пределы которой они выходить не могут. Все приложения из App Store устанавливаются в /var/mobile/Applications/ (приложения, которые ставятся в iPhone из Xcode - туда же), где для них создаётся отдельная папка с нечитаемым именем. Выходить за пределы этой папки нельзя. Ни для чтения, ни, тем более, для записи.
Это, например, папка гугловой игры Ingress.
А это айосный калькулятор, например, лежащий в /Applications.
Если мы хотим, например, прочитать в приложении SMS-сообщения телефона, то нам нужно прочитать файл /var/mobile/Library/SMS/sms.db - это обычная SQLite база данных, без шифрования и защиты. Её можно скачать с джейлбрейкнутого телефона и открыть любой тулзой, которая умеет открывать SQLite-файлы, и посмотреть все SMS-ки и даже фигачить по ней sql-запросы для поиска и прочего.
Тут, например, лежит файл со всеми смс-ками iPhone.
Так вот, доступа к этому файлу из песочницы нет. И Jailbreak от этого не спасает, он даёт полный доступ к файловой системе, но только если ты работаешь вне песочницы.
Чтобы приложение работало вне песочницы - его нужно переместить из /var/mobile/Applications/ в директорию /Applications. Тогда приложение будет в папке системных программ, будет иметь доступ на брейкнутом девайсе к файловой системе, не будет удаляться из телефона удержанием пальца на иконке и всё такое.
И вот боль тут в том, Xcode ну никак не может установить приложение туда, только в песочницу. Можно делать это руками - заходить в телефон, перемещать через какой-нибудь iFunBox, и вот такой вот геморрой каждый раз. И самая боль в том, что ты теряешь удобство отладки. Нельзя запустить в Xcode апп на девайсе и спокойно смотреть в консольку - что же там приложение твоё пишет - работает или нет?
Никакие твики из Cydia, типа дающие для приложений доступ к файловой системе даже для приложений из песочницы, не дали эффекта. По крайней мере, у меня на iOS 7.1.2. Говорят, что даже если запустить приложение от root'а, но всё равно в песочнице - и это не даст прав на чтение системных директорий. Хотя, такое ощущение, что раньше такое работало, но и джейлбрейки были другие.
Такой вот ад. В ближайшее время буду пробовать найденные в инете скрипты для автоматизации перемещения приложения внутри айфона после билда через SSH с отлавливанием syslog'а. Хочу ещё расписать, чего я наковырял внутри айфона в плане «где что хранится», но позже, по окончании ада :)
comment commentsnode-couchdb-mover
На днях написал свою первую тулзу Node.Js. Писал лишь отчасти для себя, т.к. для меня она пока не очень актуальна, а вот кое для кого даже очень.
Тулза для CouchDB. Т.к. CouchDB хранит после изменений/удалений документов ревизии и не всегда их очищает, бывает, что база адски растёт в размере. Например, у ребят, для которых эта тулза актуальна сейчас, то, что должно весить 6 гигов, весит 50-60. Может быть они где-то запустили что-то или накосячили, понаменяв и понаписав кучу всего в базу, чем люто увеличили её размер. В общем, проще просто создать новую чистую базу и перенести туда все живые документы.
Тулза просто берёт все документы из 1 базы в CouchDB, и кладёт их в другую. Работает пока довольно топорно, берёт все документы скопом и потом по 1 кладёт в базу. Для баз с относительно небольшим количеством документов работает нормально, а вот если их там тысяч этак 80, то у меня на компе получение документов длилось около 4-5 минут. Поэтому переделаю её вскоре, чтобы брала документы пачками и фигачила внесение в базу не асинхронно, а по очереди.
Но пока пользоваться можно. Тулзу можно встроить, например, в свой Node.Js проект.
В консоли:
npm install node-couchdb-mover
В коде:
var mover = require('node-couchdb-mover');
mover.moveDocuments('dbName1', 'dbName2');
Кроме того, её можно использовать прямо из консоли:
npm install -g node-couchdb-mover
couchdb-mover --from=dbName1 --to=dbName2
Ну, и как это положено, исходники на гитхабе | пакет на npmjs.org.
comment commentsКак узнать ретина дисплей или нет?
Ко мне в блог много заходов из поисковиков по запросам вроде «Как определить дисплей retina». Попадают они ко мне на статью про Objective-C, но ищут они явно не код :) Запилил в итоге такую вот страничку, на которую надо просто зайти через браузер с вашего устройства. Если ретина - результат будет зелёным, как на скрине выше. Если не ретина - то красный, как на скрине ниже.
Работает для iOS-устройств (iPhone, iPad, iPod) и Mac с экраном Retina. На экранах с высокой плотностью пикселей на дюйм тоже пишет, что retina :)
Адрес страницы: https://arm1.ru/retina/
comment commentsКлиент Linode для iPhone
Пользуюсь уже несколько лет услугами хостера Linode.com, где держу свою VPS-ку с сайтами/проектами и для всяких личных целей.
У них есть API, на основе которого, как я понимаю, они сделали клиент для iPhone.
Клиент это, по-моему, просто перекрасен.
Шпаргалка при настройке nginx+php-fpm из homebrew
Если после настройки nginx и php-fpm для работы через php5-fpm.sock выдаётся ошибка у Nginx: 502 bad gateaway и в логе пишется что-то вроде:
*20 connect() to unix:/usr/local/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream
То проблема с правами решается:
cd /usr/local/var/run
sudo chmod 666 php5-fpm.sock
Если это помогло, но в /usr/local/etc/php/5.5/php-fpm.conf надо раскоментить строчку:
listen.mode = 0666
comment
comments
Пишем клиент для Яндекс.Метрики для iPhone
Копия моей статьи с Хабра
comment commentsОбновление айМетрик 1.1
Сегодня вышло обновлений айМетрика. Основные нововведения - вкладка Посетители с отчётами по полу, возрасту и географии, и вкладка с целями, в которой есть все те же самые отчёты, но по целям и с дополнительными параметрами вроде достижения цели, конверсия и др.
Плюс поправил пару косяков.
comment comments