<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=NativeScript</id>
	<title>NativeScript - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=NativeScript"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=NativeScript&amp;action=history"/>
	<updated>2026-05-13T05:14:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=NativeScript&amp;diff=73340&amp;oldid=prev</id>
		<title>Lsokolowski: /* ng add ⌘ */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=NativeScript&amp;diff=73340&amp;oldid=prev"/>
		<updated>2019-06-17T08:23:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;ng add ⌘&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Draft}}&lt;br /&gt;
{{Cat|JavaScript}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;slideshow style=&amp;quot;nobleprog&amp;quot; headingmark=&amp;quot;⌘&amp;quot; incmark=&amp;quot;…&amp;quot; scaled=&amp;quot;true&amp;quot; font=&amp;quot;Trebuchet MS&amp;quot; &amp;gt;&lt;br /&gt;
;title: NativeScript with Angular 4&lt;br /&gt;
;author: Lukasz Sokolowski&lt;br /&gt;
&amp;lt;/slideshow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NativeScript with Angular 4 ⌘==&lt;br /&gt;
NativeScript with Angular 4 Training Materials&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction to NativeScript with Angular ⌘==&lt;br /&gt;
&lt;br /&gt;
* build &amp;#039;&amp;#039;&amp;#039;both a web and a native mobile app&amp;#039;&amp;#039;&amp;#039; from a single project&lt;br /&gt;
** Schematics&lt;br /&gt;
** ng add&lt;br /&gt;
&lt;br /&gt;
=== Schematics ⌘===&lt;br /&gt;
* Work of Angular and NativeScript teams&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;nativescript-schematics&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== ng add ⌘===&lt;br /&gt;
* Use Angular CLI and NativeScript schematics to generate a brand new project with a &amp;#039;&amp;#039;&amp;#039;code-sharing setup&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* https://github.com/nativescript/nativescript-schematics&lt;br /&gt;
* @nativescript/schematics package only works with @angular/cli: 6.1.0 or newer&lt;br /&gt;
* Exercise is [[NativeScript#Schematics_exercise_.E2.8C.98|here]]&lt;br /&gt;
&lt;br /&gt;
== Installation and setup of NativeScript ⌘==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Quick setup&amp;#039;&amp;#039;&amp;#039; - no access to &amp;#039;&amp;#039;&amp;#039;Plugins, Resources, Debugging, Unit Tests and Lazy Loading&amp;#039;&amp;#039;&amp;#039;, but easy to start with&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Common setup&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;full&amp;#039;&amp;#039;&amp;#039; access to all the goodies of local dev envy&lt;br /&gt;
** on &amp;#039;&amp;#039;&amp;#039;windows&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;mac-os&amp;#039;&amp;#039;&amp;#039; is quite straight away (usually via tns command)&lt;br /&gt;
** on &amp;#039;&amp;#039;&amp;#039;linux&amp;#039;&amp;#039;&amp;#039; it is more demanding (more &amp;#039;&amp;#039;&amp;#039;manual&amp;#039;&amp;#039;&amp;#039; setup)&lt;br /&gt;
*** and we can &amp;#039;&amp;#039;&amp;#039;only&amp;#039;&amp;#039;&amp;#039; setup it up for android dev tools&lt;br /&gt;
*** for ios we might to consider &amp;#039;&amp;#039;&amp;#039;sidekick&amp;#039;&amp;#039;&amp;#039; extension ( &amp;lt;small&amp;gt;https://www.nativescript.org/nativescript-sidekick&amp;lt;/small&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Basic setup with telerik cli ⌘===&lt;br /&gt;
&lt;br /&gt;
 tns create myAppName --ng&lt;br /&gt;
 cd myAppName&lt;br /&gt;
 tns platform add android&lt;br /&gt;
 tns platform add ios # only on mac system or via cloud&lt;br /&gt;
&lt;br /&gt;
 tns create myApp --template tns-template-blank-ng&lt;br /&gt;
&lt;br /&gt;
=== Basic setup with telerik cli con&amp;#039;t ⌘===&lt;br /&gt;
&lt;br /&gt;
 tns doctor&lt;br /&gt;
 cd $ANDROID_HOME/tools/bin&lt;br /&gt;
 sdkmanager &amp;quot;system-images;android-25;google_apis;x86&amp;quot;&lt;br /&gt;
 ./avdmanager create avd -n test -k &amp;quot;system-images;android-25;google_apis;x86&amp;quot;&lt;br /&gt;
 tns device android --available-devices&lt;br /&gt;
 tns run android --emulator&lt;br /&gt;
 tns run android --device test&lt;br /&gt;
 (adb kill-server)&lt;br /&gt;
&lt;br /&gt;
== Overview of NativeScript and the Application Life Cycle ⌘==&lt;br /&gt;
* Technology stack&lt;br /&gt;
&amp;lt;small&amp;gt;https://docs.nativescript.org/img/ns-common.png&amp;lt;/small&amp;gt;&lt;br /&gt;
* Modules&lt;br /&gt;
&amp;lt;small&amp;gt;https://docs.nativescript.org/img/ns-modules.png&amp;lt;/small&amp;gt;&lt;br /&gt;
* Lifecycle&lt;br /&gt;
&lt;br /&gt;
=== Life cycle ⌘===&lt;br /&gt;
&lt;br /&gt;
* Component&lt;br /&gt;
* Nativescript&lt;br /&gt;
* Android&lt;br /&gt;
* iOS&lt;br /&gt;
* More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/core-concepts/application-lifecycle&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Nativescript ⌘====&lt;br /&gt;
NativeScript life cycle events:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;launch&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;suspend&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;resume&amp;#039;&amp;#039;&amp;#039;: resumed after it has been suspended&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;displayed&amp;#039;&amp;#039;&amp;#039;: UIelements are rendered&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;orientationChanged&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;exit&amp;#039;&amp;#039;&amp;#039;: app is about to exit&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;lowMemory&amp;#039;&amp;#039;&amp;#039;: memory on the target device is low&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;uncaughtError&amp;#039;&amp;#039;&amp;#039;: on uncaught application error&lt;br /&gt;
&lt;br /&gt;
== Overview of Property System, Data Binding and Events ⌘==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Data Binding&amp;#039;&amp;#039;&amp;#039; - connection (binding) between &amp;#039;&amp;#039;&amp;#039;Data Model&amp;#039;&amp;#039;&amp;#039; (Model) and &amp;#039;&amp;#039;&amp;#039;User Interface&amp;#039;&amp;#039;&amp;#039; (UI)&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;One-way - from Model to UI&amp;#039;&amp;#039;&amp;#039;, i.e. text stored in Model and displayed on UI in a text area control&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;One-way to source (to model)&amp;#039;&amp;#039;&amp;#039; - updates Model due to some &amp;#039;&amp;#039;&amp;#039;action&amp;#039;&amp;#039;&amp;#039; on UI, i.e. button click (tap)&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Two-way data binding&amp;#039;&amp;#039;&amp;#039; - combines both, i.e. text box field that reads its value from Model, but also changes the Model based on user input&lt;br /&gt;
* Examples - [[Angular_2_Fundamentals#Binding_data_.E2.8C.98]]&lt;br /&gt;
&lt;br /&gt;
== Understanding NativeScript&amp;#039;s Multithreading Module ⌘==&lt;br /&gt;
&lt;br /&gt;
* NS allows &amp;#039;&amp;#039;&amp;#039;fast and efficient&amp;#039;&amp;#039;&amp;#039; access to all native platform (Android/Objective-C) APIs through JavaScript&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;without&amp;#039;&amp;#039;&amp;#039; using (de)serialization or reflection&lt;br /&gt;
** tradeoff - all JavaScript executes on the &amp;#039;&amp;#039;&amp;#039;main thread&amp;#039;&amp;#039;&amp;#039; (AKA the UI thread)&lt;br /&gt;
*** operations that potentially take longer can &amp;#039;&amp;#039;&amp;#039;lag&amp;#039;&amp;#039;&amp;#039; the rendering of the UI (slow)&lt;br /&gt;
* Solution - multithreading with &amp;#039;&amp;#039;&amp;#039;worker&amp;#039;&amp;#039;&amp;#039; threads&lt;br /&gt;
** scripts executing on a &amp;#039;&amp;#039;&amp;#039;background&amp;#039;&amp;#039;&amp;#039; thread in &amp;#039;&amp;#039;&amp;#039;isolated&amp;#039;&amp;#039;&amp;#039; context&lt;br /&gt;
* More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/core-concepts/multithreading-model&amp;lt;/small&amp;gt;&lt;br /&gt;
* Example: &amp;lt;small&amp;gt;https://github.com/NativeScript/worker-loader&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NS Multithreading con&amp;#039;t ⌘===&lt;br /&gt;
https://docs.nativescript.org/angular/img/multithreading/Workers.png&lt;br /&gt;
&lt;br /&gt;
== Creating a User Interface with NativeScript ⌘==&lt;br /&gt;
NativeScript Ui&lt;br /&gt;
* set of free(but not fully open-sourced) &amp;#039;&amp;#039;&amp;#039;components&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* is built &amp;#039;&amp;#039;&amp;#039;on top of natively&amp;#039;&amp;#039;&amp;#039; implemented components targeting iOS and Android&lt;br /&gt;
* they are available for download on npmjs.com as a &amp;#039;&amp;#039;&amp;#039;separate&amp;#039;&amp;#039;&amp;#039; packages&lt;br /&gt;
* More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/ui/professional-ui-components/overview&amp;lt;/small&amp;gt;&lt;br /&gt;
* Examples: &amp;lt;small&amp;gt;https://github.com/NativeScript/nativescript-ui-samples-angular&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Designing the Application Logic ⌘==&lt;br /&gt;
&lt;br /&gt;
Sketching out a &amp;#039;&amp;#039;&amp;#039;rough idea&amp;#039;&amp;#039;&amp;#039; of our app view&lt;br /&gt;
* no need to know what it will &amp;#039;&amp;#039;&amp;#039;look&amp;#039;&amp;#039;&amp;#039; like yet&lt;br /&gt;
* think about the user &amp;#039;&amp;#039;&amp;#039;expectations&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
** various &amp;#039;&amp;#039;&amp;#039;sections&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;modules&amp;#039;&amp;#039;&amp;#039; we need to construct to meet those expectations&lt;br /&gt;
** think about the various &amp;#039;&amp;#039;&amp;#039;states&amp;#039;&amp;#039;&amp;#039; the app needs to manage&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;map the view&amp;#039;&amp;#039;&amp;#039; into services and states&lt;br /&gt;
&lt;br /&gt;
=== Modularize with @NgModule ⌘===&lt;br /&gt;
&lt;br /&gt;
We can then think about breaking these services up into organizational units or modules&lt;br /&gt;
* Angular provides @NgModule decorator&lt;br /&gt;
** helps define what these modules &amp;#039;&amp;#039;&amp;#039;look&amp;#039;&amp;#039;&amp;#039; like&lt;br /&gt;
** and what they provide to our app &lt;br /&gt;
** keeps our app&amp;#039;s bootstrap/launch time as &amp;#039;&amp;#039;&amp;#039;fast&amp;#039;&amp;#039;&amp;#039; as possible&lt;br /&gt;
** allows some service/features to be &amp;#039;&amp;#039;&amp;#039;lazily loaded&amp;#039;&amp;#039;&amp;#039; after our app has launched&lt;br /&gt;
&lt;br /&gt;
==== High usability - core module ⌘====&lt;br /&gt;
* low-level CoreModule - designing how we like to work with &amp;#039;&amp;#039;&amp;#039;commonly&amp;#039;&amp;#039;&amp;#039; used services, in a unique way&lt;br /&gt;
** across not only the app we are building now but more in the &amp;#039;&amp;#039;&amp;#039;future&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** can be &amp;#039;&amp;#039;&amp;#039;easily moved&amp;#039;&amp;#039;&amp;#039; into a completely different app&lt;br /&gt;
** and gain all the same unique APIs we have designed for this app when working with &amp;#039;&amp;#039;&amp;#039;low-level services&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
===== Core module con&amp;#039;t ⌘=====&lt;br /&gt;
 cd src/app; mkdir modules; mkdir modules/core;&lt;br /&gt;
 touch modules/core/core.module.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
 // nativescript&lt;br /&gt;
import { NativeScriptModule } from &amp;#039;nativescript-angular/nativescript.module&amp;#039;;&lt;br /&gt;
// angular&lt;br /&gt;
import { NgModule } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
// app&lt;br /&gt;
import { PROVIDERS } from &amp;#039;./services&amp;#039;;&lt;br /&gt;
@NgModule({&lt;br /&gt;
  imports: [&lt;br /&gt;
    NativeScriptModule&lt;br /&gt;
  ],&lt;br /&gt;
  providers: [&lt;br /&gt;
    ...PROVIDERS&lt;br /&gt;
  ],&lt;br /&gt;
  exports: [&lt;br /&gt;
    NativeScriptModule&lt;br /&gt;
  ]&lt;br /&gt;
})&lt;br /&gt;
export class CoreModule { }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 modules/core/services/log.service.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular&lt;br /&gt;
import { Injectable } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
@Injectable()&lt;br /&gt;
export class LogService {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 modules/core/services/database.service.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular&lt;br /&gt;
import { Injectable } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
@Injectable()&lt;br /&gt;
export class DatabaseService {&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 modules/core/services/index.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
import { DatabaseService } from &amp;#039;./database.service&amp;#039;;&lt;br /&gt;
import { LogService } from &amp;#039;./log.service&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
export const PROVIDERS: any[] = [&lt;br /&gt;
  DatabaseService,&lt;br /&gt;
  LogService&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
export * from &amp;#039;./database.service&amp;#039;;&lt;br /&gt;
export * from &amp;#039;./log.service&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Feature Modules ⌘====&lt;br /&gt;
* focusing on just the &amp;#039;&amp;#039;&amp;#039;unique&amp;#039;&amp;#039;&amp;#039; abilities our app should provide &amp;#039;&amp;#039;&amp;#039;outside&amp;#039;&amp;#039;&amp;#039; of the CoreModule&lt;br /&gt;
* reducing the &amp;#039;&amp;#039;&amp;#039;duplication&amp;#039;&amp;#039;&amp;#039; of the code&lt;br /&gt;
* encourages and enhances &amp;#039;&amp;#039;&amp;#039;rapid&amp;#039;&amp;#039;&amp;#039; development&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;injecting&amp;#039;&amp;#039;&amp;#039; services provided by CoreModule and using those APIs&lt;br /&gt;
* Maintainability&lt;br /&gt;
** underlying detail needs to change - it need only be changed in &amp;#039;&amp;#039;&amp;#039;one place&amp;#039;&amp;#039;&amp;#039; (in the CoreModule service)&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;no redundant code&amp;#039;&amp;#039;&amp;#039; potentially spread across different sections of app&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Performance&amp;#039;&amp;#039;&amp;#039;: Splitting into modules allows to load only the modules needed at startup&lt;br /&gt;
** then later, lazily load other features &amp;#039;&amp;#039;&amp;#039;on demand&amp;#039;&amp;#039;&amp;#039; (leads to a faster app startup time)&lt;br /&gt;
&lt;br /&gt;
==== Feature Modules Con&amp;#039;t ⌘====&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PlayerModule&amp;#039;&amp;#039;&amp;#039; - provides player-specific services and components (user is authenticated or not) &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;RecorderModule&amp;#039;&amp;#039;&amp;#039; - recording-specific services and components (user is authenticated and enters the record mode for the first time)&lt;br /&gt;
&lt;br /&gt;
 mkdir player; mkdir recorder;&lt;br /&gt;
 touch app/modules/player/player.module.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// nativescript&lt;br /&gt;
import { NativeScriptModule } from &amp;#039;nativescript-angular/nativescript.module&amp;#039;; &lt;br /&gt;
// angular&lt;br /&gt;
import { NgModule, NO_ERRORS_SCHEMA } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@NgModule({&lt;br /&gt;
  imports: [ NativeScriptModule ],&lt;br /&gt;
  schemas: [ NO_ERRORS_SCHEMA ]&lt;br /&gt;
})&lt;br /&gt;
export class PlayerModule { }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 touch app/modules/recorder/recorder.module.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// nativescript&lt;br /&gt;
import { NativeScriptModule } from &amp;#039;nativescript-angular/nativescript.module&amp;#039;; &lt;br /&gt;
&lt;br /&gt;
// angular&lt;br /&gt;
import { NgModule, NO_ERRORS_SCHEMA } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@NgModule({&lt;br /&gt;
  imports: [ NativeScriptModule ],&lt;br /&gt;
  schemas: [ NO_ERRORS_SCHEMA ]&lt;br /&gt;
})&lt;br /&gt;
export class RecorderModule { }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Model shared for our data ⌘====&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Interface&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;model&amp;#039;&amp;#039;&amp;#039; implementation for the core piece of data our app will be using&lt;br /&gt;
&lt;br /&gt;
 mkdir app/modules/core/models;&lt;br /&gt;
 touch app/modules/core/models/track.model.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
export interface ITrack {&lt;br /&gt;
  filepath?: string;&lt;br /&gt;
  name?: string;&lt;br /&gt;
  order?: number;&lt;br /&gt;
  volume?: number;&lt;br /&gt;
  solo?: boolean;&lt;br /&gt;
}&lt;br /&gt;
export class TrackModel implements ITrack {&lt;br /&gt;
  public filepath: string;&lt;br /&gt;
  public name: string;&lt;br /&gt;
  public order: number;&lt;br /&gt;
  public volume: number = 1; // set default to full volume&lt;br /&gt;
  public solo: boolean;&lt;br /&gt;
&lt;br /&gt;
  constructor(model?: any) {&lt;br /&gt;
    if (model) {&lt;br /&gt;
      for (let key in model) {&lt;br /&gt;
        this[key] = model[key];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Service APIs ⌘====&lt;br /&gt;
API our services will provide to our app&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PlayerService&amp;#039;&amp;#039;&amp;#039; - manages tracks and control playback&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;RecorderService&amp;#039;&amp;#039;&amp;#039; - provides a simple recording API&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;LogService&amp;#039;&amp;#039;&amp;#039; - helps debug as well as gain important insights into how app is used &lt;br /&gt;
** allows to reroute all the app logs somewhere else (for example TrackJS via Segment)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;DatabaseService&amp;#039;&amp;#039;&amp;#039; - store for app&amp;#039;s data, allows any type of data, handles JSON serialization&lt;br /&gt;
** provides static keys for data (might also provide static reference to a saved user)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;AuthService&amp;#039;&amp;#039;&amp;#039; - provides static reference to a saved user&lt;br /&gt;
** certain components in our app may benefit from getting notified when the authenticated state changes&lt;br /&gt;
** utilizes RxJS library and simplifies dealing with changing data and events using &amp;#039;&amp;#039;&amp;#039;observables&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** An observable - used to &amp;#039;&amp;#039;&amp;#039;listen to events&amp;#039;&amp;#039;&amp;#039;, but also to &amp;#039;&amp;#039;&amp;#039;filter, map, reduce, and run&amp;#039;&amp;#039;&amp;#039; sequences of code against anytime something occurs&lt;br /&gt;
** Observables &amp;#039;&amp;#039;&amp;#039;simplify asynchronous development&amp;#039;&amp;#039;&amp;#039; - for example BehaviorSubject emits changes that our components could subscribe to&lt;br /&gt;
&lt;br /&gt;
===== Player service ⌘=====&lt;br /&gt;
 mkdir app/modules/player/services;&lt;br /&gt;
 touch app/modules/player/services/player.service.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular&lt;br /&gt;
import { Injectable } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// app&lt;br /&gt;
import { ITrack } from &amp;#039;../../core/models&amp;#039;;&lt;br /&gt;
@Injectable()&lt;br /&gt;
export class PlayerService {&lt;br /&gt;
&lt;br /&gt;
  public playing: boolean;&lt;br /&gt;
  public tracks: Array&amp;lt;ITrack&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
  constructor() {&lt;br /&gt;
    this.tracks = [];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public play(index: number): void {&lt;br /&gt;
    this.playing = true;&lt;br /&gt;
  }&lt;br /&gt;
  public pause(index: number): void {&lt;br /&gt;
    this.playing = false;&lt;br /&gt;
  }&lt;br /&gt;
  public addTrack(track: ITrack): void {&lt;br /&gt;
    this.tracks.push(track);&lt;br /&gt;
  }&lt;br /&gt;
  public removeTrack(track: ITrack): void {&lt;br /&gt;
    let index = this.getTrackIndex(track);&lt;br /&gt;
    if (index &amp;gt; -1) {&lt;br /&gt;
      this.tracks.splice(index, 1);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public reorderTrack(track: ITrack, newIndex: number) {&lt;br /&gt;
    let index = this.getTrackIndex(track);&lt;br /&gt;
    if (index &amp;gt; -1) {&lt;br /&gt;
      this.tracks.splice(newIndex, 0, this.tracks.splice(index, 1)[0]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private getTrackIndex(track: ITrack): number {&lt;br /&gt;
    let index = -1;&lt;br /&gt;
    for (let i = 0; i &amp;lt; this.tracks.length; i++) {&lt;br /&gt;
      if (this.tracks[i].filepath === track.filepath) {&lt;br /&gt;
        index = i;&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return index;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 touch app/modules/player/services/index.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
import { PlayerService } from &amp;#039;./player.service&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
export const PROVIDERS: any[] = [&lt;br /&gt;
  PlayerService&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
export * from &amp;#039;./player.service&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 Update player.module.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
// app&lt;br /&gt;
import { PROVIDERS } from &amp;#039;./services&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@NgModule({&lt;br /&gt;
  //...&lt;br /&gt;
  providers: [ ...PROVIDERS ],&lt;br /&gt;
  //...&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Recorder service ⌘=====&lt;br /&gt;
 mkdir app/modules/recorder/services&lt;br /&gt;
 touch app/modules/recorder/services/recorder.service.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular&lt;br /&gt;
import { Injectable } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
@Injectable()&lt;br /&gt;
export class RecorderService {&lt;br /&gt;
  public record(): void { }&lt;br /&gt;
  public stop(): void { }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 touch app/modules/recorder/services/index.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
import { RecorderService } from &amp;#039;./recorder.service&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
export const PROVIDERS: any[] = [&lt;br /&gt;
  RecorderService&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
export * from &amp;#039;./recorder.service&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 Update recorder module:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
//...&lt;br /&gt;
// app&lt;br /&gt;
import { PROVIDERS } from &amp;#039;./services&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@NgModule({&lt;br /&gt;
  //...&lt;br /&gt;
  providers: [ ...PROVIDERS ],&lt;br /&gt;
  //...&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Logging service ⌘=====&lt;br /&gt;
 Update file app/modules/core/services/log.service.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
import { Injectable } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@Injectable()&lt;br /&gt;
export class LogService {&lt;br /&gt;
&lt;br /&gt;
 public static ENABLE: boolean = true;&lt;br /&gt;
&lt;br /&gt;
 public debug(msg: any, ...formatParams: any[]) {&lt;br /&gt;
   if (LogService.ENABLE) {&lt;br /&gt;
     console.log(msg, formatParams);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 public error(msg: any, ...formatParams: any[]) {&lt;br /&gt;
   if (LogService.ENABLE) {&lt;br /&gt;
     console.error(msg, formatParams);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 public inspect(obj: any) {&lt;br /&gt;
   if (LogService.ENABLE) {&lt;br /&gt;
     console.log(obj);&lt;br /&gt;
     console.log(&amp;#039;typeof: &amp;#039;, typeof obj);&lt;br /&gt;
     if (obj) {&lt;br /&gt;
       console.log(&amp;#039;constructor: &amp;#039;, obj.constructor.name);&lt;br /&gt;
       for (let key in obj) {&lt;br /&gt;
         console.log(`${key}: `, obj[key]);&lt;br /&gt;
       }&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Database service ⌘=====&lt;br /&gt;
 Update file app/modules/core/services/database.service.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular&lt;br /&gt;
import { Injectable } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// nativescript&lt;br /&gt;
import * as appSettings from &amp;#039;application-settings&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
interface IKeys {&lt;br /&gt;
  currentUser: string;&lt;br /&gt;
}&lt;br /&gt;
@Injectable()&lt;br /&gt;
export class DatabaseService {&lt;br /&gt;
&lt;br /&gt;
  public static KEYS: IKeys = {&lt;br /&gt;
    currentUser: &amp;#039;current-user&amp;#039;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  public setItem(key: string, value: any): void {&lt;br /&gt;
    appSettings.setString(key, JSON.stringify(value));&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public getItem(key: string): any {&lt;br /&gt;
    let item = appSettings.getString(key);&lt;br /&gt;
    if (item) {&lt;br /&gt;
      return JSON.parse(item);&lt;br /&gt;
    } &lt;br /&gt;
    return item;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public removeItem(key: string): void {&lt;br /&gt;
    appSettings.remove(key);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Authorization service ⌘=====&lt;br /&gt;
 touch app/modules/core/services/auth.service.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular&lt;br /&gt;
import { Injectable } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// lib&lt;br /&gt;
import { BehaviorSubject } from &amp;#039;rxjs/BehaviorSubject&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// app&lt;br /&gt;
import { DatabaseService } from &amp;#039;./database.service&amp;#039;;&lt;br /&gt;
import { LogService } from &amp;#039;./log.service&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@Injectable()&lt;br /&gt;
export class AuthService {&lt;br /&gt;
&lt;br /&gt;
 // access our current user from anywhere&lt;br /&gt;
 public static CURRENT_USER: any;&lt;br /&gt;
&lt;br /&gt;
 // subscribe to authenticated state changes&lt;br /&gt;
 public authenticated$: BehaviorSubject&amp;lt;boolean&amp;gt; = &lt;br /&gt;
   new BehaviorSubject(false);&lt;br /&gt;
&lt;br /&gt;
 constructor(&lt;br /&gt;
   private databaseService: DatabaseService,&lt;br /&gt;
   private logService: LogService&lt;br /&gt;
 ) {&lt;br /&gt;
   this._init();&lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
 private _init() {&lt;br /&gt;
   AuthService.CURRENT_USER = this.databaseService&lt;br /&gt;
     .getItem(DatabaseService.KEYS.currentUser);&lt;br /&gt;
   this.logService.debug(`Current user: `,&lt;br /&gt;
     AuthService.CURRENT_USER);&lt;br /&gt;
   this._notifyState(!!AuthService.CURRENT_USER);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 private _notifyState(auth: boolean) {&lt;br /&gt;
   this.authenticated$.next(auth);&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 Update file app/modules/core/services/index.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
import { AuthService } from &amp;#039;./auth.service&amp;#039;;&lt;br /&gt;
import { DatabaseService } from &amp;#039;./database.service&amp;#039;;&lt;br /&gt;
import { LogService } from &amp;#039;./log.service&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
export const PROVIDERS: any[] = [&lt;br /&gt;
 AuthService,&lt;br /&gt;
 DatabaseService,&lt;br /&gt;
 LogService&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
export * from &amp;#039;./auth.service&amp;#039;;&lt;br /&gt;
export * from &amp;#039;./database.service&amp;#039;;&lt;br /&gt;
export * from &amp;#039;./log.service&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Bootstrapping the whole thing ⌘====&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Upfront&amp;#039;&amp;#039;&amp;#039; - core module, player module&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Lazy loaded&amp;#039;&amp;#039;&amp;#039; - recorder module&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Routing&amp;#039;&amp;#039;&amp;#039; config&lt;br /&gt;
&lt;br /&gt;
 Update file app/app.component.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular&lt;br /&gt;
import { Component } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// app&lt;br /&gt;
import { AuthService } from &amp;#039;./modules/core/services&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@Component({&lt;br /&gt;
 selector: &amp;#039;my-app&amp;#039;,&lt;br /&gt;
 templateUrl: &amp;#039;app.component.html&amp;#039;,&lt;br /&gt;
})&lt;br /&gt;
export class AppComponent {&lt;br /&gt;
&lt;br /&gt;
 constructor(private authService: AuthService) { }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 Update file app/app.module.ts&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;js&amp;quot;&amp;gt;&lt;br /&gt;
// angular &lt;br /&gt;
import { NgModule } from &amp;#039;@angular/core&amp;#039;; &lt;br /&gt;
&lt;br /&gt;
// app&lt;br /&gt;
import { AppComponent } from &amp;#039;./app.component&amp;#039;;&lt;br /&gt;
import { CoreModule } from &amp;#039;./modules/core/core.module&amp;#039;;&lt;br /&gt;
import { PlayerModule } from &amp;#039;./modules/player/player.module&amp;#039;; &lt;br /&gt;
&lt;br /&gt;
@NgModule({ &lt;br /&gt;
  imports: [ &lt;br /&gt;
    CoreModule, &lt;br /&gt;
    PlayerModule &lt;br /&gt;
  ], &lt;br /&gt;
  declarations: [AppComponent],&lt;br /&gt;
  bootstrap: [AppComponent] &lt;br /&gt;
})&lt;br /&gt;
export class AppModule { }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== View with layout ⌘===&lt;br /&gt;
* sdk examples&lt;br /&gt;
** &amp;lt;small&amp;gt;nativescript-sdk-examples-ng-master/app/ng-ui-widgets-category/layouts/grid-layout&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schematics exercise ⌘==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Installing the dependencies&lt;br /&gt;
&lt;br /&gt;
npm install -g @angular/cli@&amp;lt;version&amp;gt; # atm 7.2.4&lt;br /&gt;
npm install -g @nativescript/schematics&amp;lt;version&amp;gt; # atm ~0.4.0&lt;br /&gt;
npm install -g nativescript&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Create a New Angular CLI Project with NativeScript Support&lt;br /&gt;
&lt;br /&gt;
ng new angu-proj&lt;br /&gt;
cd angu-proj&lt;br /&gt;
ng add @nativescript/schematics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.1. Alternatively for fresh projects&lt;br /&gt;
&lt;br /&gt;
ng new --c=@nativescript/schematics --name=angu-proj --shared&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Schematic Changes and Process for Angular Development&lt;br /&gt;
&lt;br /&gt;
3.1. New &amp;#039;.tns.ts&amp;#039; and &amp;#039;.tns.html&amp;#039; files&lt;br /&gt;
&lt;br /&gt;
3.2. Fix the &amp;#039;app-routing.module.ts&amp;#039; with the necesary content from &amp;#039;app-routing.module.tns.ts&amp;#039;&lt;br /&gt;
&lt;br /&gt;
3.3. Adding new angular constructs&lt;br /&gt;
&lt;br /&gt;
ng g component about&lt;br /&gt;
&lt;br /&gt;
3.3.1. Add about to the router&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Running on desktop, Android (or iOS)&lt;br /&gt;
&lt;br /&gt;
ng serve&lt;br /&gt;
&lt;br /&gt;
tns platform add android&lt;br /&gt;
tns run android --bundle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5. Shortcut:&lt;br /&gt;
1) ng new sample-project --collection @nativescript/schematics --shared&lt;br /&gt;
2) cd sample-project&lt;br /&gt;
3) npm install&lt;br /&gt;
4) ./node_modules/.bin/update-ns-webpack --configs&lt;br /&gt;
5) tns platform add android&lt;br /&gt;
6) tns update&lt;br /&gt;
7) npm audit fix&lt;br /&gt;
8) tns run --bundle   # tns preview --bundle&lt;br /&gt;
9) ng serve&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using NativeScript Modules ⌘==&lt;br /&gt;
&lt;br /&gt;
* import &amp;#039;&amp;#039;&amp;#039;NativeScriptModule&amp;#039;&amp;#039;&amp;#039; (usually in our &amp;quot;core&amp;quot; module)&lt;br /&gt;
** our app will need it to&lt;br /&gt;
*** work with other NativeScript for Angular &amp;#039;&amp;#039;&amp;#039;features&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*** these features will be &amp;#039;&amp;#039;&amp;#039;accessible globally&amp;#039;&amp;#039;&amp;#039; for our app&lt;br /&gt;
*** no need to worry about &amp;#039;&amp;#039;&amp;#039;importing&amp;#039;&amp;#039;&amp;#039; NativeScriptModule elsewhere&lt;br /&gt;
&lt;br /&gt;
=== NS Modules con&amp;#039;t ⌘===&lt;br /&gt;
&lt;br /&gt;
* Core modules&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Device&amp;#039;&amp;#039;&amp;#039; functionality modules&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Data&amp;#039;&amp;#039;&amp;#039; modules&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;User interface&amp;#039;&amp;#039;&amp;#039; modules&lt;br /&gt;
** Layouts&lt;br /&gt;
** Widgets&lt;br /&gt;
* WHATWG polyfills&lt;br /&gt;
&lt;br /&gt;
=== Accessing media - location, camera, file ⌘===&lt;br /&gt;
* Examples: &amp;lt;small&amp;gt;https://github.com/NativeScript/nativescript-sdk-examples-ng&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Accessing NativeScript&amp;#039;s Animation APIs ⌘==&lt;br /&gt;
* Exposes &amp;#039;&amp;#039;&amp;#039;two&amp;#039;&amp;#039;&amp;#039; ways&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Declarative&amp;#039;&amp;#039;&amp;#039; - &amp;#039;&amp;#039;&amp;#039;CSS3&amp;#039;&amp;#039;&amp;#039; animations API&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Imperative&amp;#039;&amp;#039;&amp;#039; - calling animation methods &amp;#039;&amp;#039;&amp;#039;directly&amp;#039;&amp;#039;&amp;#039; with code&lt;br /&gt;
* Examples&lt;br /&gt;
** &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/ui/animation-examples&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integrating a NativeScript Application with Native Android and IOS Apps ⌘==&lt;br /&gt;
* Still &amp;#039;&amp;#039;&amp;#039;experimental&amp;#039;&amp;#039;&amp;#039; features&lt;br /&gt;
* Steps for &amp;#039;&amp;#039;&amp;#039;android&amp;#039;&amp;#039;&amp;#039;: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/guides/integration-with-existing-ios-and-android-apps/extend-existing-android-app&amp;lt;/small&amp;gt;&lt;br /&gt;
** Example: &amp;lt;small&amp;gt;https://github.com/NativeScript/sample-extend-android-app&amp;lt;/small&amp;gt;&lt;br /&gt;
* Steps for &amp;#039;&amp;#039;&amp;#039;iOS&amp;#039;&amp;#039;&amp;#039;: &amp;lt;small&amp;gt;https://github.com/NativeScript/sample-ios-embedded&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unit Testing and Debugging the Application ⌘==&lt;br /&gt;
* Tests&lt;br /&gt;
* Error handling&lt;br /&gt;
* Debugging&lt;br /&gt;
&lt;br /&gt;
=== Error handling ⌘===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Differs&amp;#039;&amp;#039;&amp;#039; from the usual web apps&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Devel server&amp;#039;&amp;#039;&amp;#039; - with unhandled exception the app will &amp;#039;&amp;#039;&amp;#039;crash&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Error&amp;#039;&amp;#039;&amp;#039; with the corresponding stack trace will be shown&lt;br /&gt;
** &amp;#039;&amp;#039;&amp;#039;Production&amp;#039;&amp;#039;&amp;#039; - instead of error log it is preferred to e.g. app &amp;#039;&amp;#039;&amp;#039;freeze, blank screen, failed navigation&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Scenarios&lt;br /&gt;
** (dev) &amp;#039;&amp;#039;&amp;#039;Throw exceptions&amp;#039;&amp;#039;&amp;#039; as soon as an error occurs&lt;br /&gt;
** (dev) &amp;#039;&amp;#039;&amp;#039;Show console.log&amp;#039;&amp;#039;&amp;#039; with ERROR: Something bad happened but continue execution of the app&lt;br /&gt;
** (prod) &amp;#039;&amp;#039;&amp;#039;Send an error report&amp;#039;&amp;#039;&amp;#039; to your analytics/error-report server but continue app execution&lt;br /&gt;
*** optionally triggers some &amp;#039;&amp;#039;&amp;#039;recover logic&amp;#039;&amp;#039;&amp;#039; that will handle the app without a crash&lt;br /&gt;
* More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/core-concepts/error-handling&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debugging ⌘===&lt;br /&gt;
&lt;br /&gt;
 tns debug android&lt;br /&gt;
 tns debug android --bundle&lt;br /&gt;
&lt;br /&gt;
* More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/tooling/debugging/debugging&amp;lt;/small&amp;gt;&lt;br /&gt;
* With chrome: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/tooling/debugging/chrome-devtools&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing ⌘===&lt;br /&gt;
* Unit&lt;br /&gt;
* e2e&lt;br /&gt;
&lt;br /&gt;
=== Testing con&amp;#039;t - unit ⌘===&lt;br /&gt;
* Unit&lt;br /&gt;
** NS supports &amp;#039;&amp;#039;&amp;#039;Jasmine&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;Mocha&amp;#039;&amp;#039;&amp;#039; with Chai and &amp;#039;&amp;#039;&amp;#039;QUnit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/tooling/testing/testing&amp;lt;/small&amp;gt;&lt;br /&gt;
 tns test init&lt;br /&gt;
 tns test android # --emulator&lt;br /&gt;
&lt;br /&gt;
=== Testing con&amp;#039;t - e2e ⌘===&lt;br /&gt;
* e2e&lt;br /&gt;
** testing application &amp;#039;&amp;#039;&amp;#039;workflows&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;integration&amp;#039;&amp;#039;&amp;#039; points&lt;br /&gt;
** NS supports &amp;#039;&amp;#039;&amp;#039;Appium&amp;#039;&amp;#039;&amp;#039; - open-source test automation framework&lt;br /&gt;
*** nativescript-dev-appium - NS plugin&lt;br /&gt;
** More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/tooling/testing/end-to-end-testing/overview&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Publishing the Application ⌘==&lt;br /&gt;
* Android&lt;br /&gt;
* iOS&lt;br /&gt;
&lt;br /&gt;
=== Android ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Launch&amp;#039;&amp;#039;&amp;#039; screens&lt;br /&gt;
** More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/tooling/publishing/creating-launch-screens-android&amp;lt;/small&amp;gt;&lt;br /&gt;
* Publishing&lt;br /&gt;
** More: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/tooling/publishing/publishing-android-apps&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ⌘==&lt;br /&gt;
* Common problems: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/troubleshooting&amp;lt;/small&amp;gt;&lt;br /&gt;
* Upgrading: &amp;lt;small&amp;gt;https://docs.nativescript.org/angular/releases/upgrade-instructions&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Summary and Conclusion ⌘==&lt;br /&gt;
* Code samples&lt;br /&gt;
** https://market.nativescript.org/?tab=samples&amp;amp;framework=angular&amp;amp;category=all_samples&lt;/div&gt;</summary>
		<author><name>Lsokolowski</name></author>
	</entry>
</feed>