Przeglądaj źródła

fix(core): prevent iOS crash on invalid plugin response JSON (#8049)

Lucas Fernandes Nogueira 1 rok temu
rodzic
commit
22f26882cf

+ 5 - 0
.changes/prevent-ios-crash.md

@@ -0,0 +1,5 @@
+---
+"tauri": patch:bug
+---
+
+Prevent crash on iOS when the Swift plugin data is not a valid JSON string.

+ 13 - 6
core/tauri/src/plugin/mobile.rs

@@ -344,12 +344,19 @@ pub(crate) fn run_command<R: Runtime, C: AsRef<str>, F: FnOnce(PluginResponse) +
         .unwrap()
         .remove(&id)
       {
-        let payload = serde_json::from_str(payload.to_str().unwrap()).unwrap();
-        handler(if success == 1 {
-          Ok(payload)
-        } else {
-          Err(payload)
-        });
+        let json = payload.to_str().unwrap();
+        match serde_json::from_str(json) {
+          Ok(payload) => {
+            handler(if success == 1 {
+              Ok(payload)
+            } else {
+              Err(payload)
+            });
+          }
+          Err(err) => {
+            handler(Err(format!("{err}, data: {}", json).into()));
+          }
+        }
       }
     }
 

+ 1 - 1
core/tauri/src/protocol/tauri.rs

@@ -69,7 +69,7 @@ pub fn get<R: Runtime>(
 
 fn get_response<R: Runtime>(
   request: Request<Vec<u8>>,
-  manager: &WindowManager<R>,
+  #[allow(unused_variables)] manager: &WindowManager<R>,
   window_origin: &str,
   web_resource_request_handler: Option<&WebResourceRequestHandler>,
   #[cfg(all(dev, mobile))] (url, response_cache): (

+ 5 - 5
core/tauri/src/window/mod.rs

@@ -32,10 +32,7 @@ use crate::{
   },
   sealed::ManagerBase,
   sealed::RuntimeOrDispatch,
-  utils::{
-    config::{WindowConfig, WindowEffectsConfig, WindowUrl},
-    ProgressBarState,
-  },
+  utils::config::{WindowConfig, WindowEffectsConfig, WindowUrl},
   EventLoopMessage, Manager, Runtime, Theme, WindowEvent,
 };
 #[cfg(desktop)]
@@ -2071,7 +2068,10 @@ impl<R: Runtime> Window<R> {
   /// - **Linux / macOS**: Progress bar is app-wide and not specific to this window.
   /// - **Linux**: Only supported desktop environments with `libunity` (e.g. GNOME).
   /// - **iOS / Android:** Unsupported.
-  pub fn set_progress_bar(&self, progress_state: ProgressBarState) -> crate::Result<()> {
+  pub fn set_progress_bar(
+    &self,
+    progress_state: crate::utils::ProgressBarState,
+  ) -> crate::Result<()> {
     self
       .window
       .dispatcher

+ 2 - 3
core/tauri/src/window/plugin.rs

@@ -314,13 +314,12 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
             #[cfg(any(debug_assertions, feature = "devtools"))]
             desktop_commands::internal_toggle_devtools,
           ]);
-        #[allow(clippy::needless_return)]
-        return handler(invoke);
+        handler(invoke)
       }
       #[cfg(mobile)]
       {
         invoke.resolver.reject("Window API not available on mobile");
-        return true;
+        true
       }
     })
     .build()