Skip to content

Apple Native Apps#272

Open
Kief5555 wants to merge 80 commits intomainfrom
kief5555/ios
Open

Apple Native Apps#272
Kief5555 wants to merge 80 commits intomainfrom
kief5555/ios

Conversation

@Kief5555
Copy link
Copy Markdown
Collaborator

@Kief5555 Kief5555 commented Apr 12, 2026

This pull request introduces a new native iOS SwiftUI prototype app for OpenNOW, including a Live Activity widget for queue status, and updates the project documentation to reference the new iOS app. The changes add all necessary Xcode project files, asset catalogs, and widget implementation for the iOS prototype.

iOS App and Widget Addition:

  • Added a new iOS SwiftUI prototype app under ios/OpenNOWiOS/, including all required Xcode project files, workspace, and schemes for both the main app and the Live Activity widget. [1] [2] [3]
  • Implemented a Live Activity widget (OpenNOWWidget) using WidgetKit and ActivityKit, with custom queue status display for lock screen and Dynamic Island, including supporting views and logic in QueueLiveActivityWidget.swift. [1] [2] [3]

Assets and Resources:

  • Added asset catalogs for app icons and store images (Steam and Epic), as well as accent colors, to support the iOS app’s UI. [1] [2] [3] [4] [5]

Documentation Updates:

  • Updated README.md to mention the new iOS SwiftUI prototype and include it in the project directory structure. [1] [2]

Kief5555 and others added 30 commits April 7, 2026 23:45
…d QueueServerSelectModal component

- Updated package version to 0.3.2.
- Implemented IPC handler for fetching queue data from PrintedWaste API.
- Added fetchPrintedWasteQueue method to OpenNowApi interface.
- Created QueueServerSelectModal component for user interaction with queue data.
- Enhanced App component to handle queue selection for free-tier users.
…d cleaning up unused code

- Removed the regions prop from QueueServerSelectModal as it was no longer needed.
- Cleaned up unused imports and constants related to region handling.
- Updated related logic to ensure proper functionality without the regions data.
…Card functionality

- Removed unnecessary autoZone comparison logic for cleaner code.
- Updated the layout of the recommended server cards to always display two side by side.
- Improved RecommendCard component to handle null zone values and added disabled state for better user experience.
- Adjusted styles for better visual feedback during loading and interaction.
- Changed the .gitignore entry for package-lock.json to ensure opennow-stable/package-lock.json is tracked.
- Removed outdated dependencies and added new ones for improved functionality.
- Updated node engine requirements for compatibility.
- Cleaned up unnecessary entries to streamline the package-lock file.
- Added new dev dependencies for jsonfile and universalify to enhance functionality.
- Updated existing entries to ensure compatibility with the latest versions.
…theming

- Changed hardcoded color values to CSS variables for better theming consistency.
- Updated ping and queue color functions to use new color values.
- Adjusted text and background colors to align with the new design system.
…etter user experience

- Updated hover effects for the Cancel and Launch buttons to improve visual feedback.
- Changed background, border, and text color styles to utilize CSS variables for consistency.
- Enhanced the Launch button with a gradient background and box shadow on hover.
…badges (#254)

* Run codec diagnostics at startup and show GPU/CPU decode badges

* Fix codec startup retry handling
Add free tier session timer warnings and management logic
* Decrease ad volume by 50%
…data normalization

- Introduced timeout handling for API requests and responses.
- Added validation for API response structure to ensure expected data types.
- Normalized queue data format for better consistency and error handling.
- Updated QueueServerSelectModal to utilize initial queue data and refresh it while open.
- Implemented session storage for ping results to optimize performance.
Integrate PrintedWaste queue API and add QueueServerSelectModal
- Added IPC handler for fetching PrintedWaste server mapping data with error handling and validation.
- Updated OpenNowApi interface to include fetchPrintedWasteServerMapping method.
- Enhanced QueueServerSelectModal to utilize server mapping data, filtering out nuked zones during queue checks.
- Introduced utility functions to determine eligible PrintedWaste zones based on server mapping.
- Updated the logic to determine if a user is a free-tier member by normalizing the membership tier from either subscriptionInfo or authSession.
- Adjusted dependencies in the useCallback hook to include authSession for accurate tier evaluation.
Fix Ping testing and remove inactive servers
* Route mouse movement via partially reliable channel to reduce input latency

* Fix HID mask semantics for PR input routing

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…ild outputs

- Added entries for Xcode build outputs and user data to .gitignore.
- Updated README.md to mention the availability of an iOS SwiftUI prototype app and its directory structure.
Complete iOS app UI with Liquid Glass design and fix login concurrency
- Introduced a new `OAuthLoopbackServer` class to manage OAuth callback listening via a local network connection.
- Updated `GFNConstants` to include OAuth redirect URI and port.
- Enhanced `OAuthWebAuthenticator` with a cancel method and integrated the new loopback server for improved authentication flow.
- Refactored login process to utilize the new redirect URI for better compatibility with OAuth standards.
…and Library screens

- Added skeleton loading views for games in BrowseView, HomeView, and LibraryView to improve user experience during data loading.
- Updated HomeView to display skeletons when featured games are loading.
- Introduced GameCardSkeletonView and FeaturedGameCardSkeleton for consistent loading indicators.
- Refactored game loading logic to check for loading state across views.
Kief5555 and others added 23 commits April 12, 2026 17:14
…g-codecs-reconnect-gamep

Revert "Fix iOS streaming codecs, input, reconnect, add gamepad, Liquid Glass"
- Replaced `pendingLaunchGame` with `pendingLaunchRequest` and `selectedGameForDetails` in `BrowseView`, `HomeView`, `LibraryView`, and `PrintedWasteQueueView` to streamline game launch requests.
- Introduced `GameLaunchRequest` and `GameLaunchOption` structures to encapsulate game launch data.
- Updated UI components to utilize the new structures, enhancing the game detail presentation and launch process.
- Improved the handling of game launch sheets and routing preferences in the UI.
- Added gamepad support and reconnect logic in `StreamerView` for enhanced user experience during streaming sessions.
- Updated Info.plist to reflect the app's display name and ensure proper app icon handling.
- Updated conditions for reopening and checking streamer readiness to only allow status 3, simplifying the logic.
- Removed redundant status checks to enhance code clarity and maintainability.
- Replaced custom app icon handling with a standardized `BrandLogoView` across `ContentView`, `LoginView`, and `StreamLoadingView` for consistency.
- Improved session handling by adding new properties in `ActiveSession` for ad state and seat setup step.
- Updated `StreamLoadingView` to display ad messages and manage session states more effectively.
- Refactored `PrintedWasteQueueView` to utilize `LazyVStack` for better performance and introduced new modifiers for UI elements.
- Adjusted animations and transitions for overlays in `MainTabView` to enhance user experience.
- Updated Info.plist to set a static app name and improved project settings for better organization.
- Introduced automatic retry logic for streamer reconnections with a maximum retry count.
- Improved UI alignment and padding for queue status display based on device type (iPad vs. iPhone).
- Updated session readiness checks to align with desktop behavior, allowing connections on statuses 2 and 3.
- Added detailed logging for streamer events to aid in debugging and monitoring connection status.
- Enhanced error handling in the StreamerView to provide user feedback during connection issues.
Fix iOS streaming initial handoff failure and queue UI lag
Fix iOS GPU idle-exit killing WKWebView streamer before video
…ension

Fix iOS WebRTC suspension with CSS animation and MediaStream
Fix iOS WebGL keep-alive and WebContent crash
…laim

Fix iOS streaming initial handoff cold server migration
…-fix

Fix iOS WebContent suspension with AVAudioSession activation
…syncafter

Fix iOS streaming stale onRetry reopening old session during queue
- Introduced a new state variable `presentedStreamerSession` in MainTabView to manage the display of the StreamerView.
- Replaced direct manipulation of `streamSession` in OpenNOWStore with a new method `setStreamSession`, which logs the reason for changes.
- Updated the StreamerView to include a retry button for error handling, improving user experience during streaming failures.
- Enhanced session handling logic to ensure proper cleanup and state management during session transitions.
…agement

- Added haptic feedback to various buttons across the app, including search clearing, session resuming, and ending sessions to enhance user experience.
- Introduced a new "Jump back in" section in HomeView to allow users to quickly resume active or resumable sessions.
- Updated the StreamerView to limit the maximum FPS to 60 for better performance.
- Refactored button actions in StreamLoadingView and SessionView to include haptic feedback and improve responsiveness.
- Enhanced the layout and interaction of the QueueStatusPill and FeaturedGameCard for a more intuitive user interface.
Copy link
Copy Markdown
Contributor

@capy-ai capy-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added 2 comments

Comment thread .gitignore

package-lock.json
!opennow-stable/package-lock.json
opennow-stable/package-lock.json
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🟠 High] [🔵 Bug]

The ! negation prefix was removed from !opennow-stable/package-lock.json, turning it into a redundant positive-match pattern. The general package-lock.json rule on line 45 already ignores all files with that name. Previously, !opennow-stable/package-lock.json explicitly un-ignored the Electron app's lock file so it stayed committed. Without it, opennow-stable/package-lock.json is now git-ignored, which will cause non-reproducible dependency installations for the main application.

# .gitignore
package-lock.json
opennow-stable/package-lock.json   # was: !opennow-stable/package-lock.json

This contradicts the PR itself, which modifies opennow-stable/package-lock.json (+150/-44).

Suggested change
opennow-stable/package-lock.json
!opennow-stable/package-lock.json


private func persistAuthSession(_ session: AuthSession) {
if let encoded = try? JSONEncoder().encode(session) {
defaults.set(encoded, forKey: authSessionKey)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[🟡 Medium] [🟡 Investigate]

The persistAuthSession method stores the full AuthSession (containing accessToken, refreshToken, and idToken) in UserDefaults as JSON. UserDefaults are stored in a plain plist file and are accessible from unencrypted device backups. Apple's security guidance recommends using the Keychain for sensitive credentials.

// OpenNOWStore.swift
private func persistAuthSession(_ session: AuthSession) {
    if let encoded = try? JSONEncoder().encode(session) {
        defaults.set(encoded, forKey: authSessionKey)
    }
}

For a prototype this is understandable, but if this ships to users, tokens should be stored in the iOS Keychain (SecItemAdd/SecItemCopyMatching) to protect against backup extraction and unauthorized access.

- Created new image set for Xbox store in Assets.xcassets.
- Added store-xbox.png image file for universal use.
- Created Info.plist for the OpenNOWWidget extension.
- Implemented OpenNOWWidgetBundle to define the widget structure.
- Developed QueueLiveActivityWidget to manage live activity updates and UI.
- Added QueueActivityAttributes to define the data structure for live activities.
- Implemented QueueLiveActivityManager for syncing and managing live activities.
- Created necessary Xcode schemes for building and running the widget and main app.
@Kief5555 Kief5555 changed the title iOS Native App Apple Native Apps Apr 22, 2026
@Kief5555 Kief5555 marked this pull request as ready for review April 22, 2026 05:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants