Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
32 changes: 31 additions & 1 deletion docs/IOS-SIDELOAD.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.).
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 2 additions & 2 deletions src-tauri/gen/apple/app.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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";
Expand Down
4 changes: 2 additions & 2 deletions src-tauri/gen/apple/project.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: app
options:
bundleIdPrefix: com.randroi75.atlas
bundleIdPrefix: com.reinaldoassis.atlas
deploymentTarget:
iOS: 15.4
fileGroups: [../../src]
Expand All @@ -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:
Expand Down
42 changes: 42 additions & 0 deletions tools/ios-test-config.mjs
Original file line number Diff line number Diff line change
@@ -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}`);
Loading