@@ -9,6 +9,7 @@ module Language.Javascript.JSaddle.WKWebView
99 , runHTMLWithBaseURL
1010 , runFile
1111 , mainBundleResourcePath
12+ , ApplicationState (..)
1213 , AppDelegateConfig (..)
1314 , AppDelegateNotificationConfig (..)
1415 , AuthorizationOption (..)
@@ -24,6 +25,7 @@ import Language.Javascript.JSaddle.WKWebView.Internal
2425 (jsaddleMain, jsaddleMainHTMLWithBaseURL, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
2526import System.Environment (getProgName)
2627import Foreign.C.String (CString, withCString)
28+import Foreign.C.Types (CBool, CInt)
2729import Foreign.StablePtr (StablePtr, newStablePtr)
2830import Language.Javascript.JSaddle (JSM)
2931
@@ -39,6 +41,7 @@ foreign import ccall runInWKWebView
3941 -> StablePtr (IO ()) -- applicationWillTerminate
4042 -> StablePtr (IO ()) -- applicationSignificantTimeChange
4143 -> StablePtr (CString -> IO ()) -- applicationUniversalLink
44+ -> StablePtr (CInt -> CString -> IO ()) -- applicationDidReceiveRemoteNotification
4245 -> Word64 -- whether to run requestAuthorizationWithOptions
4346 -> Word64 -- Ask for Badge authorization
4447 -> Word64 -- Ask for Sound authorization
@@ -47,6 +50,8 @@ foreign import ccall runInWKWebView
4750 -> Word64 -- registerForRemoteNotifications
4851 -> StablePtr (CString -> IO ()) -- didRegisterForRemoteNotificationsWithDeviceToken
4952 -> StablePtr (CString -> IO ()) -- didFailToRegisterForRemoteNotificationsWithError
53+ -> Word64 -- developerExtrasEnabled
54+ -> StablePtr (CString -> IO CBool) -- applicationOpenFile
5055 -> IO ()
5156
5257data AppDelegateConfig = AppDelegateConfig
@@ -59,7 +64,25 @@ data AppDelegateConfig = AppDelegateConfig
5964 , _appDelegateConfig_applicationWillTerminate :: IO ()
6065 , _appDelegateConfig_applicationSignificantTimeChange :: IO ()
6166 , _appDelegateConfig_applicationUniversalLink :: CString -> IO ()
67+ -- ^ Called when the app is launched from a URL. 'CString' contains the URL.
68+ --
69+ -- The Core Foundation plist key CFBundleURLTypes controls which URL schemes
70+ -- the app should respond to.
71+ , _appDelegateConfig_applicationDidReceiveRemoteNotification :: ApplicationState -> CString -> IO ()
72+ -- ^ Called when the application receives a remote notification.
73+ -- 'ApplicationState' is the current state of the app.
74+ -- The 'CString' JSON-encoded user info contained in the notification.
75+ -- For more information see https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623117-application?language=objc
6276 , _appDelegateConfig_appDelegateNotificationConfig :: AppDelegateNotificationConfig
77+ , _appDelegateConfig_developerExtrasEnabled :: Bool
78+ -- ^ Allow devtools in the app. Defaults to 'True'
79+ , _appDelegateConfig_applicationOpenFile :: CString -> IO Bool
80+ -- ^ Called when the app is launched by opening a file. 'CString' contains
81+ -- the file path. Return value is 'True' if the file was successfully
82+ -- opened. Defaults to ignoring the file and returning 'False'.
83+ --
84+ -- The Core Foundation plist key CFBundleDocumentTypes controls which file
85+ -- types should be associated with the app.
6386 }
6487
6588instance Default AppDelegateConfig where
@@ -73,7 +96,10 @@ instance Default AppDelegateConfig where
7396 , _appDelegateConfig_applicationWillTerminate = return ()
7497 , _appDelegateConfig_applicationSignificantTimeChange = return ()
7598 , _appDelegateConfig_applicationUniversalLink = \_ -> return ()
99+ , _appDelegateConfig_applicationDidReceiveRemoteNotification = \_ _ -> return ()
76100 , _appDelegateConfig_appDelegateNotificationConfig = def
101+ , _appDelegateConfig_developerExtrasEnabled = True
102+ , _appDelegateConfig_applicationOpenFile = \_ -> return False
77103 }
78104
79105data AuthorizationOption = AuthorizationOption_Badge
@@ -82,6 +108,12 @@ data AuthorizationOption = AuthorizationOption_Badge
82108 | AuthorizationOption_CarPlay
83109 deriving (Show, Read, Eq, Ord)
84110
111+data ApplicationState = ApplicationState_Active
112+ | ApplicationState_Inactive
113+ | ApplicationState_Background
114+ | ApplicationState_Unknown CInt
115+ deriving (Show, Read, Eq, Ord)
116+
85117data AppDelegateNotificationConfig = AppDelegateNotificationConfig
86118 { _appDelegateNotificationConfig_requestAuthorizationWithOptions :: Maybe (Set AuthorizationOption)
87119 , _appDelegateNotificationConfig_registerForRemoteNotifications :: Bool
@@ -144,6 +176,14 @@ run' cfg main = do
144176 applicationWillTerminate <- newStablePtr $ _appDelegateConfig_applicationWillTerminate cfg
145177 applicationSignificantTimeChange <- newStablePtr $ _appDelegateConfig_applicationSignificantTimeChange cfg
146178 applicationUniversalLink <- newStablePtr $ _appDelegateConfig_applicationUniversalLink cfg
179+ applicationDidReceiveRemoteNotification <- newStablePtr $ \n s -> do
180+ let appState = case n of
181+ 0 -> ApplicationState_Active
182+ 1 -> ApplicationState_Inactive
183+ 2 -> ApplicationState_Background
184+ _ -> ApplicationState_Unknown n
185+ _appDelegateConfig_applicationDidReceiveRemoteNotification cfg appState s
186+ applicationOpenFile <- newStablePtr $ fmap fromBool . _appDelegateConfig_applicationOpenFile cfg
147187
148188 -- AppDelegate notification configuration
149189 let ncfg = _appDelegateConfig_appDelegateNotificationConfig cfg
@@ -166,6 +206,7 @@ run' cfg main = do
166206 applicationWillTerminate
167207 applicationSignificantTimeChange
168208 applicationUniversalLink
209+ applicationDidReceiveRemoteNotification
169210 (fromBool requestAuthorizationWithOptions)
170211 (fromBool $ Set.member AuthorizationOption_Badge authorizationOptions)
171212 (fromBool $ Set.member AuthorizationOption_Sound authorizationOptions)
@@ -174,3 +215,5 @@ run' cfg main = do
174215 (fromBool registerForRemoteNotifications)
175216 didRegisterForRemoteNotificationsWithDeviceToken
176217 didFailToRegisterForRemoteNotificationsWithError
218+ (fromBool $ _appDelegateConfig_developerExtrasEnabled cfg)
219+ applicationOpenFile