Вопросы о совместимости веб-языков в проекте cross-plateform

Я планирую создать приложение на iOS, Android и веб-сайте с AngularJS.

Но для того, чтобы не переписывать бизнес-код в каждом приложении, я хотел бы использовать как можно больше кода.

Чтобы иметь возможность выполнять ядро ​​проекта на любой платформе, я должен использовать веб-язык.

В разных статьях я планирую общую архитектуру для разделения бизнес-логики проекта – ядро ​​- с пользовательским интерфейсом, который будет повторно реализован для каждой системы (UIKit для iOS, AngularJS и Polymer для webapp и т. Д.),

Целью этой архитектуры является уважение важных принципов разработки программного обеспечения, таких как скрытие информации путем разложения требований в модулях , DRY и SOLID

  • Каждая функция будет разложена в модуле.
  • Core : Код бизнес-логики – многократно используемый на каждой платформе – будет представлен в виде библиотеки.
  • Вид . Класс просмотра будет разработан на каждой платформе для использования различных элементов пользовательского интерфейса, предлагаемых на каждой платформе. Например: подкласс ViewController в Objective-C / Swift для iOS или простой класс для управления HTML для веб-приложения. В этом классе нет логики. Ответственность несет только:
    • Обрабатывайте взаимодействие пользователей с бизнес-логикой.
    • Отображение содержимого из бизнес-логики
  • IView : интерфейс, который абстрагирует класс, который манипулирует представлением.
  • Ведущий : связь между Interactor и View для управления пользовательским интерфейсом.
  • Interactor : логика модуля, такая как алгоритмы.
  • Хранилище данных . Управление сохранением и извлечением данных путем обмена данными с базой данных или API или веб-службой.
  • Модель : данные представлены в структурах.

Здесь для iOS (почти то же самое для Android):

Введите описание изображения здесь

Код «core» будет выполнен через виртуальную машину, как показано в этой статье: http://www.skyscanner.net/blogs/developing-mobile-cross-platform-library-part-3-javascript

Здесь для AngularJS:

https://docs.google.com/drawings/d/1NtdDfsr1yiuGOm_lfOY6Qab_kHb4I5b4sx7zeTAqwrE/pub?w=915&h=377


Теперь, когда вы все знаете об архитектуре, вот мои вопросы.

У меня недостаточно опыта и отзывов на веб-языках, чтобы иметь возможность сделать разумный выбор. После нескольких исследований я обнаружил, что существуют различные варианты:

  • Дарт :

    • Вопрос 1: Существуют ли механизмы для обеспечения взаимодействия между Objective-C / Swift и Java через VM? Я знаю, что обе платформы имеют VM для выполнения кода Javascript, и Google предоставляет dart2js для компиляции кода Dart в Javascript. Но это не простой Javascript: см. Пример здесь . Поэтому я не знаю, есть ли еще надлежащая функциональная совместимость.
  • Javascript ES6: событие, если оно еще не полностью реализовано в браузерах, можно использовать ES6 с компилятором Traceur.

    • Вопрос 2: Существует ли совместимость Javascript, скомпилированная Traceur и VM в iOS / Android?
    • Вопрос 3: «Безопасно ли использовать ES6 через Traceur для разработки крупномасштабного проекта и иметь производственный код?

Спасибо за чтение.

Я знаю, что это не один из вариантов, которые вы указали, но не автоматически исключаете C ++. Это то, что использует Dropbox, например, они даже открывают свои инструменты для этой цели:

Генератор C ++ для Java / Objective-C API:

https://github.com/dropbox/djinni

Пример «родного» приложения для Android / iOS:

https://github.com/libmx3/mx3

Интересная статья на эту тему с дополнительными ссылками:

http://oleb.net/blog/2014/05/how-dropbox-uses-cplusplus-cross-platform-development/

Обновленный ответ:

Если вы действительно не хотите использовать C ++, и все в порядке с раздуванием, которое вы получите от неродного, вы можете попробовать следующее:

https://github.com/MobileChromeApps/mobile-chrome-apps

Этот проект является вилкой Google Кордовы и добавляет множество новых функций и преимуществ.

Здесь есть обложка Dart поверх API Chrome:

https://github.com/dart-gde/chrome.dart

В принципе, вы должны написать свое приложение в Dart, используя простые технологии HTML5, а затем для определенных вещей, которые вы будете использовать API-интерфейсы Chrome (состояние устройства и т. Д.). Затем вы можете развернуть:

  • Веб: скомпилируйте JavaScript без функций API Chrome.
  • Chrome OS: скомпилируйте JavaScript с функциями API Chrome.
  • Android: скомпилируйте JavaScript и затем используйте MobileChromeApps для создания приложения для Android.
  • IOS: скомпилируйте JavaScript и затем используйте MobileChromeApps для создания приложения iOS.

Это интересная тема. Вот что я узнал из конференции «GWT.Create», ребята из Google показали, как они реализовали проект кроссплатформ:

Сначала часть DataStore и Model на вашем снимке должна быть сделана на внешнем сервере, поэтому это уже перекрестные платформы.

Выполнение пользовательского интерфейса должно выполняться индивидуально, это лучшее решение.

Они реализовали общую логику (сложный расчет, шифрование и т. Д.) С Java, для Android она работает нестандартно, для Web они используют GWT для перевода Java на Javascript, а для iOS они используют новый продукт Google J2ObjC. Вы можете найти это здесь:

https://github.com/google/j2objc

Они также упомянули решение C / Cpp, это совсем не плохая идея, Java – это просто язык высокого уровня и простой в использовании в большинстве случаев.

Если вы хотите создать кросс-платформенное приложение (iOS / Android / Web), то лучше всего использовать как можно больше кода между этими платформами. Вы можете использовать что-то наподобие PhoneGap / Cordova, но это не так уж и очень естественно. Событие, лучшее приложение PhoneGap считает не родным, потому что оно не использует собственный пользовательский интерфейс. Вместо этого внедряет браузер в собственный контейнер пользовательского интерфейса.

Я рекомендую использовать структуру проекта следующим образом:

  • MyApp-жильный
  • MYAPP-ИСН
  • MyApp-андроид
  • MyApp-веб

Основной проект разделяют между ios, android и веб-проектом. Вы можете написать основной проект на Java и использовать GWT для перевода этого кода в JavaScript для веб-проекта. Для проекта Android нечего делать, потому что Android использует Java. Для вашего проекта ios вы можете использовать J2Objc, чтобы передать основной код Java в Objective-C.

Что входит в основной проект?

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

Разговоры, напоминания и контакты. Также речь идет о сложной задаче сетевого управления и автономной синхронизации, когда приложение используется в автономном режиме, создаются напоминания и отправляются электронные письма. Это приложение должно хранить все это и запускать его в Интернет, когда придет время. Источник

Конечно, есть несколько элементов Inbox, которые разделены между тремя платформами: код для управления сетевой связью, кеширование объектов, локальное постоянное хранилище, управление правами пользователя как локально, так и удаленно и поддержка всего этого в автономном режиме. Эта логика должна быть достоверно и правильно реализована и постоянно обновляться на всех трех клиентах. Перезапись его три раза на трех разных языках могла бы впитать существенные инженерные ресурсы и замедлить, как быстро мы улучшаем Inbox.

Для iOS мы разработали кросс-компилятор с открытым исходным кодом J2ObjC для перевода нашей модели данных Java в Objective-C, и снова мы получаем естественный API, на котором можно создать собственное приложение Inbox Inbox (в комплекте с – [Reminder snooze]). Проницательный читатель может задаться вопросом, как мы имеем дело с несоответствием импеданса при переводе с собранного мусора языка (Java) на ссылочный подсчет (Objective-C). Как правило, J2ObjC полагается на пулы автообношений Objective-C, поэтому объекты, обычно собранные с помощью мусора, освобождаются, когда пул сливается. Одной из проблем с этим подходом являются эталонные циклы; В тех местах, где циклы существуют в нашей модели данных Java, мы используем аннотацию Java для идентификации @WeakReference. При пересылке соответствующее свойство в Objective-C будет иметь модификатор __weak, тем самым нарушая цикл сохранения. На практике мы обнаружили, что это относительно небольшая проблема, и у нас есть тесты автоматизации, в которых отмечены редкие случаи новых циклов, ползущих по объектной модели. Источник

Связь между вашими основными модулями может быть выполнена с помощью Dagger2, который он запускает на Android / iOS / GWT. Существует также кросс-платформенная библиотека JSON, называемая realtime-json . Транспорт HTTP может быть реализован в ядре, по крайней мере, для Android и iOS. Форма GWT / JavaScript вы должны сделать это на стороне клиента.

Вот несколько примеров приложений, которые должны вам помочь:

Intereting Posts
Как запустить скрипт matlab из java (для android) с помощью matlabcontol.jar Приложение Phonegap умирает в фоновом режиме при сборе местоположения Не удается удалить файл с помощью класса File Альтернативы для setFinishOnTouchOutside для более старого устройства Android? Получение дочерних элементов из LinearLayout Ориентация на конкретную версию системного образа с помощью утилиты командной строки «android»? Проверка пустого поля RadioGroup с помощью setError в Android Вертикальная прокрутка текстовой строки в Android Связывание внутри Intent из приложения Native cpp с использованием Binder MapView onCreate выбрасывает NullPointerException на устройствах LG Исправлены проблемы с отображением приложений для Android на симуляторе Blackberry Playbook Использование устройства Bluetooth для устройств Bluetooth Импортированная библиотека appcompat имеет ошибки Невозможно десериализовать экземпляр java.lang.String из START_ARRAY Как разместить объект местоположения в Parcelable