Skip to content

Release 2.0.0 - #15

Merged
CoderGamester merged 22 commits into
masterfrom
develop
Oct 21, 2026
Merged

CoderGamester merged 22 commits into
masterfrom
develop

Conversation

@CoderGamester

@CoderGamester CoderGamester commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

New:

  • Game Platform: Added opt-in GamePlatformServices (IGamePlatformServices) for Game Center and Google Play Games Services v2: sign-in, leaderboards, achievements and their native UIs, with PlatformId to keep per-platform ids in one value. Enable it with the Game Center toggle and the Play Games Project Id in the Mobile Services Config; the build then adds the entitlement, or the SDK and manifest entries.
  • Cloud Save: Added IGamePlatformServices.CloudSave (ICloudSaveService) for slot-based saves on Game Center saved games and Google Play Games saved games, with MostRecent or Manual conflict resolution and typed CloudSaveException failures. The Cloud Save config toggle adds the iCloud Documents capability on iOS.
  • Permissions: Added PermissionStatus.Limited for partial access (selected photos, provisional notifications, approximate location, foreground-only location) and DeviceService.OpenAppSettings() to send the player to the OS Settings page after a denial.
  • Media: Added NativeMediaService.SaveToGalleryAsync to save an image or video to the device gallery and PickImageAsync to pick an image with the system picker, both without asking for the Photos permission. Android uses the new Include Media Picker and Write External Storage Legacy config toggles; iOS gallery saving needs a PhotoLibraryAddOnly usage description.
  • Native UI: Added NativeUiService.OpenInAppBrowser for web pages in SFSafariViewController or Chrome Custom Tabs (the build adds androidx.browser unless Include Custom Tabs Dependency is turned off), and ShareScreenshotAsync to share the current frame.
  • Notifications: Added IGameNotification.Data and NotificationBuilder.Data for a payload such as a deep-link URI, INotificationService.OnNotificationOpened for taps while the app runs, and TryGetLaunchNotification for the notification that started the app.
  • App Shortcuts: Added DeviceService.SetShortcuts and ClearShortcuts for home-screen quick actions whose taps arrive through IDeepLinkService, including as the cold-start link.
  • Background Tasks: Added IDeviceService.BackgroundTasks (IBackgroundTaskService) to finish short work when the app moves to the background on iOS; it is a pass-through on Android.
  • Store Links: Added DeviceService.OpenStorePage to open the App Store or Google Play page, optionally the iOS write-review sheet.
  • Deep Links: Android intent-filter registrations can set AutoVerify so https links open as verified App Links.
  • Mobile Services Config: The Inspector is grouped by feature and each section lists the native build entries it adds. New Android manifest toggles cover coarse and background location, legacy storage access, the share FileProvider and the media picker.
  • Haptics: Added an Enable Haptics Debug Logs config toggle; Editor haptics logs are disabled by default.

Changed:

  • Breaking: IGameNotification, INotificationService, INativeUiService and IDeviceService gained members, and the DeviceService injection constructor takes an IBackgroundTaskService. Custom implementations and mocks must add them.
  • iOS builds compile only the permission code whose usage description is declared, so a game that never requests location, camera, microphone or photos no longer references those APIs. Manage Native Build Manually compiles every permission group.
  • The package depends on the built-in com.unity.modules.screencapture and com.unity.modules.imageconversion modules.

Fixed:

  • Android permissions now request precise and approximate location together, request background location separately, report Denied after a refusal, use the correct permissions below API 33, and no longer prompt for storage just to save to the gallery.
  • Android image sharing works on Android 7+ through a package FileProvider (enable Include Share FileProvider); previously it used a file:// URI the OS rejects.
  • iOS notification status checks no longer block the main thread, and location permission delegates are released after delivery.
  • Declared the iOS framework dependencies of the native bridges so a generated Xcode project links.
  • Retained the Android activity and review manager Java references until the async requestReviewFlow callback completes, preventing a NullReferenceException in launchReviewFlow.

Removed:

  • Removed ISafeAreaService, SafeAreaService, and the SafeAreaContainer UI Toolkit element; IDeviceService no longer exposes a SafeArea child and EditorPlatformSimulator no longer exposes safe-area overrides. For safe-area UI padding, use com.gamelovers.uiservice (SafeAreaPanelView/SafeAreaContainer).

Docs:

  • The root README is now the documentation index and lists common issues. docs/build-pipeline.md is now docs/build-configuration.md, docs/explorer.md is now docs/device-simulator.md, and docs/README.md is removed.

Migration:

  • Replace IDeviceService.SafeArea and SafeAreaContainer with com.gamelovers.uiservice SafeAreaPanelView/SafeAreaContainer.
  • Add Data, OnNotificationOpened, TryGetLaunchNotification, BackgroundTasks and the new INativeUiService methods to custom implementations and mocks, and pass an IBackgroundTaskService to the DeviceService constructor.
  • Treat PermissionStatus.Limited as usable access in code that switches on PermissionStatus.
  • On iOS, declare a usage description in the Mobile Services Config for every permission the game requests; undeclared groups are no longer compiled in.
  • AccessFineLocation now also declares ACCESS_COARSE_LOCATION, which Android 12+ requires; add AccessBackgroundLocation for AppPermission.LocationAlways.

CoderGamester and others added 18 commits August 27, 2026 10:26
… returns

The activity and ReviewManager were scoped with using var, so both AndroidJavaObjects were disposed before Play Services invoked ReviewFlowListener.onComplete, and launchReviewFlow always threw a NullReferenceException. Ownership now passes to the listener, which disposes both in a finally block, and RequestReviewAndroid disposes them itself when registration throws.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Delete ISafeAreaService, SafeAreaService, and SafeAreaContainer with their tests; narrow DeviceService to five children; remove the simulator override and sample/docs references. BREAKING: IDeviceService.SafeArea is gone; use com.gamelovers.uiservice SafeAreaPanelView/SafeAreaContainer for UI safe-area needs.
Vendor NSubstitute 4.2.2, Castle.Core 4.4.0, and System.Threading.Tasks.Extensions 4.3.0 with their license texts under Tests/EditMode/Plugins/ so the EditMode suite compiles and loads in Unity. Stay on 4.x: the 5.x set fails plugin validation because Castle.Core 5.1.1 references System.Diagnostics.EventLog, which Unity cannot resolve (verified 2026-09-11). Full EditMode suite: 133/133 green.
The shared block now says the harness already prints the fixture count, that the post-fix observation is one re-run of the same probe, and that correcting an existing ADMIT or RCR line is itself a claim about production which must be read and re-checked. Edited identically in all six packages; Tools/lint-agent-guides.py fails if they diverge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…lCase

AGENTS.md gives private fields _camelCase, says explicitly that static fields are included, and gives private constants plain PascalCase, but nothing enforced it: this repository has no .editorconfig and the style audit gated documentation and ordering only. A hand-rolled checker in an earlier session mis-classified three of its four hits, which is what a rule with no mechanical owner costs. Renames are identifier-only; no comment prose and no string literal changed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Permissions.m uses CoreLocation and Photos and NativeUi.m uses StoreKit, but their plugin
import settings declared no frameworks, so a Unity-generated Xcode project failed to link
UnityFramework with undefined CLLocationManager, PHPhotoLibrary and
SKStoreReviewController. The import settings were written by Unity 6000.6.4f1 through
PluginImporter.SetPlatformData.
…ile declared iOS groups

Add PermissionStatus.Limited and DeviceService.OpenAppSettings. Android requests precise and approximate location together, asks for background location separately, reports Denied after a refusal, and uses API-level specific photo, notification and gallery permissions. iOS maps limited photos, provisional notifications and reduced-accuracy location to Limited, serves notification status from a cache, and releases location delegates after delivery. The build postprocessor compiles only the iOS permission groups whose usage description is declared. The config Inspector is grouped by feature with per-section build summaries.

Co-authored-by: Cursor <cursoragent@cursor.com>
…store links, screenshot share

Notifications carry an application-defined Data payload and report opened notifications and the cold-start launch notification. Android image sharing uses a package FileProvider that the build postprocessor declares behind a config toggle, and ShareScreenshotAsync shares the current frame. DeviceService gains OpenStorePage and IBackgroundTaskService (iOS background task bridge, pass-through elsewhere). Android intent-filter registrations can set AutoVerify for verified App Links. The Gradle dependency injection is generalized from the Play Review special case.
BREAKING: IGameNotification, INotificationService, INativeUiService and IDeviceService gained members; the DeviceService injection constructor takes an IBackgroundTaskService.

Co-authored-by: Cursor <cursoragent@cursor.com>
NativeMediaService saves images and videos to the device gallery and picks one image through the system picker. iOS uses PHPhotoLibrary (compiled only when the add-only usage description is declared) and PHPickerViewController; Android uses MediaStore and a transparent picker activity declared behind a config toggle. The iOS photos permission group is split into read/write and add-only, and the simulator saves into Library and picks from a file dialog.

Co-authored-by: Cursor <cursoragent@cursor.com>
…vices

GamePlatformServices signs the player in and reports scores and achievements, with leaderboard and achievement UIs. iOS uses a GameKit bridge compiled only when the Game Center capability is enabled; Android talks to Play Games Services v2 through JNI so the package builds without the SDK, which the postprocessor adds when a project id is configured. PlatformId carries per-platform ids and the Device Simulator panel simulates the service in the Editor.

Co-authored-by: Cursor <cursoragent@cursor.com>
…saved games

ICloudSaveService, reached through IGamePlatformServices.CloudSave, lists, loads, saves and deletes slots with MostRecent or Manual conflict resolution and typed failures. iOS uses GKSavedGame through a bridge that keeps its own background task while saving; Android uses Play Games snapshots over JNI. A Cloud Save config toggle adds the iCloud Documents capability, and the Device Simulator panel stores simulated saves, injects conflicts and toggles availability.

Co-authored-by: Cursor <cursoragent@cursor.com>
DeviceService.SetShortcuts publishes quick actions whose taps arrive through IDeepLinkService: Android uses ShortcutManager with an explicit ACTION_VIEW intent, iOS hooks the app delegate shortcut callback and chains to existing implementations. NativeUiService.OpenInAppBrowser shows http and https pages in SFSafariViewController or Chrome Custom Tabs, with the androidx.browser dependency injected behind an opt-out config toggle.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@CoderGamester CoderGamester self-assigned this Oct 21, 2026
CoderGamester and others added 4 commits October 22, 2026 01:07
Fold single-use static helpers (store links, shortcut rules, build summary)
into their owners, turn the simulator section factories into Foldout types,
document the public and internal API to the XML documentation tiers, replace
else branches with guard clauses, order test helpers after the tests, and
rebuild the moved tests with observed RED/GREEN mutation records.

Co-authored-by: Cursor <cursoragent@cursor.com>
Rename build-pipeline.md to build-configuration.md and explorer.md to
device-simulator.md with their meta files, delete docs/README.md, and add a
documentation table and common issues to the root README.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@CoderGamester
CoderGamester merged commit eec7a02 into master Oct 21, 2026
1 of 2 checks passed
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.

1 participant