Как стать автором
Обновить

JavaScript to APK. Подводные камни разработки под Android для тех, кого задолбал PhoneGap. Построение мостов из Java в JavaScript

Время на прочтение8 мин
Количество просмотров61K
Всего голосов 43: ↑38 и ↓5+33
Комментарии30

Комментарии 30

Что такое экспрессионализм? о_О Опечатка?
Это из той же оперы, что и сУреализм (вообще-то такой стиль существует, но тут речь явно не про него) и возрАждение
И «Ренессанс» с двумя «с» пишется. И шрифт диснеевский :)
Вы на ближайшем fronttalks будите об этом же говорить?
И да, и нет. Это один из частных случаев. На fronttalks будет про верстку и архитектуру больше. Буду JS в EXE`шники загонять на XP без NodeJS =)
О! Расскажите, пожалуйста, потом об этом здесь? А то до Екатеринбурга далеко ехать…
Потом будет пост на Хабре со всеми плюшками. А то как-то нехорошо получится наперед постить.
а в чем сложности-то, когда в винде есть IE? Еще с IE4 эти функции в MSHTML имеются — бери да дёргай… собственно хоть на xp, хоть на новейших…
Что-то не подумал об этом. А инструмент для этого не подскажите? Уж очень не хочется руками с WinAPI общаться.
Ну можно использовать jscript и его компайлер (jsc.exe) (хотя это с натягом можно назвать «javascript», но всё же....)… В целом — варианты есть, тот же COM интерфейс осла никто не отменял…
Есть как минимум 2 нативных способа получить JS среду в exe без nodejs
1) использовать jscript.exe (хотя там поддержки стандартов почти нету)
2) использовать PhantomJS (это такой WebView+V8 на стероидах, написанный на чистом Qt)
PhantomJS совсем не по этой части. Главное его достоинство — ему не требуется графическая система. Его нельзя использовать для упаковки веб-приложений. Основной сценарий его использование — это автотестирование.
изначально речь шла просто про JavaScript — если нужно с графической частью тоже — то есть Titanium и node-webkit
Как же хочется прочитать где-то в одном месте что могут различные упаковщики для запуска WebApp в виде самостоятельных приложений: Titanium, PhoneGap, node-webkit… А то вариантов вроде много, но все проекты, что видел, затачиваются под конкретный способ упаковки и конкретную среду исполнения (например, свежий гитхабовский атом), вместо того, чтобы писать простой WebApp, а потом запаковать под разные платформы. По-моему было бы круто если кто-то написал пост с описанием и сравнением. Если уже есть такое, то киньте, пожалуйста, ссылку.
А зачем игре получать IMEI? Просто интересно
Конкретно в этой — не зачем. А вообще в платных играх иногда нужна возможность достоверно определить абонента. IMEI — остается при смене сим-карты, но правда у некоторых китайских телефонов его нет вообще. Поэтому при покупке чего либо и т.п., сервер точно знает что это старый игрок помня все IMEI.
Приложение делалось, очевидно, для телеканала Disney или его поклонников?
Подводный камень: В Android < 4 шрифты могут расползтись.

А под iOS 7 — наоборот, «сползтись», причем в совершенно неожиданных местах. Проблема интересная — iOS в новой версии начал обрабатывать шрифтовые кернинг-пары (насколько я, как программист, понял из рассказа специалиста — это пара букв и заданный создателем шрифта интервал между ними) и в них иногда встречаются неадекватные значения. Может быть, корни проблемы с Android < 4 где-то там же.
Попробуйте посмотреть в сторону Qt на Android. Пока только одним глазком — многое не готово, конечно, но мой опыт меня порадовал)
Есть еще несколько важных моментов.

Для отключения контекстных меню по долгому клику:
webView.setLongClickable(false);


Для исправления бага с sublings и псевдоклассами CSS в более старых версиях webkit на Android:
body { -webkit-animation: bugfix infinite 1s; }

@-webkit-keyframes bugfix { 
   from { padding: 0; } 
   to { padding: 0; } 
}


И самое важное, аппаратное ускорение, которое по умолчанию отключено! В AndroidManifest.xml нужно добавить следующий параметр для <activity>: android:hardwareAccelerated="true"
Добавлю свои 5 копеек:
Подводный камень: В Android < 4.4 в WebView не работают вебсокеты :(

Если вы используете PhoneGap, то есть плагины исправляющие этот недостаток:
github.com/FreakDev/PhoneGap-Android-HTML5-WebSocket
github.com/anismiles/websocket-android-phonegap
github.com/mkuklis/phonegap-websocket
А откуда инфа, что тег аудио не работает в андроидовских webview? То что запустить аудио нельзя вне потока, инициализируемого юзером, это да (кроме нюанса, который заключается в том, что поток, запущенный с помощью loadUrl тоже имеет права пользовательского), что проигрывается только один файл одновременно, это тоже да, но в целом пашет же.
Насколько я понимаю, например в iOS нет Java, а есть конверторы (например) в ObjectC, да и то не для GUI-кода. Как же тогда с
Я люблю игры на JavaScript и стараюсь сделать их код пуленепробиваемыми для портирования на все платформы
Но webview то везде есть, а в нем javascript.
Столкнулся с такой фичей браузера Андроида 4.x: после событий touchstart — touchend он всегда посылает mousedown — mouseup (после интервала в 300мс), даже если было запрошено event.preventDefault(), event.stopPropagation() или вообще удален handler. Это сильно мешает логике, если приложение хочет обрабатывать и мышку и тачи. Хорошего решения нет, кроме как отслеживать если mouseup пришел в интервале до 400мс после touchend с похожими координатами, то игнорировать его.
Вот за такое API
vw.setVerticalScrollBarEnabled(false);


Разработчика нужно п… дить кирзачами отрывать руки дать в репу заставить самого этим пользоваться.
Этож просто какая-то жесть.

А по итогу-то что получается — только Java, только хардкор? Как не посмотрю — все кривенько :(
А по итогу-то что получается — только Java, только хардкор?

Ну в идеале разработчики PhoneGap должны были учесть эти ньюансы и уже готовое решение дать. Но что поделать :(

Этож просто какая-то жесть.

Объясните пожалуйста, что не так. Что бы на будущее учесть.
Ох, как-то привык в JS к тому что создать объект ничего не стоит, так что совсем красиво не сделать, в яве хешмапы жуть какая-то (как-то раньше пристально не смотрел на нее).

А вообще конечно по нормальному нужно вести от общего к частному

vw.setScrollBarVerticalEnabled(false);


Что все равно ужасно, но хоть логичнее по структуре.
Очень близкая тема! Сам с PhoneGap и Samsung Galaxy Note 2 воевал.
Всё очень и очень сырое, даже вертикальный скролл делается через одно место. Правда сейчас верстаю под WebView под iOS и там тоже всё очень специфично (а работать приходится с multi-column, flex-box и прочими радостями).

Пока на этих платформах ИМХО html5 стек готов но в очень ограниченом применении. Очень надеюсь на Qt.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий