-
Notifications
You must be signed in to change notification settings - Fork 0
iOS/iPadOS #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ralph
wants to merge
16
commits into
main
Choose a base branch
from
ios-ipados
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
iOS/iPadOS #2
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Owner
ralph
commented
Jan 3, 2026
- Add iOS/iPadOS support to Spotifly
- Automate Rust library builds in Xcode
- Remove unnecessary await in SpotifyAuth
Set up cross-platform build pipeline and UI compatibility: - Configure Rust build script to compile for iOS/iPadOS targets - Support for aarch64-apple-ios (device) - Support for aarch64-apple-ios-sim (simulator) - Auto-detect platform from Xcode environment variables - Update Xcode project configuration - Add platform-specific linker flags for iOS and macOS - Use AVFAudio framework on iOS (vs AudioUnit on macOS) - Configure deployment targets for iOS 26.2, iPadOS 26.2, macOS 26.2 - Add conditional compilation for platform-specific APIs - Replace NSApplication/NSApp with UIApplication on iOS - Replace NSPasteboard with UIPasteboard on iOS - Replace NSImage with UIImage on iOS - Replace NSColor with UIColor on iOS - Make window resizing macOS-only - Updated files: - SpotiflyApp.swift: Conditional app activation policy - SpotifyAuth.swift: Platform-specific presentation anchors - PlaybackViewModel.swift: Cross-platform image handling - LoggedInView.swift: Optional window resizing on macOS - StartpageView.swift: Platform-specific pasteboard/colors - TrackInfoView.swift: Platform-specific pasteboard - Multiple view files: Conditional NSColor usage Tested on: - macOS 26.2 (arm64) - iOS Simulator 26.2 (iPhone 17 Pro) - iPadOS Simulator 26.2 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add build phase to automatically build Rust library for target platform: - Added "Build Rust Library" script phase to Xcode project - Runs before compilation - Automatically detects platform from Xcode environment - Builds correct Rust target (iOS, iOS Simulator, or macOS) - Disabled user script sandboxing to allow Cargo builds - Required for Rust/Cargo to access target directory - Build scripts can now read/write freely - No manual steps needed when switching platforms - Switch from iOS Simulator → macOS: automatic rebuild - Switch from macOS → iPhone device: automatic rebuild - Rust library rebuilds only when needed (incremental) Testing results: - iOS Simulator build: 32.7s (clean), 0.14s (incremental) - macOS build: 32.7s (clean), instant (incremental) - Platform switching works seamlessly without clean/rebuild 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed compiler warning: "No 'async' operations occur within 'await' expression" UIApplication.shared.connectedScenes is not an async property, so await is not needed when accessing it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Brings in recent improvements: - Volume control fixes (respects slider from playback start) - Recently played artists display fix (cover art and follower counts) - Refactored playback setup code into handlePlaybackStarted() - Declarative mini player window management (moved to SpotiflyApp) - Updated PROGRESS.md Resolved conflicts: - LoggedInView: Removed old imperative window management code Window resizing now handled declaratively in SpotiflyApp.swift
- Wrap macOS-specific window management code in conditional compilation blocks - Make WindowState work on iOS/iPadOS by simple state toggling - Remove macOS-specific window resizability modifier on iOS/iPadOS - Update comments to reflect cross-platform nature - Both macOS and iOS builds now succeed 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Create AudioSessionManager to handle audio session configuration - Set up audio session with .playback category for background audio - Handle audio interruptions (phone calls, alarms, etc.) - Handle route changes (headphones unplugged) - Integrate with PlaybackViewModel for proper interruption handling - Pause playback when interrupted or headphones unplugged - Both iOS and macOS builds succeed 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Create FullScreenPlayerView with enhanced playback controls - Display large album art, track info, and player controls - Add tap gesture to NowPlayingBarView on iOS to open full-screen player - Present FullScreenPlayerView as full-screen cover on iOS/iPadOS - Hide mini player toggle on iOS (replaced by tap gesture) - Maintain existing mini player mode functionality on macOS - Both iOS and macOS builds succeed 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove fixed frame constraints (500x400) on iOS that were limiting view size - Use maxWidth/maxHeight .infinity on iOS for full screen coverage - Keep macOS minimum frame sizes for proper window behavior - Add ignoresSafeArea for bottom edge on iOS to extend to screen edges - Both iOS and macOS builds succeed 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Create separate iOS entitlements file without macOS sandbox settings - Configure Xcode project to use platform-specific entitlements: - iOS/iPadOS: Spotifly-iOS.entitlements (no sandbox) - macOS: Spotifly.entitlements (with sandbox) - macOS app sandbox settings were blocking network connections on iOS - iOS apps don't use app sandbox entitlements This should fix the "Permission denied" error when trying to play music on iOS. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Pass device name and type from Swift to Rust FFI - iOS: Uses UIDevice.current.name and Smartphone device type - macOS: Uses Host.localizedName and Computer device type - Update spotifly_init_player() to accept device_name and device_type parameters - Rust creates platform-specific device_id (spotifly_ios_* or spotifly_macos_*) - This helps Spotify servers identify the device type correctly This should fix the "Permission denied" error on iOS by properly identifying the device as a smartphone rather than unknown type. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Resolved conflicts in: - SpotiflyApp.swift: Keep iOS guards, add new menu commands - SpotifyPlayer.swift: Keep platform-specific device info, add settings sync - LoggedInView.swift: Keep iOS fullscreen player, add new environments - NowPlayingBarView.swift: Keep iOS background colors, add mini player mode - PlaylistDetailView.swift: Take refactored subviews, add iOS backgrounds - StartpageView.swift: Keep iOS clipboard support, use session.accessToken - TrackInfoView.swift: Removed (deleted in main, unused) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SpotiflyApp.swift: Restructure Scene body for proper #if os(macOS) handling - AppStore.swift: Add platform-specific UIImage/NSImage for album art - PlaybackViewModel.swift: Remove obsolete playbackStartTime references - AlbumDetailView.swift: Fix duplicate AppKit import, add iOS clipboard - FullScreenPlayerView.swift: Remove playbackStartTime, fix Slider types - PreferencesView.swift: Wrap entire file in #if os(macOS) - TrackRow.swift: Add platform imports and iOS clipboard support All three platforms (iOS, iPadOS, macOS) now build successfully. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update Cargo.toml to use local librespot at ../../librespot - Update lib.rs to match librespot dev branch API changes: - to_base16() and to_id() now return String directly - Simplify SpotifyPlayer.swift init (spoofing happens in librespot) The local librespot has patches to spoof iOS as Linux x86_64: - handshake.rs: PLATFORM_LINUX_X86_64 instead of PLATFORM_IPHONE_ARM64 - mod.rs: OS_LINUX and CPU_X86_64 instead of OS_IPHONE and CPU_ARM 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.