Skip to content

Releases: cesardev31/xlinux

xlinux 0.5.1

Choose a tag to compare

@cesardev31 cesardev31 released this 05 Oct 14:39

xlinux account: know your free Apple ID quota

A free Apple ID can create at most 10 App IDs in a rolling 7-day window (every app and every app extension needs one), and Apple doesn't tell you how many you have left. xlinux account lists the App IDs on your team, how many were created in the last 7 days and when the next slot frees up.

Apple doesn't expose creation dates, so xlinux keeps its own history (<data dir>/app-ids.json). App IDs that existed before the first run are counted as created that day (worst case) and marked as estimated.

After each install, xlinux prints a one-line summary: App IDs created in the last 7 days: 9/10. Rebuilding an app that already has an App ID doesn't use a slot. Paid accounts have no such limit, so the line isn't shown for them.

Full Changelog: v0.5.0...v0.5.1

xlinux 0.5.0

Choose a tag to compare

@cesardev31 cesardev31 released this 03 Oct 01:39

Native Xcode projects: SwiftUI / UIKit apps from Linux

xlinux now builds plain Xcode projects, not just Flutter and Expo. Run xlinux run in a folder with an .xcodeproj: it builds the Debug configuration, installs and launches the app, and prints the app's own logs (system frameworks' noise is filtered out like Xcode does). Options: --release, --target, --configuration.

  • Xcode 16+ projects as they are: synchronized folders, Info.plist generated from INFOPLIST_KEY_* settings, MainActor default isolation, approachable concurrency and upcoming features.
  • Macros: #Preview, @Observable.
  • Asset symbols like Xcode's: Color.brand, .foregroundStyle(.brand) (with dark variants), Image(.logo).
  • String Catalogs (.xcstrings) compiled to <lang>.lproj.
  • App extensions (widgets): each is built from its own target's sources and resources with its own deployment target. Only the extensions in the app's Embed Foundation Extensions phase are built, so an unused target no longer takes up an App ID on a free account.
  • CocoaPods when there's a Podfile.

App Intents and Siri without a Mac

Xcode's appintentsmetadataprocessor only runs on Apple Silicon Macs. xlinux generates Metadata.appintents itself from the constant values that the Linux swiftc emits (the same as Xcode's). The format was reconstructed from a paired Xcode build, where xlinux's output matches Xcode's, and about 150 published samples.

  • Intents with a title, description and openAppWhenRun.
  • Parameters: String, Bool, Int, Double, Date, URL and AppEnum.
  • Results: dialog, returned value, open another intent.
  • App Shortcuts with \(.applicationName) phrases, translated in AppShortcuts.xcstrings.

Tested on an iPhone: the shortcuts show up and run in the Shortcuts app, and Siri runs them in Spanish. Siri's voice matching is sometimes unreliable, and the cause hasn't been found yet. Unsupported constructs (entities, phrases with parameters) stop the build with a clear error.

Fixes

  • An .appex without CFBundleName was rejected by iOS at install.
  • pod install and .app assembly moved to shared code, used by the Expo and Xcode adapters. Expo builds haven't been re-tested since this change.

Known limitations of Xcode projects

Swift packages (SwiftPM dependencies), storyboards other than the launch screen, Core Data models, Metal shaders, .icon icons, named catalog colors (Color("Name")) and the global accent color aren't supported yet. There's no hot reload: every change is a rebuild and reinstall.

xlinux 0.4.0

Choose a tag to compare

@cesardev31 cesardev31 released this 01 Oct 16:12

Changes

  • Add Flutter flavors to xlinux build, xlinux run, and the flutter run -d iphone-linux integration. Select Debug-<flavor> or Release-<flavor> and pass the flavor to Flutter assemble.
  • Resolve Runner and extension build settings from the selected Xcode configuration, including bundle identifiers, custom Info.plist variables, entitlements, and app groups.
  • Fix Flutter assemble failures with multiple DartDefines by using --DartDefines=.
  • Add xlinux device tunnel: use the configured pymobiledevice3 installation and request sudo automatically to run the kernel tunnel in the foreground.
  • Add regression tests and a flavored Xcode project fixture.

Validation

Five regression tests pass. Debug builds of a sample app pass with and without a QA flavor; the QA artifact's display name and bundle identifier were verified. On-device QA installation remains unverified because the connected iPhone reached its free developer profile app limit.

Example

xlinux run --flavor qa --dart-define-from-file config/qa.json
xlinux device tunnel

Full changelog: v0.3.0...v0.4.0

xlinux 0.3.0

Choose a tag to compare

@cesardev31 cesardev31 released this 29 Sep 02:13

Full Changelog: v0.2.0...v0.3.0

xlinux 0.2.0

Choose a tag to compare

@cesardev31 cesardev31 released this 28 Sep 20:51

Full Changelog: v0.1.0...v0.2.0

xlinux 0.1.0

Choose a tag to compare

@cesardev31 cesardev31 released this 28 Sep 05:40