From 51849a6f1b29528540312bd48eb25aee1ff7b4b4 Mon Sep 17 00:00:00 2001 From: ReinaldoAssis Date: Thu, 22 Oct 2026 14:15:34 -0300 Subject: [PATCH] fix: make the iOS test bundle identifier configurable - Keep `com.reinaldoassis.atlas` as the production identifier in `tauri.conf.json`, but let local signed builds use the App ID tied to the personal Xcode team. - Add `tools/ios-test-config.mjs` + `ios:dev`/`ios:build` scripts: they write a gitignored `tauri.ios.test.local.json` (default `com.randroi75.atlas`, override with `ATLAS_IOS_BUNDLE_ID`) and pass it through `tauri --config`, which syncs `PRODUCT_BUNDLE_IDENTIFIER` in the Xcode project. - Align the generated `project.yml`/`pbxproj` with the production identifier and document the Xcode account requirement (`No Accounts` / `No profiles`). --- .gitignore | 3 ++ AGENTS.md | 4 ++ docs/IOS-SIDELOAD.md | 32 +++++++++++++- package.json | 3 ++ .../gen/apple/app.xcodeproj/project.pbxproj | 4 +- src-tauri/gen/apple/project.yml | 4 +- tools/ios-test-config.mjs | 42 +++++++++++++++++++ 7 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 tools/ios-test-config.mjs diff --git a/.gitignore b/.gitignore index 1c8a8c5..c66bbb7 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ Thumbs.db # Vite vite.config.js.timestamp-* vite.config.ts.timestamp-* + +# Tauri iOS test build override (generated by tools/ios-test-config.mjs) +src-tauri/tauri.ios.test.local.json diff --git a/AGENTS.md b/AGENTS.md index e2de5b7..5c614cc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -49,3 +49,7 @@ Regras e atalhos para quem (agente ou humano) mexe neste repositório. (foi a causa de um bug de FAB) — cuidado com overlays dentro do `#pg`. - `npm run csp:check` roda o app empacotado no Chromium (CSP + boot); `tools/probe.mjs` mede layout por CDP. +- **iOS assinado (Mac)**: `npm run ios:dev` / `ios:build` usam um id de teste + configurável (`ATLAS_IOS_BUNDLE_ID`, padrão `com.randroi75.atlas`) e não + alteram o id de produção do `tauri.conf.json`. Xcode precisa da conta em + Settings → Accounts. Ver `docs/IOS-SIDELOAD.md` §2b. diff --git a/docs/IOS-SIDELOAD.md b/docs/IOS-SIDELOAD.md index 0bbfb45..d995911 100644 --- a/docs/IOS-SIDELOAD.md +++ b/docs/IOS-SIDELOAD.md @@ -74,6 +74,35 @@ O comando roda `tauri ios build --no-sign --target aarch64`. - Se aparecer `cargo: command not found`, rode de um shell interativo: o script phase do Xcode herda o `PATH` do processo que lançou o `tauri`. +## 2b. Rodar no iPhone pelo Xcode (build assinado) + +O id de **produção** é `com.reinaldoassis.atlas`. A conta pessoal do Xcode usa +outro App ID (`com.randroi75.atlas`, team `QNHMJF4W4N`), então os comandos +abaixo geram um override local (`src-tauri/tauri.ios.test.local.json`, fora do +git) e o passam via `--config`; o Tauri sincroniza o `PRODUCT_BUNDLE_IDENTIFIER` +do projeto Xcode sozinho. + +```bash +npm run ios:dev # padrão de teste: com.randroi75.atlas +npm run ios:build +npm run ios:id # só grava/mostra o id de teste atual + +ATLAS_IOS_BUNDLE_ID=com.outro.atlas npm run ios:dev +npm run ios:dev -- --open # abre no Xcode +``` + +Antes do primeiro run: **Xcode → Settings → Accounts**, entre com o Apple ID da +conta e confira o team em *Signing & Capabilities*. Sem conta configurada o +`xcodebuild` falha com `No Accounts` / `No profiles` antes de compilar. + +`tauri ios dev` reescreve o id dentro de +`src-tauri/gen/apple/app.xcodeproj/project.pbxproj` a cada run. Para voltar ao +id de produção no working tree: + +```bash +git checkout -- src-tauri/gen/apple/app.xcodeproj/project.pbxproj +``` + ## 3. Instalar o Atlas pelo SideStore 1. Mande o `Atlas.ipa` para o iPhone (AirDrop, Arquivos/iCloud, etc.). @@ -82,7 +111,7 @@ O comando roda `tauri ios build --no-sign --target aarch64`. 4. Confie no perfil do app em **Ajustes › Geral › VPN e Gerenciamento de Dispositivo**, se o iOS pedir. -O app aparece como **Atlas** (`com.randroi75.atlas`). +O app aparece como **Atlas** (`com.reinaldoassis.atlas`). ## 4. Primeira abertura @@ -127,6 +156,7 @@ O app aparece como **Atlas** (`com.randroi75.atlas`). | Instalação falha sem mensagem | Confira LocalDevVPN ligada, Wi-Fi e espaço livre | | Build local falha com `clang_rt.ios not found` | `cargo clean` em `src-tauri` (target antigo guarda resource dir de outro Xcode) | | Build pede time de desenvolvimento | Use `npm run ipa` (`--no-sign`); confira `bundle.iOS.developmentTeam` no `tauri.conf.json` | +| `No Accounts` / `No profiles for ...` | Xcode → Settings → Accounts: entre com o Apple ID da conta. Para dev assinado use `npm run ios:dev` (id de teste configurável). | | Sync não encontra o outro aparelho | Aceite **Rede Local**; confira se os dois estão na mesma Wi-Fi e use “Parear por endereço” como plano B | ## Checklist rápido no device diff --git a/package.json b/package.json index 2b81176..e30ada7 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,9 @@ "android:build": "tauri android build", "build:macos": "bash tools/build-macos.sh", "ipa": "tauri ios build --no-sign --target aarch64", + "ios:id": "node tools/ios-test-config.mjs", + "ios:dev": "node tools/ios-test-config.mjs && tauri ios dev --config src-tauri/tauri.ios.test.local.json", + "ios:build": "node tools/ios-test-config.mjs && tauri ios build --config src-tauri/tauri.ios.test.local.json", "prepare": "svelte-kit sync && paraglide-js compile --project ./project.inlang || echo ''", "version:set": "node tools/version.mjs set", "version:check": "node tools/version.mjs check", diff --git a/src-tauri/gen/apple/app.xcodeproj/project.pbxproj b/src-tauri/gen/apple/app.xcodeproj/project.pbxproj index 48e13c4..034cbf4 100644 --- a/src-tauri/gen/apple/app.xcodeproj/project.pbxproj +++ b/src-tauri/gen/apple/app.xcodeproj/project.pbxproj @@ -338,7 +338,7 @@ ); "LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/$(PLATFORM_NAME) $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/$(PLATFORM_NAME)"; "LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/$(PLATFORM_NAME) $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/$(PLATFORM_NAME)"; - PRODUCT_BUNDLE_IDENTIFIER = com.randroi75.atlas; + PRODUCT_BUNDLE_IDENTIFIER = com.reinaldoassis.atlas; PRODUCT_NAME = "Atlas"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -426,7 +426,7 @@ ); "LIBRARY_SEARCH_PATHS[arch=arm64]" = "$(inherited) $(PROJECT_DIR)/Externals/arm64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/$(PLATFORM_NAME) $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/$(PLATFORM_NAME)"; "LIBRARY_SEARCH_PATHS[arch=x86_64]" = "$(inherited) $(PROJECT_DIR)/Externals/x86_64/$(CONFIGURATION) $(SDKROOT)/usr/lib/swift $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/$(PLATFORM_NAME) $(DEVELOPER_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/$(PLATFORM_NAME)"; - PRODUCT_BUNDLE_IDENTIFIER = com.randroi75.atlas; + PRODUCT_BUNDLE_IDENTIFIER = com.reinaldoassis.atlas; PRODUCT_NAME = "Atlas"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/src-tauri/gen/apple/project.yml b/src-tauri/gen/apple/project.yml index b6321ea..5cc4b52 100644 --- a/src-tauri/gen/apple/project.yml +++ b/src-tauri/gen/apple/project.yml @@ -1,6 +1,6 @@ name: app options: - bundleIdPrefix: com.randroi75.atlas + bundleIdPrefix: com.reinaldoassis.atlas deploymentTarget: iOS: 15.4 fileGroups: [../../src] @@ -11,7 +11,7 @@ settingGroups: app: base: PRODUCT_NAME: Atlas - PRODUCT_BUNDLE_IDENTIFIER: com.randroi75.atlas + PRODUCT_BUNDLE_IDENTIFIER: com.reinaldoassis.atlas DEVELOPMENT_TEAM: QNHMJF4W4N targetTemplates: app: diff --git a/tools/ios-test-config.mjs b/tools/ios-test-config.mjs new file mode 100644 index 0000000..e8ae892 --- /dev/null +++ b/tools/ios-test-config.mjs @@ -0,0 +1,42 @@ +#!/usr/bin/env node +/** + * Gera o override de configuração usado nos builds de teste do iOS. + * + * O identificador de produção (`com.reinaldoassis.atlas`) fica no + * `src-tauri/tauri.conf.json`; a conta pessoal do Xcode usa outro App ID, então + * os comandos `npm run ios:dev` / `npm run ios:build` passam este arquivo via + * `--config` e o Tauri sincroniza o `PRODUCT_BUNDLE_IDENTIFIER` do projeto + * Xcode sozinho. + * + * Uso: + * node tools/ios-test-config.mjs # padrão de teste + * ATLAS_IOS_BUNDLE_ID=com.foo.atlas npm run ios:dev + * node tools/ios-test-config.mjs com.foo.atlas + * + * O arquivo gerado é local (`.gitignore`) e o de produção nunca é alterado. + */ +import { writeFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const DEFAULT_TEST_ID = 'com.randroi75.atlas'; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const arg = process.argv[2]?.trim(); +const env = process.env.ATLAS_IOS_BUNDLE_ID?.trim(); +const identifier = arg || env || DEFAULT_TEST_ID; + +if (!/^[A-Za-z0-9][A-Za-z0-9.-]*$/.test(identifier) || !identifier.includes('.')) { + console.error(`Identificador inválido: "${identifier}". Use algo como com.exemplo.atlas.`); + process.exit(1); +} + +const file = resolve(root, 'src-tauri/tauri.ios.test.local.json'); +const config = { + $schema: '../node_modules/@tauri-apps/cli/config.schema.json', + identifier +}; + +writeFileSync(file, `${JSON.stringify(config, null, 2)}\n`); +console.log(`iOS test bundle id: ${identifier}`); +console.log(`config: ${file}`);