Время для некоторой обскуры кода. У меня есть часы Samsung Gear S2, которым на данный момент исполняется 3 года. Новые модели по-прежнему используют тот же Tizen SDK, поэтому все, что здесь изложено, должно работать и с этими устройствами.
Я задумал небольшое приложение для часов, но мне не понравились мои возможности. Разработка часов может выполняться либо с использованием собственного языка C, либо в виде веб-приложения, например, ванильного JavaScript. Также недавно были добавлены расширения Visual Studio с поддержкой .NET. C - это, ну, C и JS вызывают у меня язвительную реакцию.
Так что это заставило меня задуматься: Angular, будучи Typescript, в конечном итоге является просто Javascript, он должен работать правильно? И, конечно же, это так. Давайте начнем с простого POC и сделаем все с нуля.
Для просмотра примера вам понадобится Tizen SDK (включая инструменты командной строки) и Angular CLI.
Шаг 1: Создание проекта Angular
Сначала давайте создадим новый проект Angular 6 и опробуем его:
cd ~/git/ ~/git/$ ng new angularTizenSample ~/git/$ cd angularTizenSample ~/git/$ ng serve
Если все прошло гладко, вы должны увидеть образец проекта Angular. Вы можете прекратить это, и давайте перейдем к проекту Tizen.
Шаг 2: Создание веб-проекта Tizen
Tizen Studio немного нестабильна, поэтому мы будем использовать инструменты командной строки для создания Tizen Web Project. Предполагая, что у вас есть эмулятор часов Tizen, давайте создадим новый проект внутри проекта Angular и запустим его:
~/git/angularTizenSample/$ tizen create web-project -p mobile-2.3.1 -t WebBasicApplication -n angularTizenSample ~/git/angularTizenSample/angularTizenSample/$ cd angularTizenSample ~/git/angularTizenSample/angularTizenSample/$ tizen build-web ~/git/angularTizenSample/angularTizenSample/$ tizen package -t wgt -- .buildResult/ ~/git/angularTizenSample/angularTizenSample/$ sdb install .buildResult/angularTizenSample.wgt ~/git/angularTizenSample/angularTizenSample/$ sdb shell "wrt-launcher '-s Bsl3EwnDc9.angularTizenSample'"
Этот Bsl3EwnDc9.angularTizenSample - это идентификатор приложения. Он был создан в файле config.xml.
В этом проекте нам понадобится значок, который мы переместим в файлы src / assets, config.xml и .project. Мы можем удалить все остальное и переименовать этот каталог в просто «tizen».
Преодоление разрыва
Затем давайте изменим проект Angular, чтобы приспособить часы (некоторые на основе WebKit) - давайте включим все полифиллы в polyfills.ts:
import 'core-js/es6/symbol'; import 'core-js/es6/object'; import 'core-js/es6/function'; import 'core-js/es6/parse-int'; import 'core-js/es6/parse-float'; import 'core-js/es6/number'; import 'core-js/es6/math'; import 'core-js/es6/string'; import 'core-js/es6/date'; import 'core-js/es6/array'; import 'core-js/es6/regexp'; import 'core-js/es6/map'; import 'core-js/es6/weak-map'; import 'core-js/es6/set';
Затем, чтобы увидеть, что все работает, давайте изменим проект так, чтобы он просто отображал логотип Angular, и если вы нажмете на него, он изменится на логотип Tizen.
Давайте возьмем логотип Angular, заменим встроенный и поместим его в активы как angular.png, а также возьмем icon.png из проекта tizen и поместим его как tizen .png.
app.component.html:
<div style="text-align:center"> <img width="360" height="360" alt="Angular Logo" (click)="changeImage()" src="{{img}}"> </div>
app.component.ts:
import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title = 'angularTizenSample'; angular = 'assets/angular.png'; tizen = 'assets/tizen.png'; img = this.angular; changeImage() { if (this.img === this.angular) { this.img = this.tizen; } else { this.img = this.angular; } } }
Обновление файлов сборки
Давайте обновим файлы сборки, чтобы простая npm run tizen
команда собрала все и создала для нас пакет Tizen:
Давайте включим все файлы конфигурации для Tizen в angular.json:
{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "angularTizenSample": { "root": "", "sourceRoot": "src", "projectType": "application", "prefix": "app", "schematics": {}, "targets": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { "outputPath": "dist/angularTizenSample", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.app.json", "assets": [ "src/favicon.ico", "src/assets", { "glob": "*", "input": "tizen/", "output": "/" } ], "styles": [ "src/styles.css" ], .....
Команды сборки в package.json:
{ "name": "angular-tizen-sample", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build --prod", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", "tizen": "npm run build && npm run tizenPackage", "tizenPackage": "cd dist/angularTizenSample && tizen build-web && tizen package -t wgt -- .buildResult/", "tizenRun": "cd dist/angularTizenSample && sdb install .buildResult/angularTizenSample.wgt && sdb shell \"wrt-launcher '-s Bsl3EwnDc9.angularTizenSample'\"" }, "private": true,
Нет, мы можем npm run tizen
упаковать наше приложение и npm run tizenRun
запустить его на эмуляторе (или устройстве, в зависимости от того, на что указывает sdb):
При запуске на реальном устройстве вам нужно всего лишь следовать стандартным инструкциям Tizen, а именно создать сертификат, установить его на свое устройство и подписать файл wgt.
Что дальше?
Следующим шагом будет использование Tizen API для взаимодействия с функциями устройства, такими как нажатие кнопок и поворот лицевой панели. Я создал для этого интерфейсы TypeScript, смоделировал эти вызовы и почти полностью запустил приложение в браузере, даже не попробовав эмулятор / устройство.
Angular действительно сияет, когда вы скрываете довольно запутанный API Tizen, связанный с телефонной связью, под услугой, просто предлагая услугу для этой функции.
Примечания
- Отладка? Вы можете использовать Tizen Studio, чтобы запустить проект и даже отладить его оттуда, но, как я уже сказал, это немного нестабильно. Множество зависаний IDE и различных ошибок. Вы также можете подключиться к веб-инспектору версии, запущенной из командной строки.
- Не работает маршрутизация - все должно быть в index.html.
- Производительность на уровне обычных JS-приложений.
Код из этого примера можно найти по адресу https://github.com/ration/angularTizen.
Спасибо за прочтение! Оставляйте вопросы или комментарии ниже или свяжитесь со мной на Github.