feat: keep CLI alive when iOS app exits, show logs, closes #5855 (#5902)

This commit is contained in:
Lucas Fernandes Nogueira 2022-12-27 13:12:01 -08:00 committed by GitHub
parent ced8e9a7be
commit dee9460f9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 107 additions and 37 deletions

View File

@ -0,0 +1,6 @@
---
"cli.rs": patch
"cli.js": patch
---
Keep the process alive even when the iOS application is closed.

7
.changes/ios-logs.md Normal file
View File

@ -0,0 +1,7 @@
---
"cli.rs": patch
"cli.js": patch
"tauri": patch
---
Show all application logs on iOS.

View File

@ -0,0 +1,6 @@
---
"tauri-build": patch
"tauri-macros": patch
---
Refactor mobile environment variables.

View File

@ -222,14 +222,20 @@ pub fn try_build(attributes: Attributes) -> Result<()> {
let s = config.tauri.bundle.identifier.split('.');
let last = s.clone().count() - 1;
let mut domain = String::new();
let mut android_package_prefix = String::new();
for (i, w) in s.enumerate() {
if i != last {
domain.push_str(w);
domain.push('_');
domain.push('.');
android_package_prefix.push_str(w);
android_package_prefix.push('_');
}
}
domain.pop();
println!("cargo:rustc-env=TAURI_ANDROID_DOMAIN={domain}");
android_package_prefix.pop();
println!("cargo:rustc-env=TAURI_MOBILE_DOMAIN={domain}");
println!("cargo:rustc-env=TAURI_ANDROID_PACKAGE_PREFIX={android_package_prefix}");
cfg_alias("dev", !has_feature("custom-protocol"));

View File

@ -33,13 +33,14 @@ pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> TokenStream {
let function_name = function.sig.ident.clone();
let mut error = None;
let domain = get_env_var("TAURI_ANDROID_DOMAIN", |r| r, &mut error, &function);
let domain = get_env_var("TAURI_ANDROID_PACKAGE_PREFIX", |r| r, &mut error, &function);
let app_name = get_env_var(
"CARGO_PKG_NAME",
|r| r.replace('_', "_1"),
&mut error,
&function,
);
let domain_str = var("TAURI_MOBILE_DOMAIN").unwrap();
let app_name_str = var("CARGO_PKG_NAME").unwrap();
if let Some(e) = error {
@ -59,9 +60,11 @@ pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> TokenStream {
#function
fn _start_app() {
::tauri::init_logging(#app_name_str);
#[cfg(target_os = "ios")]
::tauri::init_logging(&format!("{}.{}", #domain_str, #app_name_str));
#[cfg(target_os = "android")]
{
::tauri::init_logging(#app_name_str);
use ::tauri::paste;
::tauri::wry_android_binding!(#domain, #app_name, _start_app, ::tauri::wry);
}

View File

@ -114,7 +114,9 @@ android_logger = "0.9"
log = "0.4"
[target."cfg(target_os = \"ios\")".dependencies]
env_logger = "0.9.0"
oslog = "0.2"
log = "0.4"
libc = "0.2"
[build-dependencies]
heck = "0.4"

View File

@ -290,8 +290,44 @@ pub fn init_logging(tag: &str) {
#[cfg(target_os = "ios")]
#[doc(hidden)]
pub fn init_logging(_tag: &str) {
env_logger::init();
pub fn init_logging(subsystem: &str) {
use std::{
ffi::CString,
fs::File,
io::{BufRead, BufReader},
os::unix::prelude::*,
thread,
};
let mut logpipe: [RawFd; 2] = Default::default();
unsafe {
libc::pipe(logpipe.as_mut_ptr());
libc::dup2(logpipe[1], libc::STDOUT_FILENO);
libc::dup2(logpipe[1], libc::STDERR_FILENO);
}
thread::spawn(move || unsafe {
let file = File::from_raw_fd(logpipe[0]);
let mut reader = BufReader::new(file);
let mut buffer = String::new();
loop {
buffer.clear();
if let Ok(len) = reader.read_line(&mut buffer) {
if len == 0 {
break;
} else if let Ok(msg) = CString::new(buffer.clone())
.map_err(|_| ())
.and_then(|c| c.into_string().map_err(|_| ()))
{
log::info!("{}", msg);
}
}
}
});
oslog::OsLogger::new(subsystem)
.level_filter(log::LevelFilter::Trace)
.init()
.unwrap();
}
/// Updater events.

View File

@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ec2333c185d826313162cee39d3fcc6a84ba08114a839bebf53b961e7e75773"
dependencies = [
"android_log-sys",
"env_logger 0.7.1",
"env_logger",
"lazy_static",
"log",
]
@ -610,6 +610,19 @@ dependencies = [
"syn",
]
[[package]]
name = "dashmap"
version = "5.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc"
dependencies = [
"cfg-if",
"hashbrown",
"lock_api",
"once_cell",
"parking_lot_core",
]
[[package]]
name = "dbus"
version = "0.9.6"
@ -717,19 +730,6 @@ dependencies = [
"regex",
]
[[package]]
name = "env_logger"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]]
name = "fastrand"
version = "1.8.0"
@ -1279,12 +1279,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
[[package]]
name = "humantime"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "hyper"
version = "0.14.23"
@ -1941,6 +1935,17 @@ version = "6.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3baf96e39c5359d2eb0dd6ccb42c62b91d9678aa68160d261b9e0ccbf9e9dea9"
[[package]]
name = "oslog"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80d2043d1f61d77cb2f4b1f7b7b2295f40507f5f8e9d1c8bf10a1ca5f97a3969"
dependencies = [
"cc",
"dashmap",
"log",
]
[[package]]
name = "overload"
version = "0.1.1"
@ -2935,7 +2940,7 @@ dependencies = [
[[package]]
name = "tauri"
version = "2.0.0-alpha.0"
version = "2.0.0-alpha.2"
dependencies = [
"android_logger",
"anyhow",
@ -2947,7 +2952,6 @@ dependencies = [
"dirs-next",
"embed_plist",
"encoding_rs",
"env_logger 0.9.3",
"flate2",
"futures-util",
"glib",
@ -2958,6 +2962,7 @@ dependencies = [
"ico",
"ignore",
"infer 0.9.0",
"libc",
"log",
"minisign-verify",
"notify-rust",
@ -2966,6 +2971,7 @@ dependencies = [
"open",
"os_info",
"os_pipe",
"oslog",
"paste",
"percent-encoding",
"png",
@ -4037,9 +4043,9 @@ dependencies = [
[[package]]
name = "wry"
version = "0.23.1"
version = "0.23.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76c9236a810d4af02213f89f5bc55bf3262d40c4407b13a9fc847156ef8b856"
checksum = "4c1ad8e2424f554cc5bdebe8aa374ef5b433feff817aebabca0389961fc7ef98"
dependencies = [
"base64",
"block",

View File

@ -3908,9 +3908,9 @@ dependencies = [
[[package]]
name = "tauri-mobile"
version = "0.1.0"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b23191ab3de2efc8d266ec26c16c1c90bd9e171f6f8ccdc56cd31cc9ad97130"
checksum = "723e99ec18695c25936deb0bc4e271ff4d25f48de88d03d59959fe8a31d9bf91"
dependencies = [
"cocoa",
"colored 1.9.3",

View File

@ -39,7 +39,7 @@ name = "cargo-tauri"
path = "src/main.rs"
[dependencies]
tauri-mobile = { version = "0.1", default-features = false }
tauri-mobile = { version = "0.1.1", default-features = false }
textwrap = { version = "0.11.0", features = [ "term_size" ] }
jsonrpsee = { version = "0.16", features = [ "client", "server" ] }
thiserror = "1"

View File

@ -189,15 +189,13 @@ fn run(
Profile::Release
};
let non_interactive = true; // ios-deploy --noninteractive (quit when app crashes or exits)
device_prompt(env, device)
.map_err(|e| RunError::FailedToPromptForDevice(e.to_string()))?
.run(
config,
env,
NoiseLevel::FranklyQuitePedantic,
non_interactive,
false, // do not quit on app exit
profile,
)
.map(DevChild::new)