on master help sign in
Add _appDelegateConfig_applicationDidReceiveRemoteNotification
84b139cCale Gibbard
jsaddle-wkwebview/cbits-uikit/AppDelegate.m+12
@@ -5,6 +5,7 @@
5
5
6extern void callIO(HsStablePtr);
6extern void callIO(HsStablePtr);
7extern void callWithCString(const char * _Nonnull, HsStablePtr);
7extern void callWithCString(const char * _Nonnull, HsStablePtr);
8+extern void callWithCIntCString(int n, const char * _Nonnull, HsStablePtr);
8
9
9@interface AppDelegate ()
10@interface AppDelegate ()
10
11
@@ -20,6 +21,7 @@ HsStablePtr global_applicationWillEnterForeground = 0;
20HsStablePtr global_applicationWillTerminate = 0;
21HsStablePtr global_applicationWillTerminate = 0;
21HsStablePtr global_applicationSignificantTimeChange = 0;
22HsStablePtr global_applicationSignificantTimeChange = 0;
22HsStablePtr global_applicationUniversalLink = 0;
23HsStablePtr global_applicationUniversalLink = 0;
24+HsStablePtr global_applicationDidReceiveRemoteNotification = 0;
23uint64_t global_requestAuthorizationWithOptions = 0;
25uint64_t global_requestAuthorizationWithOptions = 0;
24uint64_t global_requestAuthorizationOptionBadge = 0;
26uint64_t global_requestAuthorizationOptionBadge = 0;
25uint64_t global_requestAuthorizationOptionSound = 0;
27uint64_t global_requestAuthorizationOptionSound = 0;
@@ -115,6 +117,14 @@ HsStablePtr global_didFailToRegisterForRemoteNotificationsWithError = 0;
115 if ([userInfo valueForKeyPath:@"aps.badge"] != nil) {
117 if ([userInfo valueForKeyPath:@"aps.badge"] != nil) {
116 [UIApplication sharedApplication].applicationIconBadgeNumber=[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue];
118 [UIApplication sharedApplication].applicationIconBadgeNumber=[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue];
117 }
119 }
120+ NSError *error;
121+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error:&error];
122+ if (jsonData) {
123+ NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
124+ callWithCIntCString((int) application.applicationState, [jsonString UTF8String], global_applicationDidReceiveRemoteNotification);
125+ } else {
126+ NSLog(@"jsaddle-wkwebview didReceiveRemoteNotification handler: error while serialising push notification as JSON");
127+ }
118 completionHandler(UIBackgroundFetchResultNewData);
128 completionHandler(UIBackgroundFetchResultNewData);
119}
129}
120
130
@@ -152,6 +162,7 @@ void runInWKWebView(HsStablePtr handler,
152 HsStablePtr hs_applicationWillTerminate,
162 HsStablePtr hs_applicationWillTerminate,
153 HsStablePtr hs_applicationSignificantTimeChange,
163 HsStablePtr hs_applicationSignificantTimeChange,
154 HsStablePtr hs_applicationUniversalLink,
164 HsStablePtr hs_applicationUniversalLink,
165+ HsStablePtr hs_applicationDidReceiveRemoteNotification,
155 const uint64_t hs_requestAuthorizationWithOptions,
166 const uint64_t hs_requestAuthorizationWithOptions,
156 const uint64_t hs_requestAuthorizationOptionBadge,
167 const uint64_t hs_requestAuthorizationOptionBadge,
157 const uint64_t hs_requestAuthorizationOptionSound,
168 const uint64_t hs_requestAuthorizationOptionSound,
@@ -171,6 +182,7 @@ void runInWKWebView(HsStablePtr handler,
171 global_applicationWillTerminate = hs_applicationWillTerminate;
182 global_applicationWillTerminate = hs_applicationWillTerminate;
172 global_applicationSignificantTimeChange = hs_applicationSignificantTimeChange;
183 global_applicationSignificantTimeChange = hs_applicationSignificantTimeChange;
173 global_applicationUniversalLink = hs_applicationUniversalLink;
184 global_applicationUniversalLink = hs_applicationUniversalLink;
185+ global_applicationDidReceiveRemoteNotification = hs_applicationDidReceiveRemoteNotification;
174 global_requestAuthorizationWithOptions = hs_requestAuthorizationWithOptions;
186 global_requestAuthorizationWithOptions = hs_requestAuthorizationWithOptions;
175 global_requestAuthorizationOptionBadge = hs_requestAuthorizationOptionBadge;
187 global_requestAuthorizationOptionBadge = hs_requestAuthorizationOptionBadge;
176 global_requestAuthorizationOptionSound = hs_requestAuthorizationOptionSound;
188 global_requestAuthorizationOptionSound = hs_requestAuthorizationOptionSound;
jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+19
@@ -6,6 +6,7 @@ module Language.Javascript.JSaddle.WKWebView
6 , runWithAppConfig
6 , runWithAppConfig
7 , runFile
7 , runFile
8 , mainBundleResourcePath
8 , mainBundleResourcePath
9+ , ApplicationState (..)
9 , AppDelegateConfig (..)
10 , AppDelegateConfig (..)
10 , AppDelegateNotificationConfig (..)
11 , AppDelegateNotificationConfig (..)
11 , AuthorizationOption (..)
12 , AuthorizationOption (..)
@@ -20,6 +21,7 @@ import Foreign.Marshal.Utils (fromBool)
20import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
21import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
21import System.Environment (getProgName)
22import System.Environment (getProgName)
22import Foreign.C.String (CString, withCString)
23import Foreign.C.String (CString, withCString)
24+import Foreign.C.Types (CInt)
23import Foreign.StablePtr (StablePtr, newStablePtr)
25import Foreign.StablePtr (StablePtr, newStablePtr)
24import Language.Javascript.JSaddle (JSM)
26import Language.Javascript.JSaddle (JSM)
25
27
@@ -35,6 +37,7 @@ foreign import ccall runInWKWebView
35 -> StablePtr (IO ()) -- applicationWillTerminate
37 -> StablePtr (IO ()) -- applicationWillTerminate
36 -> StablePtr (IO ()) -- applicationSignificantTimeChange
38 -> StablePtr (IO ()) -- applicationSignificantTimeChange
37 -> StablePtr (CString -> IO ()) -- applicationUniversalLink
39 -> StablePtr (CString -> IO ()) -- applicationUniversalLink
40+ -> StablePtr (CInt -> CString -> IO ()) -- applicationDidReceiveRemoteNotification
38 -> Word64 -- whether to run requestAuthorizationWithOptions
41 -> Word64 -- whether to run requestAuthorizationWithOptions
39 -> Word64 -- Ask for Badge authorization
42 -> Word64 -- Ask for Badge authorization
40 -> Word64 -- Ask for Sound authorization
43 -> Word64 -- Ask for Sound authorization
@@ -55,6 +58,7 @@ data AppDelegateConfig = AppDelegateConfig
55 , _appDelegateConfig_applicationWillTerminate :: IO ()
58 , _appDelegateConfig_applicationWillTerminate :: IO ()
56 , _appDelegateConfig_applicationSignificantTimeChange :: IO ()
59 , _appDelegateConfig_applicationSignificantTimeChange :: IO ()
57 , _appDelegateConfig_applicationUniversalLink :: CString -> IO ()
60 , _appDelegateConfig_applicationUniversalLink :: CString -> IO ()
61+ , _appDelegateConfig_applicationDidReceiveRemoteNotification :: ApplicationState -> CString -> IO ()
58 , _appDelegateConfig_appDelegateNotificationConfig :: AppDelegateNotificationConfig
62 , _appDelegateConfig_appDelegateNotificationConfig :: AppDelegateNotificationConfig
59 }
63 }
60
64
@@ -69,6 +73,7 @@ instance Default AppDelegateConfig where
69 , _appDelegateConfig_applicationWillTerminate = return ()
73 , _appDelegateConfig_applicationWillTerminate = return ()
70 , _appDelegateConfig_applicationSignificantTimeChange = return ()
74 , _appDelegateConfig_applicationSignificantTimeChange = return ()
71 , _appDelegateConfig_applicationUniversalLink = \_ -> return ()
75 , _appDelegateConfig_applicationUniversalLink = \_ -> return ()
76+ , _appDelegateConfig_applicationDidReceiveRemoteNotification = \_ _ -> return ()
72 , _appDelegateConfig_appDelegateNotificationConfig = def
77 , _appDelegateConfig_appDelegateNotificationConfig = def
73 }
78 }
74
79
@@ -78,6 +83,12 @@ data AuthorizationOption = AuthorizationOption_Badge
78 | AuthorizationOption_CarPlay
83 | AuthorizationOption_CarPlay
79 deriving (Show, Read, Eq, Ord)
84 deriving (Show, Read, Eq, Ord)
80
85
86+data ApplicationState = ApplicationState_Active
87+ | ApplicationState_Inactive
88+ | ApplicationState_Background
89+ | ApplicationState_Unknown CInt
90+ deriving (Show, Read, Eq, Ord)
91+
81data AppDelegateNotificationConfig = AppDelegateNotificationConfig
92data AppDelegateNotificationConfig = AppDelegateNotificationConfig
82 { _appDelegateNotificationConfig_requestAuthorizationWithOptions :: Maybe (Set AuthorizationOption)
93 { _appDelegateNotificationConfig_requestAuthorizationWithOptions :: Maybe (Set AuthorizationOption)
83 , _appDelegateNotificationConfig_registerForRemoteNotifications :: Bool
94 , _appDelegateNotificationConfig_registerForRemoteNotifications :: Bool
@@ -131,6 +142,13 @@ run' mUrl cfg f = do
131 applicationWillTerminate <- newStablePtr $ _appDelegateConfig_applicationWillTerminate cfg
142 applicationWillTerminate <- newStablePtr $ _appDelegateConfig_applicationWillTerminate cfg
132 applicationSignificantTimeChange <- newStablePtr $ _appDelegateConfig_applicationSignificantTimeChange cfg
143 applicationSignificantTimeChange <- newStablePtr $ _appDelegateConfig_applicationSignificantTimeChange cfg
133 applicationUniversalLink <- newStablePtr $ _appDelegateConfig_applicationUniversalLink cfg
144 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
134
152
135 -- AppDelegate notification configuration
153 -- AppDelegate notification configuration
136 let ncfg = _appDelegateConfig_appDelegateNotificationConfig cfg
154 let ncfg = _appDelegateConfig_appDelegateNotificationConfig cfg
@@ -153,6 +171,7 @@ run' mUrl cfg f = do
153 applicationWillTerminate
171 applicationWillTerminate
154 applicationSignificantTimeChange
172 applicationSignificantTimeChange
155 applicationUniversalLink
173 applicationUniversalLink
174+ applicationDidReceiveRemoteNotification
156 (fromBool requestAuthorizationWithOptions)
175 (fromBool requestAuthorizationWithOptions)
157 (fromBool $ Set.member AuthorizationOption_Badge authorizationOptions)
176 (fromBool $ Set.member AuthorizationOption_Badge authorizationOptions)
158 (fromBool $ Set.member AuthorizationOption_Sound authorizationOptions)
177 (fromBool $ Set.member AuthorizationOption_Sound authorizationOptions)
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+7
@@ -17,6 +17,7 @@ import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
17import Data.Aeson (encode, decode)
17import Data.Aeson (encode, decode)
18
18
19import Foreign.C.String (CString)
19import Foreign.C.String (CString)
20+import Foreign.C.Types (CInt(..))
20import Foreign.Ptr (Ptr, nullPtr)
21import Foreign.Ptr (Ptr, nullPtr)
21import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
22import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
22
23
@@ -31,6 +32,7 @@ foreign export ccall jsaddleStart :: StablePtr (IO ()) -> IO ()
31foreign export ccall jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
32foreign export ccall jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
32foreign export ccall jsaddleSyncResult :: StablePtr (Results -> IO Batch) -> JSaddleHandler -> CString -> IO ()
33foreign export ccall jsaddleSyncResult :: StablePtr (Results -> IO Batch) -> JSaddleHandler -> CString -> IO ()
33foreign export ccall callWithWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
34foreign export ccall callWithWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
35+foreign export ccall callWithCIntCString :: CInt -> CString -> StablePtr (CInt -> CString -> IO ()) -> IO ()
34foreign export ccall callWithCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
36foreign export ccall callWithCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
35foreign export ccall callIO :: StablePtr (IO ()) -> IO ()
37foreign export ccall callIO :: StablePtr (IO ()) -> IO ()
36foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> StablePtr (Results -> IO Batch) -> IO ()
38foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> StablePtr (Results -> IO Batch) -> IO ()
@@ -107,6 +109,11 @@ callWithCString c fptr = do
107 f <- deRefStablePtr fptr
109 f <- deRefStablePtr fptr
108 f c
110 f c
109
111
112+callWithCIntCString :: CInt -> CString -> StablePtr (CInt -> CString -> IO ()) -> IO ()
113+callWithCIntCString n s fptr = do
114+ f <- deRefStablePtr fptr
115+ f n s
116+
110callIO :: StablePtr (IO ()) -> IO ()
117callIO :: StablePtr (IO ()) -> IO ()
111callIO ptr = do
118callIO ptr = do
112 f <- deRefStablePtr ptr
119 f <- deRefStablePtr ptr