feat: add iOS frameworks config option, closes #9962 (#10393)

* feat: add iOS frameworks config option, closes #9962

* fix template

* typo
This commit is contained in:
Lucas Fernandes Nogueira 2024-08-02 07:35:03 -03:00 committed by GitHub
parent b32295de18
commit a5bfbaa62b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 79 additions and 14 deletions

View File

@ -0,0 +1,7 @@
---
"tauri-utils": patch:feat
"@tauri-apps/cli": patch:feat
"tauri-cli": patch:feat
---
Added `bundle > iOS > frameworks` configuration to define a list of frameworks that are linked to the Xcode project when it is generated.

View File

@ -2896,6 +2896,16 @@
"description": "General configuration for the iOS target.",
"type": "object",
"properties": {
"frameworks": {
"description": "A list of strings indicating any iOS frameworks that need to be bundled with the application.\n\n Note that you need to recreate the iOS project for the changes to be applied.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"developmentTeam": {
"description": "The development team. This value is required for iOS development because code signing is enforced.\n The `APPLE_DEVELOPMENT_TEAM` environment variable can be set to overwrite it.",
"type": [

View File

@ -1889,6 +1889,10 @@ pub struct TrayIconConfig {
#[cfg_attr(feature = "schema", derive(JsonSchema))]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct IosConfig {
/// A list of strings indicating any iOS frameworks that need to be bundled with the application.
///
/// Note that you need to recreate the iOS project for the changes to be applied.
pub frameworks: Option<Vec<String>>,
/// The development team. This value is required for iOS development because code signing is enforced.
/// The `APPLE_DEVELOPMENT_TEAM` environment variable can be set to overwrite it.
#[serde(alias = "development-team")]

View File

@ -2896,6 +2896,16 @@
"description": "General configuration for the iOS target.",
"type": "object",
"properties": {
"frameworks": {
"description": "A list of strings indicating any iOS frameworks that need to be bundled with the application.\n\n Note that you need to recreate the iOS project for the changes to be applied.",
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"developmentTeam": {
"description": "The development team. This value is required for iOS development because code signing is enforced.\n The `APPLE_DEVELOPMENT_TEAM` environment variable can be set to overwrite it.",
"type": [

View File

@ -16,7 +16,7 @@ use cargo_mobile2::{
env::Env,
opts::NoiseLevel,
os,
util::prompt,
util::{prompt, relativize_path},
};
use clap::{Parser, Subcommand};
use sublime_fuzzy::best_match;
@ -27,7 +27,10 @@ use super::{
log_finished, read_options, setup_dev_config, CliOptions, OptionsHandle, Target as MobileTarget,
MIN_DEVICE_MATCH_SCORE,
};
use crate::{helpers::config::Config as TauriConfig, Result};
use crate::{
helpers::{app_paths::tauri_dir, config::Config as TauriConfig},
Result,
};
use std::{
env::{set_var, var_os},
@ -104,7 +107,7 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> {
pub fn get_config(
app: &App,
config: &TauriConfig,
tauri_config: &TauriConfig,
features: Option<&Vec<String>>,
cli_options: &CliOptions,
) -> (AppleConfig, AppleMetadata) {
@ -119,7 +122,7 @@ pub fn get_config(
let raw = RawAppleConfig {
development_team: std::env::var(APPLE_DEVELOPMENT_TEAM_ENV_VAR_NAME)
.ok()
.or_else(|| config.bundle.ios.development_team.clone())
.or_else(|| tauri_config.bundle.ios.development_team.clone())
.or_else(|| {
let teams = find_development_teams().unwrap_or_default();
match teams.len() {
@ -135,18 +138,52 @@ pub fn get_config(
}
}),
ios_features: ios_options.features.clone(),
bundle_version: config.version.clone(),
bundle_version_short: config.version.clone(),
bundle_version: tauri_config.version.clone(),
bundle_version_short: tauri_config.version.clone(),
ios_version: Some(TARGET_IOS_VERSION.into()),
..Default::default()
};
let config = AppleConfig::from_raw(app.clone(), Some(raw)).unwrap();
let tauri_dir = tauri_dir();
let mut vendor_frameworks = Vec::new();
let mut frameworks = Vec::new();
for framework in tauri_config
.bundle
.ios
.frameworks
.clone()
.unwrap_or_default()
{
let framework_path = PathBuf::from(&framework);
let ext = framework_path.extension().unwrap_or_default();
if ext.is_empty() {
frameworks.push(framework);
} else if ext == "framework" {
frameworks.push(
framework_path
.file_stem()
.unwrap()
.to_string_lossy()
.to_string(),
);
} else {
vendor_frameworks.push(
relativize_path(tauri_dir.join(framework_path), config.project_dir())
.to_string_lossy()
.to_string(),
);
}
}
let metadata = AppleMetadata {
supported: true,
ios: ApplePlatform {
cargo_args: Some(ios_options.args),
features: ios_options.features,
frameworks: Some(frameworks),
vendor_frameworks: Some(vendor_frameworks),
..Default::default()
},
macos: Default::default(),

View File

@ -97,19 +97,16 @@ targets:
embed: false
{{~#each ios-libraries}}
- framework: {{this}}
embed: false{{/each}}
{{~#each ios-vendor-frameworks}}
- framework: {{prefix-path this}}{{/each}}
{{~#each ios-vendor-sdks}}
- sdk: {{prefix-path this}}{{/each}}
embed: false{{/each}}{{#if ios-vendor-frameworks}}{{~#each ios-vendor-frameworks}}
- framework: {{this}}{{/each}}{{/if}}{{#if ios-vendor-sdks}}{{~#each ios-vendor-sdks}}
- sdk: {{prefix-path this}}{{/each}}{{/if}}
- sdk: CoreGraphics.framework
- sdk: Metal.framework
- sdk: MetalKit.framework
- sdk: QuartzCore.framework
- sdk: Security.framework
- sdk: UIKit.framework
{{~#each ios-frameworks}}
- sdk: {{this}}.framework{{/each}}
- sdk: UIKit.framework{{#if this.ios-frameworks}}{{~#each ios-frameworks}}
- sdk: {{this}}.framework{{/each}}{{/if}}
- sdk: WebKit.framework
preBuildScripts:
{{~#each ios-pre-build-scripts}}{{#if this.path}}