Skip to main content

Working natively with JavaScript in iOS and Android without WebView

Using JavaScript code from native code without using a WebView (sic!) can be really useful to

  • introduce dynamic functionality that was updatable without need of updating the app
  • shorter iteration cycles
  • share code between backend and native iOS and Android apps
You can have business logic provided by a JavaScript that then controls the app that inject native functionality in the JavaScript context.
You could even write an A/B testing framework based on this approach.


iOS
iOS offers the native JavaScriptCore:
Evaluate JavaScript programs from within an app, and support JavaScript scripting of your app.

So you can evaluate a script and read its return value natively:

context.evaluateScript(myLib);
let result = context.evaluateScript("myFunction();")
let myFunction = context.objectForKeyedSubscription("myFunction");
let parametrizedResult = myFunction.invokeMethod(...)

Or you can inject a native object into the JavaScript engine:
@objc protocol MyJSProtocol: JSExport {
    var myVar: String {get set}
}

@objc class MyObject: NSObject, MyJSProtocol {
   dynamic var myVar: String
}

...
context.setObject(MyObject.self, forKeyedSubscript: "MyObject")

Documentation JavaScriptCore


Android
For Android there are methods to inject native objects into the JavaScript context in a WebView; but you always have to initiate a WebView which is pretty heavy-weight.

There are third party libs that fill this gap:

  1. J2V8, a Java wrapper around Google’s V8 JavaScript engine.
  2. JS Evaluator for Android, based around the native Android WebView.
  3. AndroidJSCore, a Java wrapper around the WebKit JavaScriptCore engine.
  4. Duktape Android, the Duktape embeddable JavaScript engine packaged for Android.
Most stable and best performing candidate proved to be J2V8.

Comments

  1. An Android app in JavaScript sounds like a fascinating approach to mobile development. Leveraging JavaScript allows developers to utilize their existing web development skills and tools, potentially streamlining the process. However, I'm curious about performance and native device integration. How does the app handle hardware features? Security concerns also come to mind. Nonetheless, it's an exciting prospect that opens up new possibilities. I'd love to see a detailed comparison with traditional Android development to better understand its benefits and limitations. Great post!

    ReplyDelete

Post a Comment

Most Favorite Posts

Server-driven UI (SDUI): Meet Zalandos AppCraft and AirBnB Lona

A short WTF: Joe Birch:  SERVER DRIVEN UI, PART 1: THE CONCEPT Zalando seems to follow the SDUI principle as well - defining a common design language and construct the screens on the backend while displaying them natively on the clients. They even go one step further; they implemented a mighty toolset to enable non-technical stakeholders to define their own native app screens Compass: Web tooling to create screens and bind data Beetroot: Backend service that combines the screen layout definition with the data Lapis/Golem: iOS/Android UI render engines Crazy cool! Good job, guys (when you do an open-source release?) To even move faster a Flutter based UI render engine implementation was great! See also AirBnB Lona SDUI approach Building a Visual Language Why Dropbox sunsetted its universal C++ mobile project and AirBnB its React Native implementation

Google Developers: Three Flaws in Software Design

Part 1: Three Flaws in Software Design - Part 1: Writing Code that isn't Needed Part 2: Not Making the Code Easy to Change Part 3: Being Too Generic Part 4: Incremental Development & Design + Wrap-up Code Simplicity Presentation

Dark Theme (Dark Mode) in Android WebViews, WKWebViews and CSS

So your apps just implemented a shiny new dark theme and it’s looking 👌 There are lots of benefits to having a dark theme in your application, and having it consistent throughout your application allows for a great user experience. But what happens when the the user runs into a WebView in your app? Support: if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { ... } Set: WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON) Current setting: val forceDarkMode = WebSettingsCompat.getForceDark(webView.settings) Joe Birch Assuming your question is asking how to change the colors of the HTML content you are displaying in a WKWebView based on whether light or dark mode is in effect, there is nothing you do in your app's code. All changes need to be in the CSS being used by your HTML content. CSS dark mode via :root variables, explicit colors and @media query: :root {     color-scheme: light dark;      ...

iOS and Android Campaign Measurement for App installs

Android: Google Play Campaign Measurement Google Play Campaign Measurement is a feature of Google Mobile App Analytics that enables the attribution of native Android app installs to advertising campaigns and other marketing efforts in your Google Analytics app reports. Verifying that your Google Play Campaign Measurement implementatin is working properly before the application is submitted to Google Play ensures that campaign measurement data is as accurate as possible at the time of launch. This guide will illustrate one means of testing a Google Play Campaign Measurement implementation. Developers Google Mobile App Tracking iOS: Cookie Tracking / Browser Identification For iOS no such standard way exists. The main workarounds involve the setting of a cookie in the ad and then opening a WebView with the ad again after install - alternate identify the device by the informations the browser publishes (IP, accept-encoding, ...). There are some rumors Apple woul...

Judo App - Server Driven UI out of the box

Judo App Judo brings server-driven UI to your iOS and Android apps. Build user interfaces visually in a fraction of time and publish them instantly without submitting to the app store. Build Experiences - With No Code The Judo app for macOS, available through the App Store, is built for design professionals with common keyboard shortcuts and familiar concepts like canvas, layers and inspector panel. Workflow is streamlined with the ability to drag and drop media files directly into your experiences and manage your own Judo files in Finder. Manage Creative Execution A Judo experience is interactive and can include text, images, video and buttons. An experience may be part of a screen, a single screen, or more typically multiple linked screens. Judo supports screen transitions, carousels, horizontal scrolling and modals. Clients can add custom fonts and define global colors and these are updates applied universally. Effortlessly Deploy Judo Cloud syncs your experiences with your iOS and ...

Unity3d - 3D Game Framework

Unity 3 is a game development tool that has been designed to let you focus on creating amazing games. Unity 3d

Implementing UI tests on iOS and Android using screenshot comparison tools

Have you ever thought when writing or maintaining UI tests, there must be a better way? Take a look at screenshot tests provided by Google Firebase and Facebook: ios-snapshot-test-case A "snapshot test case" takes a configured UIView or CALayer and uses the renderInContext: method to get an image snapshot of its contents. It compares this snapshot to a "reference image" stored in your source code repository and fails the test if the two images don't match. GitHub Facebook screenshot-tests-for-android Testing rendering for your Android app is hard. How do you prevent visual regressions in paddings and margins and colors from creeping in? Iterating on UI code is hard. How do you quickly verify that your layout or view changes work correctly in all configurations? screenshot-tests-for-android can solve these problems by providing a test framework that checks for visual differences across changes. GitHub Facebook Google Firebase Test Lab Test Lab l...