Kaynağa Gözat

fix(core): use postMessage IPC for remote URLs on iOS ref #7751 (#7764)

Lucas Fernandes Nogueira 1 yıl önce
ebeveyn
işleme
b7f53d66e8

+ 1 - 1
.changes/fix-ipc-remote-url-macos.md

@@ -2,4 +2,4 @@
 "tauri": patch:bug
 ---
 
-Fixes IPC failing to communicate for remote URLs on macOS.
+Fixes IPC failing to communicate for remote URLs on macOS and iOS.

+ 1 - 1
core/tauri/scripts/ipc-protocol.js

@@ -30,7 +30,7 @@
           cmd === fetchChannelDataCommand ||
           !(osName === 'linux' || osName === 'android')
         ) &&
-        !(osName === 'macos' && location.protocol === 'https:')
+        !((osName === 'macos' || osName === 'ios') && location.protocol === 'https:')
       ) {
         const {
           contentType,

+ 1 - 1
core/tauri/src/ipc/mod.rs

@@ -21,7 +21,7 @@ use crate::{
 };
 
 pub(crate) mod channel;
-#[cfg(any(target_os = "macos", not(ipc_custom_protocol)))]
+#[cfg(any(target_os = "macos", target_os = "ios", not(ipc_custom_protocol)))]
 pub(crate) mod format_callback;
 pub(crate) mod protocol;
 

+ 9 - 9
core/tauri/src/ipc/protocol.rs

@@ -20,7 +20,7 @@ use super::{CallbackFn, InvokeBody, InvokeResponse};
 const TAURI_CALLBACK_HEADER_NAME: &str = "Tauri-Callback";
 const TAURI_ERROR_HEADER_NAME: &str = "Tauri-Error";
 
-#[cfg(any(target_os = "macos", not(ipc_custom_protocol)))]
+#[cfg(any(target_os = "macos", target_os = "ios", not(ipc_custom_protocol)))]
 pub fn message_handler<R: Runtime>(
   manager: WindowManager<R>,
 ) -> crate::runtime::webview::WebviewIpcHandler<crate::EventLoopMessage, R> {
@@ -125,7 +125,7 @@ pub fn get<R: Runtime>(manager: WindowManager<R>, label: String) -> UriSchemePro
   })
 }
 
-#[cfg(any(target_os = "macos", not(ipc_custom_protocol)))]
+#[cfg(any(target_os = "macos", target_os = "ios", not(ipc_custom_protocol)))]
 fn handle_ipc_message<R: Runtime>(message: String, manager: &WindowManager<R>, label: &str) {
   if let Some(window) = manager.get_window(label) {
     use serde::{Deserialize, Deserializer};
@@ -241,7 +241,7 @@ fn handle_ipc_message<R: Runtime>(message: String, manager: &WindowManager<R>, l
 
               match &response {
                 InvokeResponse::Ok(InvokeBody::Json(v)) => {
-                  if !cfg!(target_os = "macos")
+                  if !(cfg!(target_os = "macos") || cfg!(target_os = "ios"))
                     && matches!(v, JsonValue::Object(_) | JsonValue::Array(_))
                   {
                     let _ = Channel::from_ipc(window.clone(), callback).send(v);
@@ -254,12 +254,12 @@ fn handle_ipc_message<R: Runtime>(message: String, manager: &WindowManager<R>, l
                   }
                 }
                 InvokeResponse::Ok(InvokeBody::Raw(v)) => {
-                  responder_eval(
-                    &window,
-                    format_callback_result(Result::<_, ()>::Ok(v), callback, error),
-                    error,
-                  );
-                  if cfg!(target_os = "macos") {
+                  if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
+                    responder_eval(
+                      &window,
+                      format_callback_result(Result::<_, ()>::Ok(v), callback, error),
+                      error,
+                    );
                   } else {
                     let _ =
                       Channel::from_ipc(window.clone(), callback).send(InvokeBody::Raw(v.clone()));

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

@@ -1029,7 +1029,7 @@ impl<R: Runtime> WindowManager<R> {
       app_handle.clone(),
     )?;
 
-    #[cfg(any(target_os = "macos", not(ipc_custom_protocol)))]
+    #[cfg(any(target_os = "macos", target_os = "ios", not(ipc_custom_protocol)))]
     {
       pending.ipc_handler = Some(crate::ipc::protocol::message_handler(self.clone()));
     }