Repository: EddyVerbruggen/nativescript-local-notifications Branch: master Commit: 40c599656b37 Files: 150 Total size: 265.6 KB Directory structure: gitextract_jbw4v8s9/ ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── demo/ │ ├── app/ │ │ ├── App_Resources/ │ │ │ ├── Android/ │ │ │ │ ├── app.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── res/ │ │ │ │ ├── drawable-nodpi/ │ │ │ │ │ └── splash_screen.xml │ │ │ │ ├── values/ │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── styles.xml │ │ │ │ └── values-v21/ │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ └── iOS/ │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── LaunchImage.launchimage/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── LaunchScreen.AspectFill.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── LaunchScreen.Center.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Info.plist │ │ │ ├── LaunchScreen.storyboard │ │ │ └── build.xcconfig │ │ ├── README.md │ │ ├── app-root.xml │ │ ├── app.css │ │ ├── app.ts │ │ ├── bundle-config.ts │ │ ├── main-page.ts │ │ ├── main-page.xml │ │ ├── main-view-model.ts │ │ └── package.json │ ├── package.json │ ├── references.d.ts │ ├── tsconfig.json │ └── tsconfig.tns.json ├── demo-ng/ │ ├── App_Resources/ │ │ ├── Android/ │ │ │ ├── app.gradle │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── res/ │ │ │ ├── drawable-nodpi/ │ │ │ │ └── splash_screen.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ └── values-v21/ │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ └── iOS/ │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.launchimage/ │ │ │ │ └── Contents.json │ │ │ ├── LaunchScreen.AspectFill.imageset/ │ │ │ │ └── Contents.json │ │ │ └── LaunchScreen.Center.imageset/ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ ├── LaunchScreen.storyboard │ │ └── build.xcconfig │ ├── README.md │ ├── angular.json │ ├── nsconfig.json │ ├── package.json │ ├── references.d.ts │ ├── src/ │ │ ├── app/ │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ └── item/ │ │ │ ├── items.component.html │ │ │ └── items.component.ts │ │ ├── app.css │ │ ├── main.ts │ │ └── package.json │ ├── tsconfig.json │ └── tsconfig.tns.json ├── demo-vue/ │ ├── .gitignore │ ├── README.md │ ├── app/ │ │ ├── App_Resources/ │ │ │ ├── Android/ │ │ │ │ ├── app.gradle │ │ │ │ └── src/ │ │ │ │ └── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── res/ │ │ │ │ ├── drawable-nodpi/ │ │ │ │ │ └── splash_screen.xml │ │ │ │ ├── values/ │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ └── values-v21/ │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── iOS/ │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── LaunchImage.launchimage/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── LaunchScreen.AspectFill.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── LaunchScreen.Center.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Info.plist │ │ │ ├── LaunchScreen.storyboard │ │ │ └── build.xcconfig │ │ ├── app.scss │ │ ├── components/ │ │ │ └── App.vue │ │ ├── fonts/ │ │ │ └── .gitkeep │ │ ├── main.js │ │ └── package.json │ └── package.json ├── native-src/ │ ├── android/ │ │ ├── .gitattributes │ │ ├── .gitignore │ │ ├── README.md │ │ ├── android.iml │ │ ├── app/ │ │ │ ├── .gitignore │ │ │ ├── app.iml │ │ │ ├── build.gradle │ │ │ ├── proguard-rules.pro │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── telerik/ │ │ │ │ └── localnotifications/ │ │ │ │ ├── Action.java │ │ │ │ ├── ActionGroup.java │ │ │ │ ├── Builder.java │ │ │ │ ├── DownloadFileFromUrl.java │ │ │ │ ├── LifecycleCallbacks.java │ │ │ │ ├── LocalNotificationsPlugin.java │ │ │ │ ├── LocalNotificationsPluginListener.java │ │ │ │ ├── NotificationActionReceiver.java │ │ │ │ ├── NotificationAlarmReceiver.java │ │ │ │ ├── NotificationClearedReceiver.java │ │ │ │ ├── NotificationRestoreReceiver.java │ │ │ │ └── Store.java │ │ │ └── res/ │ │ │ └── values/ │ │ │ └── strings.xml │ │ ├── build.gradle │ │ ├── gradle/ │ │ │ └── wrapper/ │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ │ ├── gradle.properties │ │ ├── gradlew │ │ ├── gradlew.bat │ │ ├── locnotplugin.iml │ │ └── settings.gradle │ └── ios/ │ ├── .gitattributes │ ├── .gitignore │ ├── LocalNotificationsPlugin/ │ │ ├── Info.plist │ │ ├── LocalNotificationsPlugin.h │ │ ├── Notification.h │ │ ├── Notification.m │ │ ├── NotificationManager.h │ │ └── NotificationManager.m │ ├── LocalNotificationsPlugin.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── PushPlugin.xccheckout │ └── README.md ├── publish/ │ ├── pack.sh │ ├── package.json │ └── publish.sh ├── src/ │ ├── .npmignore │ ├── index.d.ts │ ├── local-notifications-common.ts │ ├── local-notifications.android.ts │ ├── local-notifications.ios.ts │ ├── package.json │ ├── platforms/ │ │ ├── android/ │ │ │ └── app-release.aar │ │ └── ios/ │ │ ├── LocalNotificationsPlugin.framework/ │ │ │ ├── Headers/ │ │ │ │ ├── LocalNotificationsPlugin.h │ │ │ │ ├── Notification.h │ │ │ │ └── NotificationManager.h │ │ │ ├── Info.plist │ │ │ ├── LocalNotificationsPlugin │ │ │ └── Modules/ │ │ │ └── module.modulemap │ │ └── typings/ │ │ └── objc!LocalNotificationsPlugin.d.ts │ ├── references.d.ts │ └── tsconfig.json └── tslint.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .idea/ .vscode/ node_modules/ *.js !demo-vue/app/main.js src/*.d.ts !src/index.d.ts !src/references.d.ts demo/platforms demo-ng/platforms publish/package/ native-src/android/.project native-src/android/local.properties native-src/android/.settings/ ================================================ FILE: .travis.yml ================================================ matrix: include: - stage: "Lint" language: node_js os: linux node_js: "10" script: cd src && npm run ci.tslint - stage: "WebPack, Build" os: osx env: - WebPack="iOS" osx_image: xcode11.2 language: node_js node_js: "10" jdk: oraclejdk8 before_script: pod repo update script: cd demo && npm run build.plugin && npm i && tns build ios --bundle --env.uglify - language: android os: linux env: - WebPack="Android" jdk: oraclejdk8 before_install: nvm install 8 script: cd demo && npm run build.plugin && npm i && tns build android --bundle --env.uglify --env.snapshot - language: android env: - BuildAndroid="28" os: linux dist: trusty jdk: oraclejdk8 before_install: nvm install 10 script: - cd src && npm run build && cd ../demo && tns build android - os: osx osx_image: xcode11.2 language: node_js node_js: "10" jdk: oraclejdk8 before_script: pod repo update script: - cd src && npm run build && cd ../demo && tns build ios android: components: - tools - platform-tools - build-tools-28.0.3 - android-28 - extra-android-m2repository - sys-img-armeabi-v7a-android-21 before_install: - sudo pip install --upgrade pip - sudo pip install six install: - echo no | npm install -g nativescript@6 - tns usage-reporting disable - tns error-reporting disable ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # NativeScript Local Notifications Plugin [![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Twitter Follow][twitter-image]][twitter-url] [build-status]:https://travis-ci.org/EddyVerbruggen/nativescript-local-notifications.svg?branch=master [build-url]:https://travis-ci.org/EddyVerbruggen/nativescript-local-notifications [npm-image]:http://img.shields.io/npm/v/nativescript-local-notifications.svg [npm-url]:https://npmjs.org/package/nativescript-local-notifications [downloads-image]:http://img.shields.io/npm/dm/nativescript-local-notifications.svg [twitter-image]:https://img.shields.io/twitter/follow/eddyverbruggen.svg?style=social&label=Follow%20me [twitter-url]:https://twitter.com/eddyverbruggen The Local Notifications plugin allows your app to show notifications when the app is not running. Just like remote push notifications, but a few orders of magnitude easier to set up. > ⚠️ Plugin version 4.0.0 should be used with NativeScript 6+. If you have an older `tns --version`, please use an older plugin version. > ⚠️ Looking for NativeScript 7 compatibilty? Go to [the NativeScript/plugins repo](https://github.com/NativeScript/plugins/tree/master/packages/local-notifications). ## Installation From the command prompt go to your app's root folder and execute: ```bash tns plugin add nativescript-local-notifications ``` ## Setup (since plugin version 3.0.0) Add this so for iOS 10+ we can do some wiring (set the iOS `UNUserNotificationCenter.delegate`, to be precise). Not needed if your app loads the plugin on startup anyway. You'll know you need this if on iOS 10+ notifications are not received by your app or `addOnMessageReceivedCallback` is not invoked... better safe than sorry, though! ```js require ("nativescript-local-notifications"); ``` Now you can import the plugin as an object into your `.ts` file as follows: ```typescript // either import { LocalNotifications } from "nativescript-local-notifications"; // or (if that doesn't work for you) import * as LocalNotifications from "nativescript-local-notifications"; // then use it as: LocalNotifications.hasPermission() ``` ## Demo apps ### NativeScript-Core (XML) This demo is the one with the most options, so it's a cool one to check out: ```bash git clone https://github.com/EddyVerbruggen/nativescript-local-notifications cd nativescript-local-notifications/src npm run demo.ios # or demo.android ``` ### NativeScript-Angular This plugin is part of the [plugin showcase app](https://github.com/EddyVerbruggen/nativescript-pluginshowcase/tree/master/app/feedback) I built using Angular. There's also a simple Angular [demo in this repo](https://github.com/EddyVerbruggen/nativescript-local-notifications/tree/master/demo-ng): ```bash git clone https://github.com/EddyVerbruggen/nativescript-local-notifications cd nativescript-local-notifications/src npm run demo-ng.ios # or demo-ng.android ``` ### NativeScript-Vue We also have a [Vue demo](https://github.com/EddyVerbruggen/nativescript-local-notifications/tree/master/demo-vue): ```bash git clone https://github.com/EddyVerbruggen/nativescript-local-notifications cd nativescript-local-notifications/src npm run demo-vue.ios # or demo-vue.android ``` ## Plugin API ### schedule On iOS you need to ask permission to schedule a notification. You can have the `schedule` funtion do that for you automatically (the notification will be scheduled in case the user granted permission), or you can manually invoke `requestPermission` if that's your thing. You can pass several options to this function, everything is optional: |option|description| |------|-----------| |`id` |A number so you can easily distinguish your notifications. Will be generated if not set.| |`title` |The title which is shown in the statusbar. Default not set.| |`subtitle` |Shown below the title on iOS, and next to the App name on Android. Default not set. All android and iOS >= 10 only.| |`body` |The text below the title. If not provided, the subtitle or title (in this order or priority) will be swapped for it on iOS, as iOS won't display notifications without a body. Default not set on Android, `' '` on iOS, as otherwise the notification won't show up at all.| |`color` |Custom color for the notification icon and title that will be applied when the notification center is expanded. (**Android Only**)| |`bigTextStyle` |Allow more than 1 line of the body text to show in the notification centre. Mutually exclusive with `image`. Default `false`. (**Android Only**)| |`groupedMessages`| An array of atmost 5 messages that would be displayed using android's notification [inboxStyle](https://developer.android.com/reference/android/app/Notification.InboxStyle.html). Note: The array would be trimed from the top if the messages exceed five. Default not set | |`groupSummary`| An [inboxStyle](https://developer.android.com/reference/android/app/Notification.InboxStyle.html) notification summary. Default empty| |`ticker` |On Android you can show a different text in the statusbar, instead of the `body`. Default not set, so `body` is used.| |`at` |A JavaScript Date object indicating when the notification should be shown. Default not set (the notification will be shown immediately).| |`badge` |On iOS (and some Android devices) you see a number on top of the app icon. On most Android devices you'll see this number in the notification center. Default not set (0).| |`sound` |Notification sound. For custom notification sound (iOS only), copy the file to `App_Resources/iOS`. Set this to "default" (or do not set at all) in order to use default OS sound. Set this to `null` to suppress sound.| |`interval` |Set to one of `second`, `minute`, `hour`, `day`, `week`, `month`, `year` if you want a recurring notification.| |`icon`|On Android you can set a custom icon in the system tray. Pass in `res://filename` (without the extension) which lives in `App_Resouces/Android/drawable` folders. If not passed, we'll look there for a file named `ic_stat_notify.png`. By default the app icon is used. Android < Lollipop (21) only (see `silhouetteIcon` below).| |`silhouetteIcon`|Same as `icon`, but for Android >= Lollipop (21). Should be an alpha-only image. Defaults to `res://ic_stat_notify_silhouette`, or the app icon if not present.| |`image` |*URL* (`http..`) of the image to use as an expandable notification image. On Android this is mutually exclusive with `bigTextStyle`.| |`thumbnail` |Custom thumbnail/icon to show in the notification center (to the right) on Android, this can be either: `true` (if you want to use the `image` as the thumbnail), a resource URL (that lives in the `App_Resouces/Android/drawable` folders, e.g.: `res://filename`), or a http URL from anywhere on the web. (**Android Only**). Default not set.| |`ongoing` |Default is (`false`). Set whether this is an `ongoing` notification. Ongoing notifications cannot be dismissed by the user, so your application must take care of canceling them. (**Android Only**) | |`channel` |Default is (`Channel`). Set the channel name for Android API >= 26, which is shown when the user longpresses a notification. (**Android Only**) | |`forceShowWhenInForeground` |Default is `false`. Set to `true` to always show the notification. Note that on iOS < 10 this is ignored (the notification is not shown), and on newer Androids it's currently ignored as well (the notification always shows, per platform default). | |`priority` |Default is `0`. Will override `forceShowWhenInForeground` if set. This can be set to `2` for Android "heads-up" notifications. See [#114](https://github.com/EddyVerbruggen/nativescript-local-notifications/issues/114) for details. | |`actions` |Add an array of `NotificationAction` objects (see below) to add buttons or text input to a notification. | |`notificationLed` |Enable the notification LED light on Android (if supported by the device), this can be either: `true` (if you want to use the default color), or a custom color for the notification LED light (if supported by the device). (**Android Only**). Default not set.| #### `NotificationAction` |option|description| |------|-----------| |`id` |An id so you can easily distinguish your actions.| |`type` |Either `button` or `input`.| |`title` |The label for `type` = `button`.| |`launch` |Launch the app when the action completes.| |`submitLabel` |The submit button label for `type` = `input`.| |`placeholder` |The placeholder text for `type` = `input`.| ```js LocalNotifications.schedule([{ id: 1, // generated id if not set title: 'The title', body: 'Recurs every minute until cancelled', ticker: 'The ticker', color: new Color("red"), badge: 1, groupedMessages:["The first", "Second", "Keep going", "one more..", "OK Stop"], //android only groupSummary:"Summary of the grouped messages above", //android only ongoing: true, // makes the notification ongoing (Android only) icon: 'res://heart', image: "https://cdn-images-1.medium.com/max/1200/1*c3cQvYJrVezv_Az0CoDcbA.jpeg", thumbnail: true, interval: 'minute', channel: 'My Channel', // default: 'Channel' sound: "customsound-ios.wav", // falls back to the default sound on Android at: new Date(new Date().getTime() + (10 * 1000)) // 10 seconds from now }]).then( function(scheduledIds) { console.log("Notification id(s) scheduled: " + JSON.stringify(scheduledIds)); }, function(error) { console.log("scheduling error: " + error); } ) ``` ### Notification icons (Android) These options default to `res://ic_stat_notify` and `res://ic_stat_notify_silhouette` respectively, or the app icon if not present. `silhouetteIcon` should be an alpha-only image and will be used in Android >= Lollipop (21). [These are the official icon size guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar.html), and [here's a great guide on how to easily create these icons on Android](https://developer.android.com/studio/write/image-asset-studio). | Density qualifier | px | dpi | ------- | ------- | --- | ldpi | 18 × 18 | 120 | mdpi | 24 × 24 | 160 | hdpi | 36 × 36 | 240 | xhdpi | 48 × 48 | 320 | xxhdpi | 72 × 72 | 480 | xxxhdpi | 96 × 96 | 640 approx. __Source:__ [Density Qualifier Docs](https://developer.android.com/guide/topics/resources/providing-resources.html#DensityQualifier) ### addOnMessageReceivedCallback Tapping a notification in the notification center will launch your app. But what if you scheduled two notifications and you want to know which one the user tapped? Use this function to have a callback invoked when a notification was used to launch your app. Note that on iOS it will even be triggered when your app is in the foreground and a notification is received. ```js LocalNotifications.addOnMessageReceivedCallback( function (notification) { console.log("ID: " + notification.id); console.log("Title: " + notification.title); console.log("Body: " + notification.body); } ).then( function() { console.log("Listener added"); } ) ``` ### getScheduledIds If you want to know the ID's of all notifications which have been scheduled, do this: Note that all functions have an error handler as well (see `schedule`), but to keep things readable we won't repeat ourselves. ```js LocalNotifications.getScheduledIds().then( function(ids) { console.log("ID's: " + ids); } ) ``` ### cancel If you want to cancel a previously scheduled notification (and you know its ID), you can cancel it: ```js LocalNotifications.cancel(5 /* the ID */).then( function(foundAndCanceled) { if (foundAndCanceled) { console.log("OK, it's gone!"); } else { console.log("No ID 5 was scheduled"); } } ) ``` ### cancelAll If you just want to cancel all previously scheduled notifications, do this: ```js LocalNotifications.cancelAll(); ``` ### requestPermission On Android you don't need permission, but on iOS you do. Android will simply return true. If the `requestPermission` or `schedule` function previously ran the user has already been prompted to grant permission. If the user granted permission this function returns `true`, but if he denied permission this function will return `false`, since an iOS can only request permission once. In which case the user needs to go to the iOS settings app and manually enable permissions for your app. ```js LocalNotifications.requestPermission().then( function(granted) { console.log("Permission granted? " + granted); } ) ``` ### hasPermission On Android you don't need permission, but on iOS you do. Android will simply return true. If the `requestPermission` or `schedule` functions previously ran you may want to check whether or not the user granted permission: ```js LocalNotifications.hasPermission().then( function(granted) { console.log("Permission granted? " + granted); } ) ``` ================================================ FILE: demo/app/App_Resources/Android/app.gradle ================================================ // Add your native dependencies here: // Uncomment to add recyclerview-v7 dependency //dependencies { // compile 'com.android.support:recyclerview-v7:+' //} android { defaultConfig { generatedDensities = [] applicationId = "org.nativescript.plugindemo.localnotifications" } aaptOptions { additionalParameters "--no-version-vectors" } } ================================================ FILE: demo/app/App_Resources/Android/src/main/AndroidManifest.xml ================================================ ================================================ FILE: demo/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml ================================================ ================================================ FILE: demo/app/App_Resources/Android/src/main/res/values/colors.xml ================================================ #F5F5F5 #757575 #33B5E5 #272734 ================================================ FILE: demo/app/App_Resources/Android/src/main/res/values/styles.xml ================================================ ================================================ FILE: demo/app/App_Resources/Android/src/main/res/values-v21/colors.xml ================================================ #3d5afe ================================================ FILE: demo/app/App_Resources/Android/src/main/res/values-v21/styles.xml ================================================ ================================================ FILE: demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "size" : "29x29", "idiom" : "iphone", "filename" : "icon-29.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "icon-29@2x.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "icon-29@3x.png", "scale" : "3x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "icon-40@2x.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "icon-40@3x.png", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "icon-60@2x.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "icon-60@3x.png", "scale" : "3x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "icon-29.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "icon-29@2x.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "icon-40.png", "scale" : "1x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "icon-40@2x.png", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "icon-76.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "icon-76@2x.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "icon-83.5@2x.png", "scale" : "2x" }, { "size" : "1024x1024", "idiom" : "ios-marketing", "filename" : "icon-1024.png", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: demo/app/App_Resources/iOS/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json ================================================ { "images" : [ { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "2436h", "filename" : "Default-1125h.png", "minimum-system-version" : "11.0", "orientation" : "portrait", "scale" : "3x" }, { "orientation" : "landscape", "idiom" : "iphone", "extent" : "full-screen", "filename" : "Default-Landscape-X.png", "minimum-system-version" : "11.0", "subtype" : "2436h", "scale" : "3x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "736h", "filename" : "Default-736h@3x.png", "minimum-system-version" : "8.0", "orientation" : "portrait", "scale" : "3x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "736h", "filename" : "Default-Landscape@3x.png", "minimum-system-version" : "8.0", "orientation" : "landscape", "scale" : "3x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "667h", "filename" : "Default-667h@2x.png", "minimum-system-version" : "8.0", "orientation" : "portrait", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "filename" : "Default@2x.png", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "extent" : "full-screen", "idiom" : "iphone", "subtype" : "retina4", "filename" : "Default-568h@2x.png", "minimum-system-version" : "7.0", "orientation" : "portrait", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "ipad", "filename" : "Default-Portrait.png", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", "filename" : "Default-Landscape.png", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", "filename" : "Default-Portrait@2x.png", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", "filename" : "Default-Landscape@2x.png", "extent" : "full-screen", "minimum-system-version" : "7.0", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "filename" : "Default.png", "extent" : "full-screen", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "iphone", "filename" : "Default@2x.png", "extent" : "full-screen", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "filename" : "Default-568h@2x.png", "extent" : "full-screen", "subtype" : "retina4", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "ipad", "extent" : "to-status-bar", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", "filename" : "Default-Portrait.png", "extent" : "full-screen", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "to-status-bar", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", "filename" : "Default-Landscape.png", "extent" : "full-screen", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", "extent" : "to-status-bar", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "ipad", "filename" : "Default-Portrait@2x.png", "extent" : "full-screen", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "to-status-bar", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", "filename" : "Default-Landscape@2x.png", "extent" : "full-screen", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "LaunchScreen-AspectFill.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "LaunchScreen-AspectFill@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "LaunchScreen-Center.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "LaunchScreen-Center@2x.png", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: demo/app/App_Resources/iOS/Info.plist ================================================ CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIRequiresFullScreen UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: demo/app/App_Resources/iOS/LaunchScreen.storyboard ================================================ ================================================ FILE: demo/app/App_Resources/iOS/build.xcconfig ================================================ // You can add custom settings here // for example you can uncomment the following line to force distribution code signing // CODE_SIGN_IDENTITY = iPhone Distribution // To build for device with XCode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html // DEVELOPMENT_TEAM = YOUR_TEAM_ID; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; ================================================ FILE: demo/app/README.md ================================================ # NativeScript TypeScript Template This template creates a NativeScript app with the NativeScript hello world example, however, in this template the example is built with TypeScript. You can create a new app that uses this template with either the `--template` option. ``` tns create my-app-name --template tns-template-hello-world-ts ``` Or the `--tsc` shorthand. ``` tns create my-app-name --tsc ``` > Note: Both commands will create a new NativeScript app that uses the latest version of this template published to [npm] (https://www.npmjs.com/package/tns-template-hello-world-ts). If you want to create a new app that uses the source of the template from the `master` branch, you can execute the following: ``` tns create my-app-name --template https://github.com/NativeScript/template-hello-world-ts.git#master ``` ================================================ FILE: demo/app/app-root.xml ================================================ ================================================ FILE: demo/app/app.css ================================================ @import '~nativescript-theme-core/css/core.light.css'; page { background-color: #F4F4F4; } .tab-content { color: #808080; padding: 18; } .title { font-size: 18; margin: 0 0 8 0; color: #3c3c3c; /*horizontal-align: center;*/ } label { font-size: 16; } Label.notification, Label.hint { font-size: 14; margin: 8; } button { background-color: #E0A458; padding: 8; margin: 8; font-size: 14; border-radius: 4; } .button { color: #FFFFFF; } .button-positive { background-color: #90A959; } .button-danger { background-color: #A63D40; } .button-neutral { background-color: #6494AA; } ================================================ FILE: demo/app/app.ts ================================================ import "./bundle-config"; import * as application from "tns-core-modules/application"; // Add this so for iOS 10+ we can do some wiring (set the iOS UNUserNotificationCenter delegate, to be precise). // Not needed if your app loads the plugin on startup anyway. // You'll know you need this if on iOS 10+ notifications are not received by your app. require ("nativescript-local-notifications"); application.run({moduleName: "app-root"}); ================================================ FILE: demo/app/bundle-config.ts ================================================ if ((global).TNS_WEBPACK) { // Register tns-core-modules UI framework modules require("bundle-entry-points"); // Register application modules // This will register each `root`, `page`, `fragment` postfixed xml, css, js, ts, scss file in the app/ folder const context = (require).context("~/", true, /(root|page|fragment)\.(xml|css|js|ts|scss|less|sass)$/); global.registerWebpackModules(context); } ================================================ FILE: demo/app/main-page.ts ================================================ import { EventData } from "tns-core-modules/data/observable"; import { Page } from "tns-core-modules/ui/page"; import { HelloWorldModel } from "./main-view-model"; export function navigatingTo(args: EventData) { const page = args.object; page.bindingContext = new HelloWorldModel(); } ================================================ FILE: demo/app/main-page.xml ================================================