mirror of
https://github.com/awizemann/scarf.git
synced 2026-05-08 02:14:37 +00:00
iOS target reconciliation: integrate Xcode-created scarf mobile target
Three-way reconciliation of:
- my M2/M3 source tree at scarf/scarf-ios/
- Alan's Xcode-created target with folder scarf/Scarf iOS/ and
target name `scarf mobile` (bundle com.scarf-mobile.app)
- the Mac `scarf` target that already had ScarfCore wired in
Alan created the iOS target on the unrelated `template-configuration`
branch (commit b289a83). I pulled only the iOS-specific bits
(Scarf iOS/ folder, Scarf iOS{Tests,UITests}/, and the pbxproj
additions), leaving the template-config work alone.
## Source tree: one folder, no duplicates
Before:
- scarf/scarf-ios/{App,Onboarding,Dashboard,Assets.xcassets,SETUP.md}
- scarf/Scarf iOS/{ContentView,Item,Scarf_iOSApp}.swift (Xcode defaults)
- scarf/Scarf iOS/Assets.xcassets/ (empty stubs)
After:
- scarf/Scarf iOS/{App,Onboarding,Dashboard,Assets.xcassets,
Info.plist,Scarf_iOS.entitlements}
- scarf/Scarf iOSTests/Scarf_iOSTests.swift (placeholder)
- scarf/Scarf iOSUITests/Scarf_iOSUITests*.swift (placeholder)
Deleted:
- scarf/Scarf iOS/ContentView.swift (my App/ScarfIOSApp supersedes)
- scarf/Scarf iOS/Item.swift (Xcode's SwiftData boilerplate,
unused)
- scarf/Scarf iOS/Scarf_iOSApp.swift (my App/ScarfIOSApp supersedes)
- scarf/Scarf iOS/Assets.xcassets/ (replaced with pre-built
1024 icon + Scarf-teal accent)
- scarf/scarf-ios/ (emptied + removed)
Moved:
- scarf/scarf-ios/SETUP.md → scarf/docs/iOS-SETUP.md
Docs belong in docs/ now that the target exists; the old
walkthrough is rewritten as a "project layout reference"
post-setup — the step-by-step target-creation instructions
are moot.
## pbxproj: three-way merge, no conflicts
Used git merge-file between:
base = main's pbxproj (before M0a + b289a83)
ours = M3 branch's pbxproj (has ScarfCore wired to Mac target)
theirs = b289a83 (has iOS target additions)
Merge produced zero conflict markers (658 → 1074 lines, +~416
from Alan's target additions and my M0a ScarfCore wiring). Hand-
added on top:
- 53SCARFIOS0020: new XCLocalSwiftPackageReference pointing at
Packages/ScarfIOS
- 53SCARFIOS0001: XCSwiftPackageProductDependency for ScarfIOS
product
- 53SCARFCORE0002: second XCSwiftPackageProductDependency for
ScarfCore (separate nav reference from the Mac target's so
Xcode can track per-target memberships cleanly)
- 53SCARFCORE0011 + 53SCARFIOS0010: PBXBuildFile entries linking
both frameworks into the iOS target's Frameworks build phase
- packageReferences on the project: added 53SCARFIOS0020
- scarf mobile target's packageProductDependencies: added
53SCARFCORE0002 + 53SCARFIOS0001
- scarf mobile target's Frameworks build phase files: added
53SCARFCORE0011 + 53SCARFIOS0010
Mac target (scarf) is unchanged structurally — still wires
53SCARFCORE0001 as before.
## docs/iOS-SETUP.md rewrite
Rewrote from "how to create the target" to "project layout
reference + troubleshooting". Key sections:
- Target settings (name, bundle ID, deployment, team, Swift
language version)
- SPM dependency map (ScarfCore on both; ScarfIOS on iOS only)
- Entitlements audit: called out that Xcode defaults set
CloudKit + APNs entitlements that we don't actually use in
M2-M4. Keeping them for now since they're no-ops; flagged
for M6 polish.
- Milestone coverage table
- Troubleshooting entries for the 4 most likely build failures
(Citadel resolution, `Cannot find Process`, stale auth variant
name, Keychain access)
## Sanity check
Linux `swift test` on ScarfCore still 96/96 passing. The Xcode
build will need Mac verification.
https://claude.ai/code/session_019yMRP6mwZWfzVrPTqevx2y
This commit is contained in:
|
Before Width: | Height: | Size: 4.4 MiB After Width: | Height: | Size: 4.4 MiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>UIBackgroundModes</key>
|
||||||
|
<array>
|
||||||
|
<string>remote-notification</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>aps-environment</key>
|
||||||
|
<string>development</string>
|
||||||
|
<key>com.apple.developer.icloud-container-identifiers</key>
|
||||||
|
<array/>
|
||||||
|
<key>com.apple.developer.icloud-services</key>
|
||||||
|
<array>
|
||||||
|
<string>CloudKit</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// Scarf_iOSTests.swift
|
||||||
|
// Scarf iOSTests
|
||||||
|
//
|
||||||
|
// Created by Alan Wizemann on 4/23/26.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Testing
|
||||||
|
@testable import Scarf_iOS
|
||||||
|
|
||||||
|
struct Scarf_iOSTests {
|
||||||
|
|
||||||
|
@Test func example() async throws {
|
||||||
|
// Write your test here and use APIs like `#expect(...)` to check expected conditions.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
//
|
||||||
|
// Scarf_iOSUITests.swift
|
||||||
|
// Scarf iOSUITests
|
||||||
|
//
|
||||||
|
// Created by Alan Wizemann on 4/23/26.
|
||||||
|
//
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
final class Scarf_iOSUITests: XCTestCase {
|
||||||
|
|
||||||
|
override func setUpWithError() throws {
|
||||||
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
|
|
||||||
|
// In UI tests it is usually best to stop immediately when a failure occurs.
|
||||||
|
continueAfterFailure = false
|
||||||
|
|
||||||
|
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tearDownWithError() throws {
|
||||||
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
func testExample() throws {
|
||||||
|
// UI tests must launch the application that they test.
|
||||||
|
let app = XCUIApplication()
|
||||||
|
app.launch()
|
||||||
|
|
||||||
|
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
func testLaunchPerformance() throws {
|
||||||
|
// This measures how long it takes to launch your application.
|
||||||
|
measure(metrics: [XCTApplicationLaunchMetric()]) {
|
||||||
|
XCUIApplication().launch()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
//
|
||||||
|
// Scarf_iOSUITestsLaunchTests.swift
|
||||||
|
// Scarf iOSUITests
|
||||||
|
//
|
||||||
|
// Created by Alan Wizemann on 4/23/26.
|
||||||
|
//
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
final class Scarf_iOSUITestsLaunchTests: XCTestCase {
|
||||||
|
|
||||||
|
override class var runsForEachTargetApplicationUIConfiguration: Bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
override func setUpWithError() throws {
|
||||||
|
continueAfterFailure = false
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
func testLaunch() throws {
|
||||||
|
let app = XCUIApplication()
|
||||||
|
app.launch()
|
||||||
|
|
||||||
|
// Insert steps here to perform after app launch but before taking a screenshot,
|
||||||
|
// such as logging into a test account or navigating somewhere in the app
|
||||||
|
|
||||||
|
let attachment = XCTAttachment(screenshot: app.screenshot())
|
||||||
|
attachment.name = "Launch Screen"
|
||||||
|
attachment.lifetime = .keepAlways
|
||||||
|
add(attachment)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
# Scarf Mobile — iOS build & setup
|
||||||
|
|
||||||
|
The iOS app target (`scarf mobile`) is already set up inside the
|
||||||
|
shared `scarf.xcodeproj`. This document records what was done so
|
||||||
|
future contributors understand the project layout; the step-by-step
|
||||||
|
target-creation instructions that used to live here are moot now
|
||||||
|
that the target exists.
|
||||||
|
|
||||||
|
## Layout
|
||||||
|
|
||||||
|
```
|
||||||
|
scarf/
|
||||||
|
scarf.xcodeproj/ Single project, multiple targets:
|
||||||
|
- scarf (macOS app)
|
||||||
|
- scarf mobile (iOS app, Bundle com.scarf-mobile.app)
|
||||||
|
- Mac + iOS test bundles
|
||||||
|
Packages/
|
||||||
|
ScarfCore/ Local SPM — shared platform-neutral code
|
||||||
|
(Models, Transport, Services, ViewModels,
|
||||||
|
ACP state machine). Consumed by BOTH
|
||||||
|
Mac and iOS targets.
|
||||||
|
ScarfIOS/ Local SPM — iOS-specific
|
||||||
|
(CitadelSSHService, CitadelServerTransport,
|
||||||
|
Keychain, UserDefaults-backed stores).
|
||||||
|
Consumed by iOS target only.
|
||||||
|
scarf/ PBXFileSystemSynchronizedRootGroup for Mac
|
||||||
|
target. Every .swift under this tree is
|
||||||
|
auto-compiled into the Mac app.
|
||||||
|
Scarf iOS/ PBXFileSystemSynchronizedRootGroup for
|
||||||
|
iOS target. Same auto-compile pattern.
|
||||||
|
App/
|
||||||
|
ScarfIOSApp.swift @main entry point
|
||||||
|
Onboarding/
|
||||||
|
OnboardingRootView.swift
|
||||||
|
Dashboard/
|
||||||
|
DashboardView.swift
|
||||||
|
Assets.xcassets/ App icon + Scarf-teal accent color
|
||||||
|
Info.plist
|
||||||
|
Scarf_iOS.entitlements
|
||||||
|
Scarf iOSTests/ iOS unit tests (XCTest)
|
||||||
|
Scarf iOSUITests/ iOS UI tests (XCTest)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Target settings
|
||||||
|
|
||||||
|
As configured in `scarf.xcodeproj/project.pbxproj`:
|
||||||
|
|
||||||
|
- **Product name**: `scarf mobile`
|
||||||
|
- **Folder name** (on disk): `Scarf iOS`
|
||||||
|
- **Bundle ID**: `com.scarf-mobile.app`
|
||||||
|
- **Deployment target**: iOS 18.0, iPhone-only
|
||||||
|
- **Team**: `3Q6X2L86C4` (shared with the Mac target)
|
||||||
|
- **Swift language version**: Swift 5 (matches Mac + both SPM packages)
|
||||||
|
|
||||||
|
The product / folder naming mismatch is cosmetic — Xcode's
|
||||||
|
`PBXFileSystemSynchronizedRootGroup` decouples the two cleanly.
|
||||||
|
|
||||||
|
## SPM dependencies
|
||||||
|
|
||||||
|
Both local packages are wired into the iOS target in the pbxproj:
|
||||||
|
|
||||||
|
- `ScarfCore` (local package at `Packages/ScarfCore`) → shared with Mac.
|
||||||
|
- `ScarfIOS` (local package at `Packages/ScarfIOS`) → iOS-only; pulls
|
||||||
|
`Citadel 0.12.x` transitively.
|
||||||
|
|
||||||
|
On first open Xcode will resolve Citadel from GitHub (~30s-1min).
|
||||||
|
Delete DerivedData + **File → Packages → Reset Package Caches** if
|
||||||
|
it stalls.
|
||||||
|
|
||||||
|
## Build + run
|
||||||
|
|
||||||
|
1. Open `scarf/scarf.xcodeproj`.
|
||||||
|
2. Scheme picker top-left → select **scarf mobile**.
|
||||||
|
3. Destination → any iPhone simulator on iOS 18+.
|
||||||
|
4. ⌘R. Expect onboarding → dashboard flow.
|
||||||
|
|
||||||
|
Switch back to the Mac target with the scheme picker.
|
||||||
|
|
||||||
|
## Smoke test — end-to-end against a real Hermes host
|
||||||
|
|
||||||
|
1. Pick a host you own with a Hermes install at `~/.hermes/`.
|
||||||
|
2. Run the iOS app on a simulator or physical device.
|
||||||
|
3. Onboarding: enter the host, generate a new Ed25519 key, tap
|
||||||
|
**Copy** on the public-key screen, paste that line into
|
||||||
|
`~/.ssh/authorized_keys` on the remote, tap **I've added this key**.
|
||||||
|
4. If auth succeeds → **Connected** → Dashboard.
|
||||||
|
5. Dashboard should populate session stats + recent sessions within
|
||||||
|
a second or two (first load does a Citadel SSH handshake + SFTP
|
||||||
|
snapshot of `state.db`; subsequent refreshes reuse the same SSH
|
||||||
|
session).
|
||||||
|
|
||||||
|
## Info.plist / entitlements
|
||||||
|
|
||||||
|
Current iOS target is configured with:
|
||||||
|
|
||||||
|
- `UIBackgroundModes: remote-notification` (in Info.plist)
|
||||||
|
- `aps-environment: development` (in Scarf_iOS.entitlements)
|
||||||
|
- `com.apple.developer.icloud-services: [CloudKit]` (in entitlements)
|
||||||
|
|
||||||
|
These are Xcode's defaults from "Storage: CloudKit" + APNs-capable.
|
||||||
|
M2–M4 don't use any of them — no APNs in v1 per the plan, no
|
||||||
|
CloudKit at all. Leaving them in place for now since they're a
|
||||||
|
no-op; strip during M6 polish if App Store Review flags anything.
|
||||||
|
|
||||||
|
## Test targets
|
||||||
|
|
||||||
|
`Scarf iOSTests/Scarf_iOSTests.swift` and
|
||||||
|
`Scarf iOSUITests/Scarf_iOSUITests*.swift` are Xcode-scaffolded
|
||||||
|
placeholders. Real iOS behavioural coverage lives in:
|
||||||
|
|
||||||
|
- `Packages/ScarfCore/Tests/ScarfCoreTests/` — 96+ tests, all
|
||||||
|
runnable on Linux CI via `docker run --rm -v
|
||||||
|
$PWD/Packages/ScarfCore:/work -w /work swift:6.0 swift test`.
|
||||||
|
- `Packages/ScarfIOS/Tests/ScarfIOSTests/` — Apple-only smoke tests
|
||||||
|
(Ed25519 keygen + OpenSSH wire format).
|
||||||
|
|
||||||
|
## TestFlight upload
|
||||||
|
|
||||||
|
1. Scheme: **scarf mobile**. Destination: **Any iOS Device (arm64)**
|
||||||
|
or a physical iPhone.
|
||||||
|
2. **Product → Archive**.
|
||||||
|
3. **Window → Organizer → Distribute App → App Store Connect →
|
||||||
|
Upload**.
|
||||||
|
4. First upload creates the App Store Connect app record with
|
||||||
|
Bundle ID `com.scarf-mobile.app` under team `3Q6X2L86C4`.
|
||||||
|
5. Invite testers.
|
||||||
|
|
||||||
|
No network-usage `Info.plist` key needed — Citadel uses SwiftNIO
|
||||||
|
sockets, not Apple's local-network discovery.
|
||||||
|
|
||||||
|
## Milestone coverage
|
||||||
|
|
||||||
|
- **M0–M1**: ScarfCore extraction + `ACPChannel` protocol + decoupled
|
||||||
|
`ACPClient`. All Mac-only code; iOS target didn't exist yet.
|
||||||
|
- **M2**: Onboarding + SSH key generate/import + Keychain storage +
|
||||||
|
Citadel-backed "Test Connection" + Dashboard placeholder.
|
||||||
|
- **M3**: Real iOS `CitadelServerTransport` + live Dashboard data.
|
||||||
|
- **M4** *(in progress)*: iOS Chat via an `SSHExecACPChannel` built
|
||||||
|
on Citadel's raw exec channel. Plugs into `ACPClient.ChannelFactory`
|
||||||
|
(defined in M1), same JSON-RPC state machine as Mac.
|
||||||
|
- **M5**: Memory editor, Cron, Skills, Settings on iOS.
|
||||||
|
- **M6**: Polish, App Store submission.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**Citadel fails to resolve.** Delete DerivedData
|
||||||
|
(`~/Library/Developer/Xcode/DerivedData/scarf-*`) then **File →
|
||||||
|
Packages → Reset Package Caches**; rebuild.
|
||||||
|
|
||||||
|
**`Cannot find 'Process' in scope` when building scarf mobile.**
|
||||||
|
`ServerTransport.makeProcess` is guarded with `#if !os(iOS)` as of
|
||||||
|
M3. If this appears, grep the iOS target's membership for a stray
|
||||||
|
file referencing `Process()` directly.
|
||||||
|
|
||||||
|
**`SSHAuthenticationMethod` has no member `ed25519`.** Shouldn't
|
||||||
|
happen against Citadel 0.12.x (verified against 0.12.1 source).
|
||||||
|
If you bump the pin to 0.13+, check the current
|
||||||
|
`Sources/Citadel/SSHAuthenticationMethod.swift` — one line to update
|
||||||
|
in `ScarfIOS/CitadelSSHService.buildClientSettings(...)`.
|
||||||
|
|
||||||
|
**Dashboard says "Couldn't read the Hermes database".** Expected on
|
||||||
|
fresh Hermes installs where `~/.hermes/state.db` doesn't exist.
|
||||||
|
Start a Hermes session on the host first, then pull-to-refresh.
|
||||||
|
|
||||||
|
**Slow first-connect (10+ seconds).** Citadel's SSH handshake +
|
||||||
|
SFTP open is the critical path. If it's consistently that slow,
|
||||||
|
check that plain `ssh` works to the same host from a terminal with
|
||||||
|
the same key; sometimes the issue is a restricted login shell that
|
||||||
|
won't let `sqlite3` run.
|
||||||
|
|
||||||
|
**Keychain blank after relaunch.** Verify `kSecAttrAccessible` is
|
||||||
|
`AfterFirstUnlockThisDeviceOnly` (the default). Biometric-required
|
||||||
|
accessibility values would block startup reads from background tasks.
|
||||||
|
|
||||||
|
**Exported public key doesn't match what `ssh-keygen -y` produces
|
||||||
|
from the stored private.** Correct — the **public** half is standard
|
||||||
|
OpenSSH wire format (interop-safe with `authorized_keys`); the
|
||||||
|
**private** half uses a Scarf-internal compact PEM (see
|
||||||
|
`Packages/ScarfIOS/Sources/ScarfIOS/Ed25519KeyGenerator.swift`).
|
||||||
|
Export to `~/.ssh/id_ed25519` format is planned for a future phase.
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
# scarf-ios — Xcode target setup
|
|
||||||
|
|
||||||
This folder contains the source tree for the iOS app (`scarf-ios`).
|
|
||||||
The Xcode target itself is added to the **existing `scarf.xcodeproj`**
|
|
||||||
as a second target alongside the Mac `scarf` target — **not** a
|
|
||||||
separate `.xcodeproj`. One project, two targets.
|
|
||||||
|
|
||||||
Everything the app needs — SSH key generation, Keychain storage,
|
|
||||||
onboarding state machine, Citadel-backed SSH client, SQLite-backed
|
|
||||||
Dashboard — already lives in the shared SPM packages
|
|
||||||
(`Packages/ScarfCore`, `Packages/ScarfIOS`) and is exercised by
|
|
||||||
96 passing unit tests on Linux CI. The iOS target is mostly just a
|
|
||||||
wrapper that assembles those packages behind a `@main` SwiftUI app.
|
|
||||||
|
|
||||||
Creating the target is a one-time ~5-minute step in Xcode's UI.
|
|
||||||
|
|
||||||
## One-time: add the iOS target to the existing project
|
|
||||||
|
|
||||||
1. Open `scarf/scarf.xcodeproj` in **Xcode**.
|
|
||||||
2. Select the project in the Project Navigator.
|
|
||||||
3. **File → New → Target…** (or use the `+` button at the bottom of
|
|
||||||
the targets list).
|
|
||||||
4. Choose **iOS → App**. Click Next.
|
|
||||||
5. Fill in:
|
|
||||||
- **Product Name**: `scarf-ios`
|
|
||||||
- **Team**: `3Q6X2L86C4` (the same team the Mac target uses)
|
|
||||||
- **Organization Identifier**: `com.scarf`
|
|
||||||
- **Bundle Identifier** will be `com.scarf.scarf-ios`
|
|
||||||
- **Interface**: **SwiftUI**
|
|
||||||
- **Language**: **Swift**
|
|
||||||
- **Storage**: **None**
|
|
||||||
- **Include Tests**: unchecked (SPM covers them)
|
|
||||||
6. Click **Finish**. Xcode creates the target plus a default source
|
|
||||||
tree under `scarf/scarf-ios/` (a folder you'll immediately throw
|
|
||||||
away, since our real source lives there already).
|
|
||||||
7. If Xcode asks about "Activate scheme": **yes**.
|
|
||||||
|
|
||||||
## One-time: target settings
|
|
||||||
|
|
||||||
With the `scarf-ios` target selected in the project editor:
|
|
||||||
|
|
||||||
1. **General → Minimum Deployments → iPhone**: `iOS 18.0`.
|
|
||||||
2. **General → Supported Destinations**: keep **iPhone** only. Remove
|
|
||||||
iPad + Mac Catalyst + Vision.
|
|
||||||
3. **Signing & Capabilities → Team**: `3Q6X2L86C4` (should have
|
|
||||||
auto-filled from step 5 above).
|
|
||||||
4. **Build Settings → Swift Language Version**: `Swift 5` (matches
|
|
||||||
the Mac target + both SPM packages).
|
|
||||||
|
|
||||||
## One-time: link the SPM packages to the iOS target
|
|
||||||
|
|
||||||
`ScarfCore` and `ScarfIOS` are already in the project's package
|
|
||||||
references (the Mac target already uses ScarfCore). You only need to
|
|
||||||
add them to the NEW iOS target.
|
|
||||||
|
|
||||||
1. Select the project in the navigator → select the `scarf-ios`
|
|
||||||
target → **General → Frameworks, Libraries, and Embedded
|
|
||||||
Content**.
|
|
||||||
2. Click the `+` button.
|
|
||||||
3. Select **ScarfCore** (library from ScarfCore local package). Add.
|
|
||||||
4. Click `+` again. Select **ScarfIOS**. Add.
|
|
||||||
5. Citadel is pulled in transitively by ScarfIOS — no need to add it
|
|
||||||
explicitly. On first build Xcode resolves it from GitHub
|
|
||||||
(~30s-1min).
|
|
||||||
|
|
||||||
## One-time: replace the default source tree
|
|
||||||
|
|
||||||
1. In Xcode's Project Navigator, find the `scarf-ios` group Xcode
|
|
||||||
created. Delete:
|
|
||||||
- `scarf_iosApp.swift` (or `scarf-iosApp.swift`)
|
|
||||||
- `ContentView.swift`
|
|
||||||
- **`Assets.xcassets`** — we ship our own pre-built one.
|
|
||||||
2. In Finder, open `<repo>/scarf/scarf-ios/`. Drag these four folders
|
|
||||||
onto the `scarf-ios` group in Xcode:
|
|
||||||
- `App/`
|
|
||||||
- `Onboarding/`
|
|
||||||
- `Dashboard/`
|
|
||||||
- `Assets.xcassets/`
|
|
||||||
3. In the import sheet:
|
|
||||||
- **Destination**: Copy items if needed — **unchecked** (they're
|
|
||||||
already in place).
|
|
||||||
- **Added folders**: **Create groups**.
|
|
||||||
- **Add to targets**: **scarf-ios** only.
|
|
||||||
4. Build (`⌘B`). Should compile cleanly against Citadel 0.12.1 —
|
|
||||||
every API call in `CitadelSSHService` + `CitadelServerTransport`
|
|
||||||
was cross-checked against the 0.12.1 tag. If you've bumped the
|
|
||||||
pin to 0.13+ and something fails, check
|
|
||||||
`Sources/Citadel/SSHAuthenticationMethod.swift` for the current
|
|
||||||
`.ed25519(username:privateKey:)` spelling.
|
|
||||||
|
|
||||||
## App icon + accent color
|
|
||||||
|
|
||||||
Already in `Assets.xcassets/` so you don't configure anything:
|
|
||||||
|
|
||||||
- **`AppIcon.appiconset/AppIcon-1024.png`** — the 1024×1024 Scarf
|
|
||||||
icon copied from the Mac app's icon set. iOS 14+ renders all
|
|
||||||
smaller sizes automatically from the single 1024 image.
|
|
||||||
- **`AccentColor.colorset`** — custom Scarf teal (sRGB `0.227 /
|
|
||||||
0.525 / 0.722` light mode; `0.400 / 0.690 / 0.902` dark). Edit
|
|
||||||
`Contents.json` or Xcode's color picker to change.
|
|
||||||
|
|
||||||
## Info.plist for TestFlight
|
|
||||||
|
|
||||||
Under the scarf-ios target → **Info → Custom iOS Target Properties**:
|
|
||||||
|
|
||||||
- `LSRequiresIPhoneOS = YES` (usually defaulted)
|
|
||||||
- `UIApplicationSceneManifest → UIApplicationSupportsMultipleScenes = NO`
|
|
||||||
(iPhone single-window)
|
|
||||||
- `UILaunchScreen` — empty dictionary is fine
|
|
||||||
|
|
||||||
Citadel uses SwiftNIO, not Apple's local-network discovery, so no
|
|
||||||
network-usage-description key is needed.
|
|
||||||
|
|
||||||
## Smoke test
|
|
||||||
|
|
||||||
1. Switch the run destination to an iPhone simulator (any iPhone
|
|
||||||
running iOS 18+). Xcode's target switcher lets you toggle between
|
|
||||||
scarf (macOS) and scarf-ios.
|
|
||||||
2. ⌘R. Expect the onboarding flow:
|
|
||||||
**Remote host** → **SSH key choice** → **Generate** → **Show
|
|
||||||
public key** → **I've added this** → **Test connection** → ...
|
|
||||||
3. On **Show public key**, the OpenSSH line is selectable + copyable
|
|
||||||
(`ssh-ed25519 AAAA… scarf-iphone-XXXX`).
|
|
||||||
4. Without a real SSH server, **Test connection** will fail with
|
|
||||||
`.hostUnreachable` — that's expected. Land on the **Connection
|
|
||||||
failed** screen with a **Retry** button.
|
|
||||||
5. Real end-to-end: use a host you own. Copy the shown public key
|
|
||||||
into `~/.ssh/authorized_keys` on that host. Tap **Retry**. You
|
|
||||||
should reach **Connected** → **Dashboard**, which then does a
|
|
||||||
Citadel SFTP snapshot of `~/.hermes/state.db` and renders
|
|
||||||
session + token stats.
|
|
||||||
|
|
||||||
## TestFlight upload
|
|
||||||
|
|
||||||
1. Scheme selector top-left → **scarf-ios**. Destination: **Any iOS
|
|
||||||
Device (arm64)** or a physical iPhone.
|
|
||||||
2. **Product → Archive**.
|
|
||||||
3. **Window → Organizer → Archives → Distribute App → App Store
|
|
||||||
Connect → Upload**.
|
|
||||||
4. First upload creates the App Store Connect app record with
|
|
||||||
`com.scarf.scarf-ios`. Same team as the Mac app.
|
|
||||||
5. Invite testers from App Store Connect.
|
|
||||||
|
|
||||||
## What's in each milestone
|
|
||||||
|
|
||||||
- **M2** — Onboarding (SSH key + Keychain), Citadel-based
|
|
||||||
"Test Connection", Dashboard placeholder.
|
|
||||||
- **M3** — Real Dashboard via `CitadelServerTransport` +
|
|
||||||
`HermesDataService` (you're running the M3 PR now).
|
|
||||||
- **M4** — Chat over an iOS `SSHExecACPChannel`.
|
|
||||||
- **M5** — Memory editing, Cron, Skills, Settings.
|
|
||||||
- **M6** — Polish + App Store submission.
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**Citadel fails to resolve.** Delete DerivedData
|
|
||||||
(`~/Library/Developer/Xcode/DerivedData/scarf-*`) and **File →
|
|
||||||
Packages → Reset Package Caches**, then rebuild.
|
|
||||||
|
|
||||||
**`Cannot find 'Process' in scope` when building scarf-ios.** Should
|
|
||||||
not happen post-M3 — the `makeProcess` protocol method is now
|
|
||||||
`#if !os(iOS)`-guarded. If you see this: grep the scarf-ios target's
|
|
||||||
source files for `Process()`, `process.isRunning`, or `terminationHandler`
|
|
||||||
— something Mac-only leaked into the iOS target's membership.
|
|
||||||
|
|
||||||
**`SSHAuthenticationMethod` has no member `ed25519`.** Shouldn't happen
|
|
||||||
against Citadel 0.12.1 (verified), but historically the private-key
|
|
||||||
variant names have changed between minor versions (0.7 → 0.9 → 0.12).
|
|
||||||
See `CitadelSSHService.buildClientSettings(...)` in ScarfIOS — one
|
|
||||||
line to update. Keep the protocol conformance intact.
|
|
||||||
|
|
||||||
**Dashboard shows "Couldn't read the Hermes database".** Expected if
|
|
||||||
the host's `~/.hermes/state.db` doesn't exist yet (fresh Hermes
|
|
||||||
install). Start a Hermes session on the host first, then pull-to-
|
|
||||||
refresh.
|
|
||||||
|
|
||||||
**Dashboard spins forever on first connect.** Citadel connection
|
|
||||||
hand-shake + SFTP open can take 5-10s on a cold network. If it's
|
|
||||||
longer, check that the same SSH key works from a regular `ssh` client
|
|
||||||
against the same host — sometimes the issue is an authorized_keys
|
|
||||||
line with a trailing whitespace, or the host uses a restricted shell
|
|
||||||
that blocks `sqlite3`.
|
|
||||||
|
|
||||||
**Keychain reads empty after relaunch.** Check you haven't set
|
|
||||||
`kSecAttrAccessible` to a biometric-required value. We use
|
|
||||||
`AfterFirstUnlockThisDeviceOnly`, which is readable any time after
|
|
||||||
the first post-boot unlock.
|
|
||||||
|
|
||||||
**The public-key line doesn't match what `ssh-keygen` would produce
|
|
||||||
from the same private key.** The **public** key is standard OpenSSH
|
|
||||||
wire format (interop-safe with `authorized_keys`). The **private**
|
|
||||||
key uses a compact Scarf-internal PEM (see
|
|
||||||
`ScarfIOS/Ed25519KeyGenerator.swift`) — it's not directly exportable
|
|
||||||
to `~/.ssh/id_ed25519`. A future phase adds an export flow that
|
|
||||||
re-serializes to standard OpenSSH PEM.
|
|
||||||
@@ -9,10 +9,26 @@
|
|||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
53495AB62F7B992C00BD31AD /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 53SWIFTTERM0001 /* SwiftTerm */; };
|
53495AB62F7B992C00BD31AD /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 53SWIFTTERM0001 /* SwiftTerm */; };
|
||||||
53SCARFCORE0010 /* ScarfCore in Frameworks */ = {isa = PBXBuildFile; productRef = 53SCARFCORE0001 /* ScarfCore */; };
|
53SCARFCORE0010 /* ScarfCore in Frameworks */ = {isa = PBXBuildFile; productRef = 53SCARFCORE0001 /* ScarfCore */; };
|
||||||
|
53SCARFCORE0011 /* ScarfCore in Frameworks (iOS) */ = {isa = PBXBuildFile; productRef = 53SCARFCORE0002 /* ScarfCore */; };
|
||||||
|
53SCARFIOS0010 /* ScarfIOS in Frameworks */ = {isa = PBXBuildFile; productRef = 53SCARFIOS0001 /* ScarfIOS */; };
|
||||||
53SPARKLE00010 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 53SPARKLE00011 /* Sparkle */; };
|
53SPARKLE00010 /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = 53SPARKLE00011 /* Sparkle */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
4EAC233A2F99930100654F42 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 534959382F7B83B600BD31AD /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 4EAC23282F99930000654F42;
|
||||||
|
remoteInfo = "Scarf iOS";
|
||||||
|
};
|
||||||
|
4EAC23442F99930100654F42 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 534959382F7B83B600BD31AD /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 4EAC23282F99930000654F42;
|
||||||
|
remoteInfo = "Scarf iOS";
|
||||||
|
};
|
||||||
534959502F7B83B700BD31AD /* PBXContainerItemProxy */ = {
|
534959502F7B83B700BD31AD /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = 534959382F7B83B600BD31AD /* Project object */;
|
containerPortal = 534959382F7B83B600BD31AD /* Project object */;
|
||||||
@@ -30,12 +46,22 @@
|
|||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
4EAC23292F99930000654F42 /* scarf mobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "scarf mobile.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
4EAC23392F99930100654F42 /* Scarf iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Scarf iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
4EAC23432F99930100654F42 /* Scarf iOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Scarf iOSUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
534959402F7B83B600BD31AD /* scarf.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = scarf.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
534959402F7B83B600BD31AD /* scarf.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = scarf.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
5349594F2F7B83B700BD31AD /* scarfTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = scarfTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
5349594F2F7B83B700BD31AD /* scarfTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = scarfTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
534959592F7B83B700BD31AD /* scarfUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = scarfUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
534959592F7B83B700BD31AD /* scarfUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = scarfUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
4EAC234B2F99930100654F42 /* Exceptions for "Scarf iOS" folder in "scarf mobile" target */ = {
|
||||||
|
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||||
|
membershipExceptions = (
|
||||||
|
Info.plist,
|
||||||
|
);
|
||||||
|
target = 4EAC23282F99930000654F42 /* scarf mobile */;
|
||||||
|
};
|
||||||
534959AA2F7B83B600BD31AD /* Exceptions for "scarf" folder in "scarf" target */ = {
|
534959AA2F7B83B600BD31AD /* Exceptions for "scarf" folder in "scarf" target */ = {
|
||||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||||
membershipExceptions = (
|
membershipExceptions = (
|
||||||
@@ -46,6 +72,24 @@
|
|||||||
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
|
||||||
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
||||||
|
4EAC232A2F99930000654F42 /* Scarf iOS */ = {
|
||||||
|
isa = PBXFileSystemSynchronizedRootGroup;
|
||||||
|
exceptions = (
|
||||||
|
4EAC234B2F99930100654F42 /* Exceptions for "Scarf iOS" folder in "scarf mobile" target */,
|
||||||
|
);
|
||||||
|
path = "Scarf iOS";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
4EAC233C2F99930100654F42 /* Scarf iOSTests */ = {
|
||||||
|
isa = PBXFileSystemSynchronizedRootGroup;
|
||||||
|
path = "Scarf iOSTests";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
4EAC23462F99930100654F42 /* Scarf iOSUITests */ = {
|
||||||
|
isa = PBXFileSystemSynchronizedRootGroup;
|
||||||
|
path = "Scarf iOSUITests";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
534959422F7B83B600BD31AD /* scarf */ = {
|
534959422F7B83B600BD31AD /* scarf */ = {
|
||||||
isa = PBXFileSystemSynchronizedRootGroup;
|
isa = PBXFileSystemSynchronizedRootGroup;
|
||||||
exceptions = (
|
exceptions = (
|
||||||
@@ -67,6 +111,29 @@
|
|||||||
/* End PBXFileSystemSynchronizedRootGroup section */
|
/* End PBXFileSystemSynchronizedRootGroup section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
4EAC23262F99930000654F42 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
53SCARFCORE0011 /* ScarfCore in Frameworks (iOS) */,
|
||||||
|
53SCARFIOS0010 /* ScarfIOS in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
4EAC23362F99930100654F42 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
4EAC23402F99930100654F42 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
5349593D2F7B83B600BD31AD /* Frameworks */ = {
|
5349593D2F7B83B600BD31AD /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -100,6 +167,9 @@
|
|||||||
534959422F7B83B600BD31AD /* scarf */,
|
534959422F7B83B600BD31AD /* scarf */,
|
||||||
534959522F7B83B700BD31AD /* scarfTests */,
|
534959522F7B83B700BD31AD /* scarfTests */,
|
||||||
5349595C2F7B83B700BD31AD /* scarfUITests */,
|
5349595C2F7B83B700BD31AD /* scarfUITests */,
|
||||||
|
4EAC232A2F99930000654F42 /* Scarf iOS */,
|
||||||
|
4EAC233C2F99930100654F42 /* Scarf iOSTests */,
|
||||||
|
4EAC23462F99930100654F42 /* Scarf iOSUITests */,
|
||||||
534959412F7B83B600BD31AD /* Products */,
|
534959412F7B83B600BD31AD /* Products */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -110,6 +180,9 @@
|
|||||||
534959402F7B83B600BD31AD /* scarf.app */,
|
534959402F7B83B600BD31AD /* scarf.app */,
|
||||||
5349594F2F7B83B700BD31AD /* scarfTests.xctest */,
|
5349594F2F7B83B700BD31AD /* scarfTests.xctest */,
|
||||||
534959592F7B83B700BD31AD /* scarfUITests.xctest */,
|
534959592F7B83B700BD31AD /* scarfUITests.xctest */,
|
||||||
|
4EAC23292F99930000654F42 /* scarf mobile.app */,
|
||||||
|
4EAC23392F99930100654F42 /* Scarf iOSTests.xctest */,
|
||||||
|
4EAC23432F99930100654F42 /* Scarf iOSUITests.xctest */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -117,6 +190,76 @@
|
|||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
|
4EAC23282F99930000654F42 /* scarf mobile */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 4EAC234C2F99930100654F42 /* Build configuration list for PBXNativeTarget "scarf mobile" */;
|
||||||
|
buildPhases = (
|
||||||
|
4EAC23252F99930000654F42 /* Sources */,
|
||||||
|
4EAC23262F99930000654F42 /* Frameworks */,
|
||||||
|
4EAC23272F99930000654F42 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
fileSystemSynchronizedGroups = (
|
||||||
|
4EAC232A2F99930000654F42 /* Scarf iOS */,
|
||||||
|
);
|
||||||
|
name = "scarf mobile";
|
||||||
|
packageProductDependencies = (
|
||||||
|
53SCARFCORE0002 /* ScarfCore */,
|
||||||
|
53SCARFIOS0001 /* ScarfIOS */,
|
||||||
|
);
|
||||||
|
productName = "Scarf iOS";
|
||||||
|
productReference = 4EAC23292F99930000654F42 /* scarf mobile.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
4EAC23382F99930100654F42 /* Scarf iOSTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 4EAC234F2F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
4EAC23352F99930100654F42 /* Sources */,
|
||||||
|
4EAC23362F99930100654F42 /* Frameworks */,
|
||||||
|
4EAC23372F99930100654F42 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
4EAC233B2F99930100654F42 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
fileSystemSynchronizedGroups = (
|
||||||
|
4EAC233C2F99930100654F42 /* Scarf iOSTests */,
|
||||||
|
);
|
||||||
|
name = "Scarf iOSTests";
|
||||||
|
packageProductDependencies = (
|
||||||
|
);
|
||||||
|
productName = "Scarf iOSTests";
|
||||||
|
productReference = 4EAC23392F99930100654F42 /* Scarf iOSTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
4EAC23422F99930100654F42 /* Scarf iOSUITests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 4EAC23522F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSUITests" */;
|
||||||
|
buildPhases = (
|
||||||
|
4EAC233F2F99930100654F42 /* Sources */,
|
||||||
|
4EAC23402F99930100654F42 /* Frameworks */,
|
||||||
|
4EAC23412F99930100654F42 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
4EAC23452F99930100654F42 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
fileSystemSynchronizedGroups = (
|
||||||
|
4EAC23462F99930100654F42 /* Scarf iOSUITests */,
|
||||||
|
);
|
||||||
|
name = "Scarf iOSUITests";
|
||||||
|
packageProductDependencies = (
|
||||||
|
);
|
||||||
|
productName = "Scarf iOSUITests";
|
||||||
|
productReference = 4EAC23432F99930100654F42 /* Scarf iOSUITests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.ui-testing";
|
||||||
|
};
|
||||||
5349593F2F7B83B600BD31AD /* scarf */ = {
|
5349593F2F7B83B600BD31AD /* scarf */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 534959632F7B83B700BD31AD /* Build configuration list for PBXNativeTarget "scarf" */;
|
buildConfigurationList = 534959632F7B83B700BD31AD /* Build configuration list for PBXNativeTarget "scarf" */;
|
||||||
@@ -195,9 +338,20 @@
|
|||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
BuildIndependentTargetsInParallel = 1;
|
BuildIndependentTargetsInParallel = 1;
|
||||||
LastSwiftUpdateCheck = 2630;
|
LastSwiftUpdateCheck = 2620;
|
||||||
LastUpgradeCheck = 2630;
|
LastUpgradeCheck = 2630;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
|
4EAC23282F99930000654F42 = {
|
||||||
|
CreatedOnToolsVersion = 26.2;
|
||||||
|
};
|
||||||
|
4EAC23382F99930100654F42 = {
|
||||||
|
CreatedOnToolsVersion = 26.2;
|
||||||
|
TestTargetID = 4EAC23282F99930000654F42;
|
||||||
|
};
|
||||||
|
4EAC23422F99930100654F42 = {
|
||||||
|
CreatedOnToolsVersion = 26.2;
|
||||||
|
TestTargetID = 4EAC23282F99930000654F42;
|
||||||
|
};
|
||||||
5349593F2F7B83B600BD31AD = {
|
5349593F2F7B83B600BD31AD = {
|
||||||
CreatedOnToolsVersion = 26.3;
|
CreatedOnToolsVersion = 26.3;
|
||||||
};
|
};
|
||||||
@@ -229,6 +383,7 @@
|
|||||||
packageReferences = (
|
packageReferences = (
|
||||||
53SWIFTTERM0002 /* XCRemoteSwiftPackageReference "SwiftTerm" */,
|
53SWIFTTERM0002 /* XCRemoteSwiftPackageReference "SwiftTerm" */,
|
||||||
53SCARFCORE0020 /* XCLocalSwiftPackageReference "Packages/ScarfCore" */,
|
53SCARFCORE0020 /* XCLocalSwiftPackageReference "Packages/ScarfCore" */,
|
||||||
|
53SCARFIOS0020 /* XCLocalSwiftPackageReference "Packages/ScarfIOS" */,
|
||||||
53SPARKLE00012 /* XCRemoteSwiftPackageReference "Sparkle" */,
|
53SPARKLE00012 /* XCRemoteSwiftPackageReference "Sparkle" */,
|
||||||
);
|
);
|
||||||
preferredProjectObjectVersion = 77;
|
preferredProjectObjectVersion = 77;
|
||||||
@@ -239,11 +394,35 @@
|
|||||||
5349593F2F7B83B600BD31AD /* scarf */,
|
5349593F2F7B83B600BD31AD /* scarf */,
|
||||||
5349594E2F7B83B700BD31AD /* scarfTests */,
|
5349594E2F7B83B700BD31AD /* scarfTests */,
|
||||||
534959582F7B83B700BD31AD /* scarfUITests */,
|
534959582F7B83B700BD31AD /* scarfUITests */,
|
||||||
|
4EAC23282F99930000654F42 /* scarf mobile */,
|
||||||
|
4EAC23382F99930100654F42 /* Scarf iOSTests */,
|
||||||
|
4EAC23422F99930100654F42 /* Scarf iOSUITests */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
4EAC23272F99930000654F42 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
4EAC23372F99930100654F42 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
4EAC23412F99930100654F42 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
5349593E2F7B83B600BD31AD /* Resources */ = {
|
5349593E2F7B83B600BD31AD /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -268,6 +447,27 @@
|
|||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
4EAC23252F99930000654F42 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
4EAC23352F99930100654F42 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
4EAC233F2F99930100654F42 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
5349593C2F7B83B600BD31AD /* Sources */ = {
|
5349593C2F7B83B600BD31AD /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -292,6 +492,16 @@
|
|||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
/* Begin PBXTargetDependency section */
|
||||||
|
4EAC233B2F99930100654F42 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 4EAC23282F99930000654F42 /* scarf mobile */;
|
||||||
|
targetProxy = 4EAC233A2F99930100654F42 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
4EAC23452F99930100654F42 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 4EAC23282F99930000654F42 /* scarf mobile */;
|
||||||
|
targetProxy = 4EAC23442F99930100654F42 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
534959512F7B83B700BD31AD /* PBXTargetDependency */ = {
|
534959512F7B83B700BD31AD /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
target = 5349593F2F7B83B600BD31AD /* scarf */;
|
target = 5349593F2F7B83B600BD31AD /* scarf */;
|
||||||
@@ -305,6 +515,175 @@
|
|||||||
/* End PBXTargetDependency section */
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
|
4EAC234D2F99930100654F42 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = "Scarf iOS/Scarf_iOS.entitlements";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = 3Q6X2L86C4;
|
||||||
|
ENABLE_PREVIEWS = YES;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = "Scarf iOS/Info.plist";
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "Scarf Mobile";
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
|
||||||
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.scarf-mobile.app";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
|
SWIFT_APPROACHABLE_CONCURRENCY = YES;
|
||||||
|
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
4EAC234E2F99930100654F42 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = "Scarf iOS/Scarf_iOS.entitlements";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = 3Q6X2L86C4;
|
||||||
|
ENABLE_PREVIEWS = YES;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = "Scarf iOS/Info.plist";
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "Scarf Mobile";
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
|
||||||
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "com.scarf-mobile.app";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
|
SWIFT_APPROACHABLE_CONCURRENCY = YES;
|
||||||
|
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
4EAC23502F99930100654F42 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = 3Q6X2L86C4;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSTests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = NO;
|
||||||
|
SWIFT_APPROACHABLE_CONCURRENCY = YES;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = NO;
|
||||||
|
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Scarf iOS.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Scarf iOS";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
4EAC23512F99930100654F42 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = 3Q6X2L86C4;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSTests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = NO;
|
||||||
|
SWIFT_APPROACHABLE_CONCURRENCY = YES;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = NO;
|
||||||
|
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Scarf iOS.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Scarf iOS";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
4EAC23532F99930100654F42 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = 3Q6X2L86C4;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSUITests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = NO;
|
||||||
|
SWIFT_APPROACHABLE_CONCURRENCY = YES;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = NO;
|
||||||
|
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_TARGET_NAME = "Scarf iOS";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
4EAC23542F99930100654F42 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = 3Q6X2L86C4;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 26.2;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "alanwizemann.Scarf-iOSUITests";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = NO;
|
||||||
|
SWIFT_APPROACHABLE_CONCURRENCY = YES;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = NO;
|
||||||
|
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_TARGET_NAME = "Scarf iOS";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
534959612F7B83B700BD31AD /* Debug */ = {
|
534959612F7B83B700BD31AD /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
@@ -448,6 +827,7 @@
|
|||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = NO;
|
GENERATE_INFOPLIST_FILE = NO;
|
||||||
INFOPLIST_FILE = scarf/Info.plist;
|
INFOPLIST_FILE = scarf/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = Scarf;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
@@ -483,6 +863,7 @@
|
|||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = NO;
|
GENERATE_INFOPLIST_FILE = NO;
|
||||||
INFOPLIST_FILE = scarf/Info.plist;
|
INFOPLIST_FILE = scarf/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = Scarf;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
@@ -588,6 +969,33 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
|
4EAC234C2F99930100654F42 /* Build configuration list for PBXNativeTarget "scarf mobile" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
4EAC234D2F99930100654F42 /* Debug */,
|
||||||
|
4EAC234E2F99930100654F42 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
4EAC234F2F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
4EAC23502F99930100654F42 /* Debug */,
|
||||||
|
4EAC23512F99930100654F42 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
4EAC23522F99930100654F42 /* Build configuration list for PBXNativeTarget "Scarf iOSUITests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
4EAC23532F99930100654F42 /* Debug */,
|
||||||
|
4EAC23542F99930100654F42 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
5349593B2F7B83B600BD31AD /* Build configuration list for PBXProject "scarf" */ = {
|
5349593B2F7B83B600BD31AD /* Build configuration list for PBXProject "scarf" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
@@ -631,6 +1039,10 @@
|
|||||||
isa = XCLocalSwiftPackageReference;
|
isa = XCLocalSwiftPackageReference;
|
||||||
relativePath = Packages/ScarfCore;
|
relativePath = Packages/ScarfCore;
|
||||||
};
|
};
|
||||||
|
53SCARFIOS0020 /* XCLocalSwiftPackageReference "Packages/ScarfIOS" */ = {
|
||||||
|
isa = XCLocalSwiftPackageReference;
|
||||||
|
relativePath = Packages/ScarfIOS;
|
||||||
|
};
|
||||||
/* End XCLocalSwiftPackageReference section */
|
/* End XCLocalSwiftPackageReference section */
|
||||||
|
|
||||||
/* Begin XCRemoteSwiftPackageReference section */
|
/* Begin XCRemoteSwiftPackageReference section */
|
||||||
@@ -657,6 +1069,14 @@
|
|||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
productName = ScarfCore;
|
productName = ScarfCore;
|
||||||
};
|
};
|
||||||
|
53SCARFCORE0002 /* ScarfCore */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
productName = ScarfCore;
|
||||||
|
};
|
||||||
|
53SCARFIOS0001 /* ScarfIOS */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
productName = ScarfIOS;
|
||||||
|
};
|
||||||
53SPARKLE00011 /* Sparkle */ = {
|
53SPARKLE00011 /* Sparkle */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = 53SPARKLE00012 /* XCRemoteSwiftPackageReference "Sparkle" */;
|
package = 53SPARKLE00012 /* XCRemoteSwiftPackageReference "Sparkle" */;
|
||||||
|
|||||||
Reference in New Issue
Block a user