Files
proton-stream/ios/project.yml
T
nvrl ed05a1e723 feat(ios): port the Android client to SwiftUI
The iOS client is now a screen-for-screen port of the Android app over the
same pstr-android UniFFI surface, with no Rust changes: Library, title page,
History, Shares (public links and Drive folders), Downloads and Settings,
with the same strings, undo snackbars and two-pane layout on wide screens.

- Theme from the engine's palette (Material role names, Inter, the same
  type ramp and corners), repainted live from the appearance settings.
- Account sign-in with two-factor code, mailbox password and the Proton
  CAPTCHA in a non-persistent WKWebView, the Drive folder browser, and
  watch-history sync every five minutes, after sign-in, on player close and
  when the app leaves the screen.
- Player over libmpv: resume, progress saved every 5 s, autoplay with the
  up-next card, skip and auto-skip from the chapter plan, track, speed,
  volume and episode pickers, landscape lock, mini transport, and
  lock-screen controls with interruption and route-change handling.
- Offline downloads with the Android record format, free-space floor,
  retries, transfer rate and the Wi-Fi-only policy; interrupted transfers
  resume at next launch.
- Config, data and download state are excluded from backup, as Android's
  allowBackup=false: a restore would bring shares back without their
  Keychain secrets and give two devices one sync identity.

Picture-in-picture, the share sheet and background downloads are not
possible the same way on iOS; docs/IOS.md lists why and what replaces them.

Adds XCTest ports of the Android unit tests, a `test` command to
scripts/build-ios.sh, the app icon and its render script, and an iOS
workflow on macos-15 that runs the tests and builds the unsigned .ipa.
2026-10-07 00:32:03 +02:00

103 lines
3.8 KiB
YAML

# XcodeGen spec for the iOS client. The .xcodeproj and Info.plist are generated
# from this by scripts/build-ios.sh and are not committed.
name: ProtonStream
options:
bundleIdPrefix: io.narl
deploymentTarget:
iOS: "17.0"
packages:
MPVKit:
url: https://github.com/mpvkit/MPVKit
exactVersion: 1.0.0
targets:
ProtonStream:
type: application
platform: iOS
sources:
- path: ProtonStream
excludes:
# The icon's source; the asset catalog holds what it renders to.
- Resources/AppIcon.svg
- Resources/THIRD_PARTY_NOTICES.md
- path: ProtonStream/Resources/THIRD_PARTY_NOTICES.md
buildPhase: resources
# UniFFI output, written by `scripts/build-ios.sh bindings`.
- path: build/generated/PstrBridge.swift
# Shared with the Android client rather than copied: Inter, and the
# licence texts the About page shows.
- path: ../android/app/src/main/res/font/inter_regular.ttf
buildPhase: resources
- path: ../android/app/src/main/res/font/inter_semibold.ttf
buildPhase: resources
- path: ../android/app/src/main/assets/licenses/GPL-3.0.txt
buildPhase: resources
- path: ../android/app/src/main/assets/licenses/Inter-OFL.txt
buildPhase: resources
dependencies:
# The GPL build is the one with libass and every demuxer; the app is
# sideloaded, never distributed through the App Store.
- package: MPVKit
product: MPVKit-GPL
- sdk: Security.framework
- sdk: SystemConfiguration.framework
scheme:
testTargets:
- ProtonStreamTests
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: io.narl.protonstream
MARKETING_VERSION: ${PSTR_VERSION}
CURRENT_PROJECT_VERSION: ${PSTR_BUILD}
SWIFT_VERSION: "5.0"
TARGETED_DEVICE_FAMILY: "1,2"
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
SWIFT_OBJC_BRIDGING_HEADER: ProtonStream/Bridge/ProtonStream-Bridging-Header.h
HEADER_SEARCH_PATHS: $(PROJECT_DIR)/build/generated
"LIBRARY_SEARCH_PATHS[sdk=iphoneos*]": $(PROJECT_DIR)/../target/aarch64-apple-ios/release
"LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]": $(PROJECT_DIR)/../target/aarch64-apple-ios-sim/release
OTHER_LDFLAGS: -lpstr_android
info:
path: ProtonStream/Info.plist
properties:
CFBundleDisplayName: Proton Stream
LSRequiresIPhoneOS: true
ITSAppUsesNonExemptEncryption: false
UIBackgroundModes: [audio]
# The Proton palette's page colour, so a dark app does not open on white.
UILaunchScreen:
UIColorName: LaunchBackground
UIRequiresFullScreen: false
UIAppFonts:
- inter_regular.ttf
- inter_semibold.ttf
# A share link handed over from elsewhere: protonstream://add?url=…,
# or the link with its scheme swapped (IncomingShareLink.swift).
CFBundleURLTypes:
- CFBundleURLName: io.narl.protonstream.share-link
CFBundleURLSchemes: [protonstream]
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations~ipad:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
# The pure logic the Android unit tests pin, pinned again here: hosted in the
# app, so `@testable import` reaches it, on the simulator.
ProtonStreamTests:
type: bundle.unit-test
platform: iOS
sources:
- path: ProtonStreamTests
dependencies:
- target: ProtonStream
settings:
base:
SWIFT_VERSION: "5.0"
GENERATE_INFOPLIST_FILE: YES