on master help sign in
Add AppDelegateConfig with APNs registration callback
commiteccf6759a7749b8461fb3bc200fd72e45863bac9 authorAli Abrar <aliabrar@gmail.com> dateSun 7 May 2017, 23:59 (9 years ago) parentf9caba9
5 files changed+26−15
jsaddle-wkwebview/cbits-uikit/AppDelegate.m+2−2 jsaddle-wkwebview/default.nix+2−2 jsaddle-wkwebview/jsaddle-wkwebview.cabal+2−1 jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+4−4 jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+16−6
jsaddle-wkwebview/cbits-uikit/AppDelegate.m+2−2
@@ -2,7 +2,7 @@
22#import "ViewController.h"
33#import <UserNotifications/UserNotifications.h>
44
5−extern void didRegisterForRemoteNotificationsWithDeviceTokenCallback(const char * _Nonnull, HsStablePtr);
5+extern void handlerCString(const char * _Nonnull, HsStablePtr);
66
77@interface AppDelegate ()
88
@@ -57,7 +57,7 @@ HsStablePtr global_didRegisterForRemoteNotificationsWithDeviceToken = 0;
5757
5858- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
5959 NSString *deviceTokenString = [deviceToken base64EncodedStringWithOptions: 0];
60− didRegisterForRemoteNotificationsWithDeviceTokenCallback([deviceTokenString UTF8String], global_didRegisterForRemoteNotificationsWithDeviceToken);
60+ handlerCString([deviceTokenString UTF8String], global_didRegisterForRemoteNotificationsWithDeviceToken);
6161}
6262
6363- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
jsaddle-wkwebview/default.nix+2−2
@@ -1,4 +1,4 @@
1−{ mkDerivation, stdenv, aeson, base, bytestring, jsaddle
1+{ mkDerivation, stdenv, aeson, base, bytestring, jsaddle, data-default
22, buildPackages
33}:
44
@@ -6,7 +6,7 @@ mkDerivation {
66 pname = "jsaddle-wkwebview";
77 version = "0.8.2.0";
88 src = ./.;
9− libraryHaskellDepends = [ aeson base bytestring jsaddle ]
9+ libraryHaskellDepends = [ aeson base bytestring jsaddle data-default ]
1010 # should use `librarySystemDepends` but it is not propagated
1111 ++ (with buildPackages; [ osx_sdk darwin.libobjc darwin.apple_sdk.libs.xpc ]);
1212 description = "Interface for JavaScript that works with GHCJS and GHC";
jsaddle-wkwebview/jsaddle-wkwebview.cabal+2−1
@@ -30,7 +30,8 @@ library
3030 aeson >=0.8.0.2 && <1.2,
3131 base <5,
3232 bytestring >=0.10.6.0 && <0.11,
33− jsaddle >= 0.8.0.0 && <0.9
33+ jsaddle >= 0.8.0.0 && <0.9,
34+ data-default
3435 default-language: Haskell2010
3536 hs-source-dirs: src
3637 frameworks: Foundation, WebKit
jsaddle-wkwebview/src-ghc/Language/Javascript/JSaddle/WKWebView.hs+4−4
@@ -8,7 +8,7 @@ module Language.Javascript.JSaddle.WKWebView
88 ) where
99
1010import Data.ByteString (ByteString)
11−import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath)
11+import Language.Javascript.JSaddle.WKWebView.Internal (jsaddleMain, jsaddleMainFile, WKWebView(..), mainBundleResourcePath, AppDelegateConfig (..))
1212import System.Environment (getProgName)
1313import Foreign.C.String (CString, withCString, peekCString)
1414import Foreign.StablePtr (StablePtr, newStablePtr)
@@ -28,12 +28,12 @@ run didRegisterForRemoteNotificationsWithDeviceToken f = do
2828-- from the mainBundle (relative to the resourcePath).
2929runFile :: ByteString -- ^ The file to navigate to.
3030 -> ByteString -- ^ The path to allow read access to.
31− -> (CString -> IO ())
31+ -> AppDelegateConfig
3232 -> JSM ()
3333 -> IO ()
34−runFile url allowing didRegisterForRemoteNotificationsWithDeviceToken f = do
34+runFile url allowing cfg f = do
3535 handler <- newStablePtr (jsaddleMainFile url allowing f)
3636 progName <- getProgName
37− deviceTokenHandler <- newStablePtr didRegisterForRemoteNotificationsWithDeviceToken
37+ deviceTokenHandler <- newStablePtr $ _appDelegateConfig_didRegisterForRemoteNotificationsWithDeviceToken cfg
3838 withCString progName $ \pn -> runInWKWebView handler pn deviceTokenHandler
3939
jsaddle-wkwebview/src/Language/Javascript/JSaddle/WKWebView/Internal.hs+16−6
@@ -4,12 +4,14 @@ module Language.Javascript.JSaddle.WKWebView.Internal
44 , jsaddleMainFile
55 , WKWebView(..)
66 , mainBundleResourcePath
7+ , AppDelegateConfig (..)
78 ) where
89
910import Control.Monad (void, join)
1011import Control.Concurrent (forkIO, forkOS)
1112import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
1213
14+import Data.Default
1315import Data.Monoid ((<>))
1416import Data.ByteString (useAsCString, packCString)
1517import qualified Data.ByteString as BS (ByteString)
@@ -29,7 +31,7 @@ newtype WKWebView = WKWebView (Ptr WKWebView)
2931foreign export ccall jsaddleStart :: StablePtr (IO ()) -> IO ()
3032foreign export ccall jsaddleResult :: StablePtr (Results -> IO ()) -> CString -> IO ()
3133foreign export ccall withWebView :: WKWebView -> StablePtr (WKWebView -> IO ()) -> IO ()
32−foreign export ccall didRegisterForRemoteNotificationsWithDeviceTokenCallback :: CString -> StablePtr (CString -> IO ()) -> IO ()
34+foreign export ccall handlerCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
3335foreign import ccall addJSaddleHandler :: WKWebView -> StablePtr (IO ()) -> StablePtr (Results -> IO ()) -> IO ()
3436foreign import ccall loadHTMLString :: WKWebView -> CString -> IO ()
3537foreign import ccall loadBundleFile :: WKWebView -> CString -> CString -> IO ()
@@ -86,11 +88,19 @@ withWebView webView ptrF = do
8688 f <- deRefStablePtr ptrF
8789 f webView
8890
89−-- | A base64 encoded device token
90−didRegisterForRemoteNotificationsWithDeviceTokenCallback :: CString -> StablePtr (CString -> IO ()) -> IO ()
91−didRegisterForRemoteNotificationsWithDeviceTokenCallback token f = do
92− f' <- deRefStablePtr f
93− f' token
91+handlerCString :: CString -> StablePtr (CString -> IO ()) -> IO ()
92+handlerCString c fptr = do
93+ f <- deRefStablePtr fptr
94+ f c
95+
96+data AppDelegateConfig = AppDelegateConfig
97+ { _appDelegateConfig_didRegisterForRemoteNotificationsWithDeviceToken :: CString -> IO ()
98+ }
99+
100+instance Default AppDelegateConfig where
101+ def = AppDelegateConfig
102+ { _appDelegateConfig_didRegisterForRemoteNotificationsWithDeviceToken = \_ -> return ()
103+ }
94104
95105jsaddleJs :: ByteString
96106jsaddleJs = ghcjsHelpers <> "\