Files
edgeever/apps/ios
tianma-if cf76d9dbb8 release(ios): prepare native SwiftUI App Store archive path
Bump marketing/build versions for the Swift client, reuse the existing
App Store share-extension App ID, and add ExportOptions/fastlane/archive
scripts so the native binary can be signed and submitted without EAS iOS.
2026-08-07 13:16:17 +08:00
..

EdgeEver iOS (Swift)

Native SwiftUI client for EdgeEver. This replaces the React Native / Expo iOS target.

Design document: docs/ios-swift-rewrite.md

Status

UI/interaction is aligned with the Android RN app (apps/mobile):

  • Login / session (Keychain with UserDefaults fallback) / device id
  • GRDB local mirror + bootstrap / incremental sync
  • SQLite outbox (create/update, create-absorbs-update, conflict/retry)
  • Workspace chrome: notebook title picker, search (250ms debounce), filter chips, list options (sort/density/batch), FAB create, long-press multi-select, swipe pin/delete
  • Memo detail + create/edit autosave, share link, revisions, soft delete
  • EditorBundle (WKWebView body + toolbar)
  • Image pick + materialize-for-upload (K24) + protected resource blob loading
  • Settings: general / account / tags / API tokens / devices / users (owner) / about
  • Share Extension (text/URL → App Group → new draft)
  • Locale (system/zh/en) + theme + list density

Android remains Expo / React Native in apps/mobile. Do not retire EAS iOS builds until a shippable TestFlight build exists.

Motion / animations

  • Native SwiftUI springs for layout, search bar, filter chips, list content changes
  • Pow (Emerge Tools) for polished micro-interactions:
    • create button ping / jump on sync
    • filter chip ping when activated
    • selection / error haptics + shake
    • pin shine, list card transitions

Shared curves live in EdgeEver/DesignSystem/Motion.swift (card press timing matches Android Reanimated: 0.985 @ 100ms / release 160ms).

Requirements

  • Xcode 16+ (Xcode 27 beta OK for local dev)
  • iOS 17+ deployment target
  • XcodeGen to regenerate the project
brew install xcodegen

Generate & open

cd apps/ios
xcodegen generate
open EdgeEver.xcodeproj

Tests

# Unit + live API tests (live tests skip if local server is down)
xcodebuild test \
  -project EdgeEver.xcodeproj \
  -scheme EdgeEver \
  -destination 'platform=iOS Simulator,name=iPhone 17 Pro'

Live API tests login to http://127.0.0.1:8787 using EDGE_EVER_AUTH_PASSWORD or monorepo .env.wrangler.generated.local.

Simulator auto-login (QA)

With local bun run dev running:

xcrun simctl launch booted org.edgeever.mobile \
  -EdgeEverAutoLoginURL "http://127.0.0.1:8787" \
  -EdgeEverAutoLoginUser admin \
  -EdgeEverAutoLoginPassword "$EDGE_EVER_AUTH_PASSWORD"

Versioning

Field File Notes
MARKETING_VERSION Config/Version.xcconfig Align with monorepo release X.Y.Z on store submissions
CURRENT_PROJECT_VERSION Config/Version.xcconfig Monotonic build number for every TestFlight / App Store upload

Regenerating the Xcode project

Edit project.yml, then:

xcodegen generate