diff --git a/android/app/src/main/res/drawable-nodpi/splash_android12_icon.png b/android/app/src/main/res/drawable-nodpi/splash_android12_icon.png
new file mode 100644
index 0000000..0ba6084
Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/splash_android12_icon.png differ
diff --git a/android/app/src/main/res/drawable-nodpi/splash_content.png b/android/app/src/main/res/drawable-nodpi/splash_content.png
new file mode 100644
index 0000000..40530dc
Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/splash_content.png differ
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
index 2995854..2ea5839 100644
--- a/android/app/src/main/res/drawable-v21/launch_background.xml
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -9,4 +9,12 @@
android:endColor="#FFFFFF" />
+ -
+
+
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
index 2995854..2ea5839 100644
--- a/android/app/src/main/res/drawable/launch_background.xml
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -9,4 +9,12 @@
android:endColor="#FFFFFF" />
+ -
+
+
diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml
new file mode 100644
index 0000000..a1d906e
--- /dev/null
+++ b/android/app/src/main/res/values-night-v31/styles.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
index 2bf52b9..1a6fccd 100644
--- a/android/app/src/main/res/values-night/styles.xml
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -1,7 +1,7 @@
-
diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml
new file mode 100644
index 0000000..a1d906e
--- /dev/null
+++ b/android/app/src/main/res/values-v31/styles.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
index 9da19ea..3e0874b 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
index 9da19ea..5dc446b 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
index 9da19ea..40530dc 100644
Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
index 8ad8574..05972b4 100644
--- a/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -32,6 +32,6 @@
-
+
diff --git a/lib/main.dart b/lib/main.dart
index 02d9bf3..720702b 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -99,6 +99,7 @@ class _H5ShellPageState extends State {
String? _loadError;
bool _showShellCover = true;
bool _shellBrandingLoaded = false;
+ Timer? _shellCoverFallbackTimer;
late ShellBranding _shellBranding;
@override
@@ -112,6 +113,10 @@ class _H5ShellPageState extends State {
WebViewController _buildController() {
return WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
+ ..addJavaScriptChannel(
+ 'OpenIMShell',
+ onMessageReceived: _handleShellMessage,
+ )
..setBackgroundColor(_shellBackground)
..setNavigationDelegate(
NavigationDelegate(
@@ -121,6 +126,7 @@ class _H5ShellPageState extends State {
}
},
onPageStarted: (_) {
+ _shellCoverFallbackTimer?.cancel();
if (mounted) {
setState(() {
_loadError = null;
@@ -134,6 +140,7 @@ class _H5ShellPageState extends State {
},
onWebResourceError: (error) {
if (error.isForMainFrame ?? true) {
+ _shellCoverFallbackTimer?.cancel();
if (mounted) {
setState(() {
_loadError = error.description;
@@ -147,6 +154,12 @@ class _H5ShellPageState extends State {
);
}
+ @override
+ void dispose() {
+ _shellCoverFallbackTimer?.cancel();
+ super.dispose();
+ }
+
Future _runJavaScriptSafely(String source) async {
try {
await _controller.runJavaScript(source);
@@ -165,9 +178,42 @@ class _H5ShellPageState extends State {
if (mounted) {
setState(() {
_progress = 100;
- _showShellCover = false;
});
}
+ _scheduleShellCoverFallback();
+ }
+
+ void _handleShellMessage(JavaScriptMessage message) {
+ try {
+ final decoded = jsonDecode(message.message);
+ if (decoded is Map && decoded['type'] == 'first-screen-ready') {
+ _hideShellCover();
+ }
+ } catch (_) {
+ if (message.message == 'first-screen-ready') {
+ _hideShellCover();
+ }
+ }
+ }
+
+ void _scheduleShellCoverFallback() {
+ _shellCoverFallbackTimer?.cancel();
+ _shellCoverFallbackTimer = Timer(
+ const Duration(seconds: 4),
+ _hideShellCover,
+ );
+ }
+
+ void _hideShellCover() {
+ _shellCoverFallbackTimer?.cancel();
+ if (!mounted || !_showShellCover) {
+ return;
+ }
+
+ setState(() {
+ _progress = 100;
+ _showShellCover = false;
+ });
}
Future _loadShellBrandingIfNeeded() async {
@@ -212,6 +258,7 @@ class _H5ShellPageState extends State {
final targetUrl = AppConfig.canonicalizeMainFrameUrl(url);
if (mounted) {
+ _shellCoverFallbackTimer?.cancel();
setState(() {
_loadError = null;
_progress = 0;