on master help sign in
Merge branch 'cg-notification-handler'

# Conflicts: # jsaddle-wkwebview/cbits-uikit/AppDelegate.m

commita28f95ddac3e5c694cd2cd08cd96e14ff45ee49c authorCale Gibbard <cgibbard@gmail.com> dateWed 21 Mar 2018, 16:39 (9 years ago) parent6a8fbe284b139c
3 files changed+38
jsaddle-wkwebview/cbits-uikit/AppDelegate.m+12 jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+19 jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+7
jsaddle-wkwebview/cbits-uikit/AppDelegate.m+12
@@ -5,6 +5,7 @@
55
66extern void callIO(HsStablePtr);
77extern void callWithCString(const char * _Nonnull, HsStablePtr);
8+extern void callWithCIntCString(int n, const char * _Nonnull, HsStablePtr);
89
910@interface AppDelegate ()
1011
@@ -20,6 +21,7 @@ HsStablePtr global_applicationWillEnterForeground = 0;
2021HsStablePtr global_applicationWillTerminate = 0;
2122HsStablePtr global_applicationSignificantTimeChange = 0;
2223HsStablePtr global_applicationUniversalLink = 0;
24+HsStablePtr global_applicationDidReceiveRemoteNotification = 0;
2325uint64_t global_requestAuthorizationWithOptions = 0;
2426uint64_t global_requestAuthorizationOptionBadge = 0;
2527uint64_t global_requestAuthorizationOptionSound = 0;
@@ -115,6 +117,14 @@ HsStablePtr global_didFailToRegisterForRemoteNotificationsWithError = 0;
115117 if ([userInfo valueForKeyPath:@"aps.badge"] != nil) {
116118 [UIApplication sharedApplication].applicationIconBadgeNumber=[[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] intValue];
117119 }
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+ }
118128 completionHandler(UIBackgroundFetchResultNewData);
119129}
120130
@@ -152,6 +162,7 @@ void runInWKWebView(HsStablePtr handler,
152162 HsStablePtr hs_applicationWillTerminate,
153163 HsStablePtr hs_applicationSignificantTimeChange,
154164 HsStablePtr hs_applicationUniversalLink,
165+ HsStablePtr hs_applicationDidReceiveRemoteNotification,
155166 const uint64_t hs_requestAuthorizationWithOptions,
156167 const uint64_t hs_requestAuthorizationOptionBadge,
157168 const uint64_t hs_requestAuthorizationOptionSound,
@@ -171,6 +182,7 @@ void runInWKWebView(HsStablePtr handler,
171182 global_applicationWillTerminate = hs_applicationWillTerminate;
172183 global_applicationSignificantTimeChange = hs_applicationSignificantTimeChange;
173184 global_applicationUniversalLink = hs_applicationUniversalLink;
185+ global_applicationDidReceiveRemoteNotification = hs_applicationDidReceiveRemoteNotification;
174186 global_requestAuthorizationWithOptions = hs_requestAuthorizationWithOptions;
175187 global_requestAuthorizationOptionBadge = hs_requestAuthorizationOptionBadge;
176188 global_requestAuthorizationOptionSound = hs_requestAuthorizationOptionSound;
jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+19
@@ -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)
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+7
@@ -17,6 +17,7 @@ import Data.ByteString.Lazy (ByteString, toStrict, fromStrict)
1717import Data.Aeson (encode, decode)
1818
1919import Foreign.C.String (CString)
20+import Foreign.C.Types (CInt(..))
2021import Foreign.Ptr (Ptr, nullPtr)
2122import Foreign.StablePtr (StablePtr, newStablePtr, deRefStablePtr)
2223
@@ -31,6 +32,7 @@ foreign export ccall jsaddleStart :: StablePtr (IO ()) -> IO ()
3132foreign export ccall jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
3233foreign export ccall jsaddleSyncResult :: StablePtr (Results -> IO Batch) -> JSaddleHandler -> CString -> IO ()
3334foreign export ccall callWithWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
35+foreign export ccall callWithCIntCString :: CInt -> CString -> StablePtr (CInt -> CString -> IO ()) -> IO ()
3436foreign export ccall callWithCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
3537foreign export ccall callIO :: StablePtr (IO ()) -> IO ()
3638foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> StablePtr (Results -> IO Batch) -> IO ()
@@ -107,6 +109,11 @@ callWithCString c fptr = do
107109 f <- deRefStablePtr fptr
108110 f c
109111
112+callWithCIntCString :: CInt -> CString -> StablePtr (CInt -> CString -> IO ()) -> IO ()
113+callWithCIntCString n s fptr = do
114+ f <- deRefStablePtr fptr
115+ f n s
116+
110117callIO :: StablePtr (IO ()) -> IO ()
111118callIO ptr = do
112119 f <- deRefStablePtr ptr