FIX: Show iOS splash screen during bundler

This commit is contained in:
Marcos Rodriguez Velez 2024-01-24 20:23:06 -04:00
parent f2609de82c
commit 2ed63c6803
No known key found for this signature in database
GPG Key ID: 6030B2F48CCE86D7
9 changed files with 108 additions and 18 deletions

5
App.js
View File

@ -288,6 +288,11 @@ const App = () => {
}); });
}; };
useEffect(() => {
// Call hide to setup the listener on the native side
NativeModules.SplashScreen.addObserver();
}, []);
return ( return (
<SafeAreaProvider> <SafeAreaProvider>
<View style={styles.root}> <View style={styles.root}>

View File

@ -1,5 +1,5 @@
import React, { useContext, useEffect, useState } from 'react'; import React, { useContext, useEffect, useState } from 'react';
import { View, Image, TouchableOpacity, StyleSheet, ActivityIndicator, useColorScheme } from 'react-native'; import { View, Image, TouchableOpacity, StyleSheet, ActivityIndicator, useColorScheme, NativeModules } from 'react-native';
import { Icon } from 'react-native-elements'; import { Icon } from 'react-native-elements';
import Biometric from './class/biometrics'; import Biometric from './class/biometrics';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
@ -43,6 +43,7 @@ const UnlockWith = () => {
const colorScheme = useColorScheme(); const colorScheme = useColorScheme();
useEffect(() => { useEffect(() => {
NativeModules.SplashScreen.dismissSplashScreen();
startUnlock(); startUnlock();
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []); }, []);

View File

@ -57,8 +57,10 @@ function WatchConnectivity() {
}, [walletsInitialized, wallets, isReachable, isInstalled]); }, [walletsInitialized, wallets, isReachable, isInstalled]);
useEffect(() => { useEffect(() => {
updateApplicationContext({ isWalletsInitialized: walletsInitialized, randomID: Math.floor(Math.random() * 11) }); if (walletsInitialized && isReachable && isInstalled) {
}, [walletsInitialized]); updateApplicationContext({ isWalletsInitialized: walletsInitialized, randomID: Math.floor(Math.random() * 11) });
}
}, [isInstalled, isReachable, walletsInitialized]);
useEffect(() => { useEffect(() => {
if (isInstalled && isReachable && walletsInitialized && preferredFiatCurrency) { if (isInstalled && isReachable && walletsInitialized && preferredFiatCurrency) {

View File

@ -2,3 +2,4 @@
// Use this file to import your target's public headers that you would like to expose to Swift. // Use this file to import your target's public headers that you would like to expose to Swift.
// //
#import <React/RCTBridgeModule.h>

View File

@ -82,10 +82,12 @@
B4A29A3A2B55C990002A67DF /* BlueWalletWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; platformFilter = ios; }; B4A29A3A2B55C990002A67DF /* BlueWalletWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; platformFilter = ios; };
B4A29A3C2B55C990002A67DF /* Stickers.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; B4A29A3C2B55C990002A67DF /* Stickers.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B4A29A3D2B55C990002A67DF /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; B4A29A3D2B55C990002A67DF /* WidgetsExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B4AB21072B61D8CA0080440C /* SplashScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB21062B61D8CA0080440C /* SplashScreen.swift */; };
B4AB21092B61DC3F0080440C /* SplashScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = B4AB21082B61DC3F0080440C /* SplashScreen.m */; };
B4AB225D2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; }; B4AB225D2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; };
B4AB225E2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; }; B4AB225E2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; };
B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; };
C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; C978A716948AB7DEC5B6F677 /* (null) in Frameworks */ = {isa = PBXBuildFile; };
E5D4794B26781FC0007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; }; E5D4794B26781FC0007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; };
E5D4794C26781FC1007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; }; E5D4794C26781FC1007838C1 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = 6DD410AD266CAF1F0087DE03 /* fiatUnits.json */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
@ -360,6 +362,8 @@
B47B21EB2B2128B8001F6690 /* BlueWalletUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueWalletUITests.swift; sourceTree = "<group>"; }; B47B21EB2B2128B8001F6690 /* BlueWalletUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueWalletUITests.swift; sourceTree = "<group>"; };
B4A29A452B55C990002A67DF /* BlueWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; B4A29A452B55C990002A67DF /* BlueWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWallet.app; sourceTree = BUILT_PRODUCTS_DIR; };
B4A29A462B55C990002A67DF /* BlueWallet-NoLDK.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "BlueWallet-NoLDK.plist"; path = "/Users/marcosrodriguez/Documents/GitHub/BlueWallet/ios/BlueWallet-NoLDK.plist"; sourceTree = "<absolute>"; }; B4A29A462B55C990002A67DF /* BlueWallet-NoLDK.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "BlueWallet-NoLDK.plist"; path = "/Users/marcosrodriguez/Documents/GitHub/BlueWallet/ios/BlueWallet-NoLDK.plist"; sourceTree = "<absolute>"; };
B4AB21062B61D8CA0080440C /* SplashScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreen.swift; sourceTree = "<group>"; };
B4AB21082B61DC3F0080440C /* SplashScreen.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SplashScreen.m; sourceTree = "<group>"; };
B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLParserDelegate.swift; sourceTree = "<group>"; }; B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLParserDelegate.swift; sourceTree = "<group>"; };
B4D3235A177F4580BA52F2F9 /* libRNCSlider.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCSlider.a; sourceTree = "<group>"; }; B4D3235A177F4580BA52F2F9 /* libRNCSlider.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCSlider.a; sourceTree = "<group>"; };
B642AFB13483418CAB6FF25E /* libRCTQRCodeLocalImage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTQRCodeLocalImage.a; sourceTree = "<group>"; }; B642AFB13483418CAB6FF25E /* libRCTQRCodeLocalImage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTQRCodeLocalImage.a; sourceTree = "<group>"; };
@ -387,7 +391,7 @@
files = ( files = (
782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */, 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */,
764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */, 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */,
C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */, C978A716948AB7DEC5B6F677 /* (null) in Frameworks */,
773E382FE62E836172AAB98B /* libPods-BlueWallet.a in Frameworks */, 773E382FE62E836172AAB98B /* libPods-BlueWallet.a in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -463,6 +467,7 @@
13B07FAE1A68108700A75B9A /* BlueWallet */ = { 13B07FAE1A68108700A75B9A /* BlueWallet */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
B4AB21052B61D8890080440C /* SplashScreen */,
B461B850299599F800E431AA /* AppDelegate.h */, B461B850299599F800E431AA /* AppDelegate.h */,
B461B851299599F800E431AA /* AppDelegate.mm */, B461B851299599F800E431AA /* AppDelegate.mm */,
32C7944323B8879D00BE2AFA /* BlueWalletRelease.entitlements */, 32C7944323B8879D00BE2AFA /* BlueWalletRelease.entitlements */,
@ -742,6 +747,15 @@
path = BlueWalletUITests; path = BlueWalletUITests;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
B4AB21052B61D8890080440C /* SplashScreen */ = {
isa = PBXGroup;
children = (
B4AB21062B61D8CA0080440C /* SplashScreen.swift */,
B4AB21082B61DC3F0080440C /* SplashScreen.m */,
);
name = SplashScreen;
sourceTree = "<group>";
};
FAA856B639C61E61D2CF90A8 /* Pods */ = { FAA856B639C61E61D2CF90A8 /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -981,7 +995,7 @@
); );
mainGroup = 83CBB9F61A601CBA00E9B192; mainGroup = 83CBB9F61A601CBA00E9B192;
packageReferences = ( packageReferences = (
6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode.git" */, 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */,
); );
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = ""; projectDirPath = "";
@ -1076,7 +1090,7 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "export EXTRA_PACKAGER_ARGS=\"--sourcemap-output $TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\"\nexport NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; shellScript = "export EXTRA_PACKAGER_ARGS=\"--sourcemap-output $TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\"\nexport NODE_BINARY=/Users/marcosrodriguez/.nvm/versions/node/v16.11.1/bin/node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
}; };
1D93562AB5DF61839917DB14 /* [CP] Embed Pods Frameworks */ = { 1D93562AB5DF61839917DB14 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
@ -1319,6 +1333,8 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
B4AB21092B61DC3F0080440C /* SplashScreen.m in Sources */,
B4AB21072B61D8CA0080440C /* SplashScreen.swift in Sources */,
6D32C5C62596CE3A008C077C /* EventEmitter.m in Sources */, 6D32C5C62596CE3A008C077C /* EventEmitter.m in Sources */,
13B07FC11A68108700A75B9A /* main.m in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */,
B461B852299599F800E431AA /* AppDelegate.mm in Sources */, B461B852299599F800E431AA /* AppDelegate.mm in Sources */,
@ -2384,7 +2400,7 @@
/* End XCConfigurationList section */ /* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */ /* Begin XCRemoteSwiftPackageReference section */
6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode.git" */ = { 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */ = {
isa = XCRemoteSwiftPackageReference; isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/EFPrefix/EFQRCode.git"; repositoryURL = "https://github.com/EFPrefix/EFQRCode.git";
requirement = { requirement = {
@ -2397,7 +2413,7 @@
/* Begin XCSwiftPackageProductDependency section */ /* Begin XCSwiftPackageProductDependency section */
6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode.git" */; package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */;
productName = EFQRCode; productName = EFQRCode;
}; };
/* End XCSwiftPackageProductDependency section */ /* End XCSwiftPackageProductDependency section */

View File

@ -11,15 +11,6 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
BuildableName = "BlueWallet-tvOS.app"
BlueprintName = "BlueWallet-tvOS"
ReferencedContainer = "container:BlueWallet.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO" skipped = "NO"

View File

@ -12,6 +12,8 @@
@interface AppDelegate() <UNUserNotificationCenterDelegate> @interface AppDelegate() <UNUserNotificationCenterDelegate>
@property (nonatomic, strong) UIView *launchScreenView;
@end @end
@implementation AppDelegate @implementation AppDelegate
@ -20,6 +22,7 @@
{ {
[Bugsnag start]; [Bugsnag start];
[self copyDeviceUID]; [self copyDeviceUID];
[[NSUserDefaults standardUserDefaults] addObserver:self [[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:@"deviceUID" forKeyPath:@"deviceUID"
options:NSKeyValueObservingOptionNew options:NSKeyValueObservingOptionNew
@ -28,6 +31,8 @@
forKeyPath:@"deviceUIDCopy" forKeyPath:@"deviceUIDCopy"
options:NSKeyValueObservingOptionNew options:NSKeyValueObservingOptionNew
context:NULL]; context:NULL];
[self addSplashScreenView];
self.moduleName = @"BlueWallet"; self.moduleName = @"BlueWallet";
// You can add your custom initial props in the dictionary below. // You can add your custom initial props in the dictionary below.
// They will be passed down to the ViewController used by React Native. // They will be passed down to the ViewController used by React Native.
@ -41,6 +46,22 @@
return [super application:application didFinishLaunchingWithOptions:launchOptions]; return [super application:application didFinishLaunchingWithOptions:launchOptions];
} }
- (void)addSplashScreenView
{
// Get the rootView
RCTRootView *rootView = (RCTRootView *)self.window.rootViewController.view;
// Capture the launch screen view
UIStoryboard *launchScreenStoryboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
UIViewController *launchScreenVC = [launchScreenStoryboard instantiateInitialViewController];
UIView *launchScreenView = launchScreenVC.view;
launchScreenView.frame = self.window.bounds;
[self.window addSubview:launchScreenView];
// Keep a reference to the launch screen view to remove it later
rootView.loadingView = launchScreenView;
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{ {
#if DEBUG #if DEBUG

14
ios/SplashScreen.m Normal file
View File

@ -0,0 +1,14 @@
//
// SplashScreen.m
// BlueWallet
//
// Created by Marcos Rodriguez on 1/24/24.
// Copyright © 2024 BlueWallet. All rights reserved.
//
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(SplashScreen, NSObject)
RCT_EXTERN_METHOD(addObserver)
RCT_EXTERN_METHOD(dismissSplashScreen)
@end

39
ios/SplashScreen.swift Normal file
View File

@ -0,0 +1,39 @@
//
// SplashScreen.swift
// BlueWallet
//
// Created by Marcos Rodriguez on 1/24/24.
// Copyright © 2024 BlueWallet. All rights reserved.
//
import Foundation
import React
@objc(SplashScreen)
class SplashScreen: NSObject, RCTBridgeModule {
static func moduleName() -> String! {
return "SplashScreen"
}
static func requiresMainQueueSetup() -> Bool {
return true
}
@objc
func addObserver() {
NotificationCenter.default.addObserver(self, selector: #selector(dismissSplashScreen), name: NSNotification.Name("HideSplashScreen"), object: nil)
}
@objc
func dismissSplashScreen() {
DispatchQueue.main.async {
if let rootView = UIApplication.shared.delegate?.window??.rootViewController?.view as? RCTRootView {
rootView.loadingView?.removeFromSuperview()
rootView.loadingView = nil
}
NotificationCenter.default.removeObserver(self, name: NSNotification.Name("HideSplashScreen"), object: nil)
}
}
}