Deploying Native Apps
In order to publish a PWA as a stand alone native application in the App Store itβs required to add extra functionality which is not available by opening PWA in a web browser. Allowing to receive push notifications, scan QR codes, and access user contacts might be such features.
To achieve this goal itβs required to create a native iOS app containing WKWebView
instance (references as webView in the following example code) and WKScriptMessageHandler
protocol implementation (JSMessageHandler
in example). PWA should provide a UI and send messages using Web Kit API. This API is injected by WKWebView
itself and is accessed by calling a function in a following manner:
Example project is configured to respond to following messages: exampleMessage
, exampleMessageWithArgument
To invoke them in the example project itβs required to make following function calls on PWA side:
Returning to the native code of the example project letβs take a look at the JSMessageHandler
class. It consists of the two parts. First one is implementation details and it declares constants with message names and declares two closure properties which should be called when a message from the PWA side is received.
Second part is the userContentController
function and this is the WKScriptMessageHandler
protocol function. Itβs called when a message to Web Kit API is sent from the web side. WKScriptMessage
is passed as an argument and this object contains the actual message name and arguments passed to it. Itβs a WKScriptMessageHandler
responsibility to identify the message and convert the argument passed if needed. In the following example itβs achieved by using a switch operator and calling a corresponding closure if message is identified.
Second class of the example project is a ViewController
class which creates a JSMessageHandler
instance and configures WKWebView
instance with it. Following function creates WKWebViewConfiguration
instance:
First of all there is a WKUserContentController
instance created. Afterwards a JSMessageHandler
instance is created and its actions are populated. In this example these actions just report to the console and then call window.exampleActionCallback()
or window.exampleActionWithArgumentCallback()
correspondingly. Itβs suggested that these functions are added by PWA and it will process the calls to them. In real world project this process most likely will be asynchronous and native code will call back to PWA after user interaction (getting QR code, accessing contacts etc)
Afterwards the content controller is instructed to pass the message handling for each expected message to create a JSMessageHandler
instance. WKWebViewConfiguration
is created, configured and returned afterwards.
WKWebView
instance is created as follows and should open PWA by URL later. The rest of the code is a standard UIKit / WebKit and is skipped for clarity. See attached example project. Itβs configured to open a non-existing "https://your.pwa.com" site. You can change it to your own PWA URL.
Last updated