@@ -6,6 +6,7 @@ module Language.Javascript.JSaddle.WKWebView
66 , runWithAppConfig
77 , runFile
88 , mainBundleResourcePath
9+ , ApplicationState (..)
910 , AppDelegateConfig (..)
1011 , AppDelegateNotificationConfig (..)
1112 , AuthorizationOption (..)
@@ -20,6 +21,7 @@ import Foreign.Marshal.Utils (fromBool)
2021import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
2122import System.Environment (getProgName)
2223import Foreign.C.String (CString, withCString)
24+import Foreign.C.Types (CInt)
2325import Foreign.StablePtr (StablePtr, newStablePtr)
2426import Language.Javascript.JSaddle (JSM)
2527
@@ -35,6 +37,7 @@ foreign import ccall runInWKWebView
3537 -> StablePtr (IO ()) -- applicationWillTerminate
3638 -> StablePtr (IO ()) -- applicationSignificantTimeChange
3739 -> StablePtr (CString -> IO ()) -- applicationUniversalLink
40+ -> StablePtr (CInt -> CString -> IO ()) -- applicationDidReceiveRemoteNotification
3841 -> Word64 -- whether to run requestAuthorizationWithOptions
3942 -> Word64 -- Ask for Badge authorization
4043 -> Word64 -- Ask for Sound authorization
@@ -55,6 +58,7 @@ data AppDelegateConfig = AppDelegateConfig
5558 , _appDelegateConfig_applicationWillTerminate :: IO ()
5659 , _appDelegateConfig_applicationSignificantTimeChange :: IO ()
5760 , _appDelegateConfig_applicationUniversalLink :: CString -> IO ()
61+ , _appDelegateConfig_applicationDidReceiveRemoteNotification :: ApplicationState -> CString -> IO ()
5862 , _appDelegateConfig_appDelegateNotificationConfig :: AppDelegateNotificationConfig
5963 }
6064
@@ -69,6 +73,7 @@ instance Default AppDelegateConfig where
6973 , _appDelegateConfig_applicationWillTerminate = return ()
7074 , _appDelegateConfig_applicationSignificantTimeChange = return ()
7175 , _appDelegateConfig_applicationUniversalLink = \_ -> return ()
76+ , _appDelegateConfig_applicationDidReceiveRemoteNotification = \_ _ -> return ()
7277 , _appDelegateConfig_appDelegateNotificationConfig = def
7378 }
7479
@@ -78,6 +83,12 @@ data AuthorizationOption = AuthorizationOption_Badge
7883 | AuthorizationOption_CarPlay
7984 deriving (Show, Read, Eq, Ord)
8085
86+data ApplicationState = ApplicationState_Active
87+ | ApplicationState_Inactive
88+ | ApplicationState_Background
89+ | ApplicationState_Unknown CInt
90+ deriving (Show, Read, Eq, Ord)
91+
8192data AppDelegateNotificationConfig = AppDelegateNotificationConfig
8293 { _appDelegateNotificationConfig_requestAuthorizationWithOptions :: Maybe (Set AuthorizationOption)
8394 , _appDelegateNotificationConfig_registerForRemoteNotifications :: Bool
@@ -131,6 +142,13 @@ run' mUrl cfg f = do
131142 applicationWillTerminate <- newStablePtr $ _appDelegateConfig_applicationWillTerminate cfg
132143 applicationSignificantTimeChange <- newStablePtr $ _appDelegateConfig_applicationSignificantTimeChange cfg
133144 applicationUniversalLink <- newStablePtr $ _appDelegateConfig_applicationUniversalLink cfg
145+ applicationDidReceiveRemoteNotification <- newStablePtr $ \n s -> do
146+ let appState = case n of
147+ 0 -> ApplicationState_Active
148+ 1 -> ApplicationState_Inactive
149+ 2 -> ApplicationState_Background
150+ _ -> ApplicationState_Unknown n
151+ _appDelegateConfig_applicationDidReceiveRemoteNotification cfg appState s
134152
135153 -- AppDelegate notification configuration
136154 let ncfg = _appDelegateConfig_appDelegateNotificationConfig cfg
@@ -153,6 +171,7 @@ run' mUrl cfg f = do
153171 applicationWillTerminate
154172 applicationSignificantTimeChange
155173 applicationUniversalLink
174+ applicationDidReceiveRemoteNotification
156175 (fromBool requestAuthorizationWithOptions)
157176 (fromBool $ Set.member AuthorizationOption_Badge authorizationOptions)
158177 (fromBool $ Set.member AuthorizationOption_Sound authorizationOptions)