Skip to content

v2.0.0: dyld crash on launch on iOS < 16 despite #available(iOS 16.0,*) guard in source #6

Description

@Reb00t84

Description

Extension version: 2.0.0 (Mobile.Review.Ext.v2.0.0.yymps)
Device: iPhone 6s, iOS 15.8 (physical device, Debug build)
GameMaker: 2026 runtime, min iOS deployment target set to 15

Issue

The app crashes on launch (dyld symbol resolution failure) on any device running iOS < 16, purely from having the extension linked — the crash happens before any GML code runs, regardless of whether mobile_review_show() is ever called.

Crash log

dyld[20186]: Symbol not found: (_$s8StoreKit03AppA0O13requestReview2inySo13UIWindowSceneC_tFZ)
Referenced from: '.../Rooms.app/Rooms.debug.dylib'
Expected in: '/System/Library/Frameworks/StoreKit.framework/StoreKit'

Root cause found

source/src/ios/GMMobileReviewSwift.swift correctly guards the call:

guard #available(iOS 16.0, *) else { ... }
...
AppStore.requestReview(in: windowScene)

But the compiled static library ships the symbol as a hard (non-weak) undefined external reference:

nm -m Fw/GMMobileReview.xcframework/ios-arm64/libGMMobileReview.a | grep requestReview
(undefined) external _$s8StoreKit03AppA0O13requestReview2inySo13UIWindowSceneC_tFZ

Since it's not weak-imported, dyld hard-binds it at process launch and aborts if the running OS (< iOS 16) doesn't have that symbol — the #available runtime guard never gets a chance to run, because the crash happens at load time, not at call time.

Also note: GMMobileReview.yy declares StoreKit.framework with weakReference:false in iosSystemFrameworkEntries, but this setting appears to have no effect — the generated Rooms.xcodeproj doesn't even contain a separate StoreKit.framework link entry (only GMMobileReview.xcframework is linked), so there's no way to override this from the consuming project.

Expected

App should launch fine on iOS < 16 and mobile_review_show() should just report failure via callback on unsupported OS, per the documented #available guard.

Suggested fix

Recompile the library so the AppStore.requestReview symbol reference is emitted as weak (weak_import), matching the existing #available(iOS 16.0,*) guard, so dyld doesn't hard-require it on older OS.

Expected Change

App launches normally on iOS < 16 (no dyld crash). Calling mobile_review_show() on unsupported OS reports failure via the callback (success=false), matching the existing #available(iOS 16.0,*) guard in source — instead of crashing the whole app at launch before any code runs.

Sample Package

https://api.gamemaker.io/api/github/downloads/62d5adc1-ffb1-453b-8ea6-c2ebaf73b065

Steps To Reproduce

  1. Create/open a GameMaker project with iOS export target, min iOS deployment version set to 15
  2. Import Mobile.Review.Ext.v2.0.0.yymps (add MobileReview + ExtensionCore resources)
  3. Build and run for iOS device
  4. Install and launch on a physical device running iOS 15.x (tested: iPhone 6s, iOS 15.8)
  5. App crashes immediately on launch with a dyld symbol resolution error — before any GML code executes, without ever calling mobile_review_show()

How reliably can you recreate this issue using your steps above?

Always

Which version of GameMaker are you reporting this issue for?

IDE v2026.0.0.16 Runtime v2026.0.0.23

Which platform(s) are you seeing the problem on?

iOS

Metadata

Metadata

Assignees

Labels

MobileReviewThis issue affects the specific named extensionextensionThis issue is to do with any of the official extensions

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions