Skip to content

Start a native view relative to your cordova app, or an external app

License

Notifications You must be signed in to change notification settings

mfdeveloper/cordova-plugin-nativeview

Folders and files

NameName
Last commit message
Last commit date

Latest commit

446da01 · Dec 13, 2020

History

61 Commits
Oct 9, 2018
Aug 20, 2019
Sep 4, 2017
Oct 15, 2020
Apr 3, 2020
Sep 25, 2019
Aug 20, 2019
Oct 30, 2018
Sep 4, 2017
Apr 3, 2020
Sep 4, 2017
Nov 6, 2018
Aug 20, 2019
Dec 13, 2020
Apr 3, 2020
Aug 20, 2019

Repository files navigation

npm version


title: NativeView description: Starts native view or another app, from a cordova app.

cordova-plugin-nativeview

Start an UIViewController(IOS) or Activity(Android) relative to your cordova app, or an external app (based in cordova plugin startapp cordova plugin)

You can use this in a standalone project (basic cordova project), or into an existing native Android/IOS application, like described in Embed Cordova in native apps

OBS: If you wish just EXIT from cordova app or back to native view (Android only), use: navigator['app'].exitApp()

Installation

cordova plugin add cordova-plugin-nativeview --save

# using IONIC
ionic cordova plugin add cordova-plugin-nativeview --save

Extra: Native app (Android/IOS native code)

ALL PLATFORMS

Make sure that config.xml file contains the <feature> tag below:

<feature name="NativeView">
    <param name="android-package" value="br.com.mfdeveloper.cordova.NativeView" />
    <param name="onload" value="true" />
</feature>

IOS

  • Copy the config.xml from your cordova project to root XCode project directory.
  • Install cocoapods
  • Add this plugin like a pod dependency:
# Objective-C version (Default)
pod 'cordova-plugin-nativeview', '~> 1.0.7'

# Swift version (needs update to latest Objective-c implementations)
pod 'cordova-plugin-nativeview', :git => 'https://github.com/mfdeveloper/cordova-plugin-nativeview.git', :branch => 'swift'

ANDROID

Add this code snippet below to your build.gradle file

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

implementation ('com.github.mfdeveloper:cordova-plugin-nativeview:1.0.7')

This dependency is added using jitpack

Or add, the NativeView class directly to your android project:

  • From your cordova project:

    • Copy the content off platforms/android/assets/www folder to your android project (usually, app/src/main/assets). Or create a gradle task to do this.
    • Copy the config.xml to src/main/res/xml android project folder.
  • Clone this repo, and copy the class: src/android/NativeView.java to your Android project

  • Or create a .jar or a .aar that contains this class, and import like a Android module dependency

  • Verify if the code snippet below is present in your AndroidManifest.xml. This is required to open a specific Activity from a Intent (using [package + activityName])

<activity android:name=".MyActivity" >
    <intent-filter>
        <action android:name="com.mypackage.MyActivity" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

If this filter not exists in AndroidManifest.xml, you will get this error: No Activity found to handle Intent splash screen

  • Build/Run your android project!

Supported Platforms

  • Android Android
  • iOS iOS

Methods

NativeView.show(packageOrClassName: string, className: string)

OR

NativeView.show(params: object)

Shows a native view.

ANDROID

document.addEventListener("deviceready", function() {
    //  pass a package name and a activity by params
    cordova.plugins.NativeView.show('com.mycompany', 'MyActivity')
    .then(function() {
      
      /**
       * Do something when open the activity.
       * This code here will be executed in paralell,
       * not after open.
       */
    }).catch(function(error) {
        
        /**
         * error.success => Will be "false"
         * error.name => Exception type from the captured error 
         * error.message => A exception message
         */
    });

    // Preferably, pass the Package and Activity in a json
    cordova.plugins.NativeView.show({
        packageName: 'com.mycompany',
        className: 'MyActivity',
    });

}, false);

IOS

  • Pass Storyboard name and storyboard id
document.addEventListener("deviceready", function() {

    /*
     * The first param is a storyboard name, and
     * the second param is a storyboardId 
     * (conventionally the same name of the ViewController class name)
     */
    cordova.plugins.NativeView.show('MyStoryboard', 'MyUIViewController')
    .then(function() {
      
      /**
       * Do something when open the activity.
       * This code here will be executed in paralell,
       * not after open.
       */
    });

    // Preferably, pass the ViewController and Storyboard in a json
    cordova.plugins.NativeView.show({
        storyboardName: 'MyStoryboard',
        viewControllerName: 'MyUIViewController'
    });

}, false);
  • Pass only the ViewController class/xib name
/*
*  Or, pass only the UIViewController name, if you don't
*  use storyboards in your project. This plugin try instantiate
*  from a ".xib" file. If not exists, try instantiate just by
*  UIViewController class.
* 
*  By convention, your ViewController class/xib needs contains 'Controller' 
*  string in any part of the name 
* .
*/
cordova.plugins.NativeView.show('MyUIViewController');

// Preferably, pass the ViewController in a json
cordova.plugins.NativeView.show({
    viewControllerName: 'MyUIViewController'
});
  • Pass only the Storyboard name
/*
*  Or, pass only the Storyboard name. If you don't pass a 
*  ViewController class name in second param, the 
*  "rootViewController" of your storyboard will be
*  instantiated. 
* 
*  By convention, your Storyboard name needs contains 'Storyboard' 
*  string in any part of the name
*/
cordova.plugins.NativeView.show('MyStorboard');

// Preferably, pass the Storyboard in a json
cordova.plugins.NativeView.show({
    storyboardName: 'MyStorboard'
});

NativeView.checkIfAppInstalled(uri: string)

OR

NativeView.checkIfAppInstalled(params: { uri: string })

Verify if another app that responds to a uri is installed on device.

cordova.plugins.NativeView.checkIfAppInstalled('another-app://custom-host')
.then(function() {
    console.log('The app is INSTALLED!');
}).catch(function(error) {
    console.log("The app is NOT INSTALLED!");
    throw error;
});

// Preferably, pass the uri in a json
cordova.plugins.NativeView.show({
    uri: 'another-app://custom-host'
});

NativeView.showMarket(marketId: string)

OR

NativeView.showMarket(params: { marketId: string })

Open the store (Apple Store/Google Play) app installed in your device, or in a browser.

ANDROID

// Pass a app package on Android (found this on Google Play)
cordova.plugins.NativeView.showMarket('my.company.other.app');

// Preferably, pass the marketId in a json
cordova.plugins.NativeView.show({
    marketId: 'my.company.other.app'
});

IOS

// Pass a app id from the Apple Store
cordova.plugins.NativeView.showMarket('idxyz1?mt=x');

// Preferably, pass the marketId in a json
cordova.plugins.NativeView.showMarket({
    marketId: 'idxyz1?mt=x'
});

NativeView.getBuildVariant(params: { catchError: boolean })

Get the current Android build variant configured in

ANDROID (ONLY)

/*
* Pass the param "catchError", and use the `catch()` method to verify an 
* error (if happens)
*
* Otherwise, this method will return the variant like a string,
* or null if not found.
*
* This is useful if you need show a NativeView by environment
*/
cordova.plugins.NativeView.getBuildVariant({
    catchError: true
}).then(function(value) {
    console.log('My environment is: ' + value);
}).catch(function(error) {
    if (!error.success && error.message) {
        console.log(error.message);
    }
});

/* Optionally, don't pass any parameter and get the Build Variant 
 * value, or NULL
 */
cordova.plugins.NativeView.getBuildVariant()
.then(function(value) {
    console.log('My environment is: ' + value);
});

IONIC

Replace document.addEventListener event to this.platform.ready().then(...) service method. See IONIC Platform documentation

License

This project is licensed under the MIT License - see the LICENSE file for details

TODO

  • Better catch IOS exception from JS
  • Update Swift implementation
  • Add cordova integration tests