# Native
[![Gem Version](https://badge.fury.io/rb/native.svg)](https://badge.fury.io/rb/native)
Creating cross-platform apps with Rails has never been this simple, pleasing & powerful. With very little code you can bring any Rails web application to every desktop or mobile platform you can think of.
**Features:**
* Convert your Rails app to a native app
* Add custom assets for any of your platforms
* Customize your code for every platform by utilizing Native's view helpers
* Remember what apps/platforms your users are on
* Add native notifications
**Platforms:**
* Android
* iOS
* Universal Windows Platform (Windows 10)
* Chrome
* OSX / MacOS
* Windows x32 / x64
* Linux x32 / x64
---
Native is being powered by **[NativeGap](https://nativegap.com)**.
---
## Table of Contents
* [Installation](#installation)
* [Usage](#usage)
* [NativeGap](#nativegap)
* [Assets](#assets)
* [App methods](#app-methods)
* [Associate objects](#associate-objects)
* [View methods](#view-methods)
* [Notifications](#notifications)
* [Content scaling (Android)](#content-scaling-android)
* [Configuration](#configuration)
* [To Do](#to-do)
* [Contributing](#contributing)
* [Contributors](#contributors)
* [Semantic versioning](#semantic-versioning)
* [License](#license)
---
## Installation
Native works with Rails 5.0 onwards. You can add it to your `Gemfile` with:
```ruby
gem 'native'
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install native
If you always want to be up to date fetch the latest from GitHub in your `Gemfile`:
```ruby
gem 'native', github: 'NativeGap/native'
```
Now run the generator:
$ rails g native
To wrap things up, migrate the changes into your database:
$ rails db:migrate
Let's move on to your devise class. For instance `User` located in `app/models/user.rb`. Associate belonging `App` objects:
```ruby
uses_native_apps
```
Lastly, got to your routes file (`config/routes.rb`) and mount the `Native::Engine` class:
```ruby
mount Native::Engine, at: '/native'
```
## Usage
### NativeGap
While this gem assists you in creating a true cross-platform app, [NativeGap](https://nativegap.com) is still needed to create the actual native code. That's not too big of a deal though, NativeApp can be used entirely for free ([learn more](https://nativegap.com/pricing)) and it has an extensive [documentation](https://nativegap.com/guide).
Getting started with NativeGap:
1. Create a new NativeGap app
2. Wait until platforms processed
3. For each platform you want to support: click `Update` and enter the start path. The start path consists of your `Native::Engine` mount path and the platform. It could look like this: `native/android`
That's it!
**Note:** Native also supports the coexistence of multiple NativeGap apps with only one Rails app as a source.
### Assets
With Native it is fairly simple to add platform specific stylesheets and scripts. In your assets directory you have a new folder for your `javascripts` and `stylesheets` (`app/assets/.../native`). In these two folders you are able to add custom assets for specific platforms including `web` specific assets.
You simple have to include ...
```ruby
= native_assets
```
... in the `head` tag of your layout after your other asset include tags.
### App methods
Native introduces an `App` ActiveRecord model. Every object of your devise class can have multiple apps.
```ruby
a = App.first
# Returns associated object. Can return `nil`.
a.owner
# Returns lowercase string of platform.
d.platform
# Returns url of mounted `NativeGap::Engine` class. This can be used to differentiate between apps, if you have multiple NativeGap apps with one Rails app as source.
d.url
# Some timestamps
d.last_used
d.created_at
d.updated_at
# Returns activerecord array of apps from a specific platform
d.android
# ...
d.lin64
# Group apps by `platform`
d.platforms
# Group apps by `url`
d.apps
```
#### Associate objects
If you are using Devise and your model is named `User`, the object returned by `current_user` will automatically be associated with the current app. If your Devise model is not named `User` or you are using a different user-management solution that does not implement a `current_user` method, you are able to override this default behavior.
Let's say our Devise model is named `Admin`. Just add a `private` method to your `ApplicationController`:
```ruby
def set_app_owner
current_admin if current_admin
end
```
**Note:** Essentially `set_app_owner` has to return a class object *or* `nil`.
### View methods
**`current_app`** Returns `App` object related to current session. Returns `nil` when the Rails is being used normally.
**`current_platform`** Returns lowercase string of current platform. Returns `'web'` when the Rails is being used normally.
**`native_assets`** Returns platform specific `` and `