com.azerion.bluestack 3.4.1 → 6.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/CLAUDE.md +157 -0
  3. package/{Plugins/iOS/BSUBanner.swift.wip.meta → CLAUDE.md.meta} +2 -2
  4. package/Editor/BlueStackDependenciesSource.xml +9 -9
  5. package/Editor/Prefabs/AdPrefabs/Banners/BannerMask.prefab +314 -0
  6. package/Editor/Prefabs/AdPrefabs/Banners/BannerMask.prefab.meta +8 -0
  7. package/Example/Scripts/AnchoredBannerExample.cs +179 -0
  8. package/Example/Scripts/AnchoredBannerExample.cs.meta +2 -0
  9. package/Example/Scripts/BannerAnchor.cs +75 -0
  10. package/Example/Scripts/BannerAnchor.cs.meta +2 -0
  11. package/Example/Scripts/NativeAdManager.cs +13 -8
  12. package/Example/Scripts/SmallNativeAdManager.cs +13 -8
  13. package/Plugins/Android/bluestack-unity-android-bridge-6.0.1.aar +0 -0
  14. package/Plugins/Android/bluestack-unity-android-bridge-6.0.1.aar.meta +2 -0
  15. package/Plugins/iOS/BSUBanner.h +33 -16
  16. package/Plugins/iOS/BSUBanner.swift +418 -41
  17. package/Plugins/iOS/BSUInitializer.h +4 -3
  18. package/Plugins/iOS/BSUInitializer.swift +21 -56
  19. package/Plugins/iOS/BSUInterface.h +53 -37
  20. package/Plugins/iOS/BSUInterface.m +139 -83
  21. package/Plugins/iOS/BSUInterstitialAd.h +9 -7
  22. package/Plugins/iOS/BSUInterstitialAd.swift +44 -26
  23. package/Plugins/iOS/BSUNativeAd.h +2 -2
  24. package/Plugins/iOS/BSUNativeAd.swift +13 -13
  25. package/Plugins/iOS/BSUPluginUtil.h +11 -1
  26. package/Plugins/iOS/BSUPluginUtil.swift +30 -0
  27. package/Plugins/iOS/BSURewardedAd.h +34 -0
  28. package/Plugins/iOS/BSURewardedAd.h.meta +2 -0
  29. package/Plugins/iOS/BSURewardedAd.swift +127 -0
  30. package/Plugins/iOS/BSURewardedAd.swift.meta +2 -0
  31. package/Plugins/iOS/BSUTypes.h +25 -22
  32. package/Plugins/iOS/BSUTypes.swift +24 -21
  33. package/Plugins/iOS/MaskView.swift +24 -0
  34. package/Plugins/iOS/MaskView.swift.meta +2 -0
  35. package/README.md +57 -31
  36. package/Runtime/API/AdSize.cs +34 -6
  37. package/Runtime/API/AdapterStatus.cs +14 -1
  38. package/Runtime/API/Banner/AdMaskHandler.cs +175 -0
  39. package/Runtime/API/Banner/AdMaskHandler.cs.meta +2 -0
  40. package/Runtime/API/Banner/AdPlacementHandler.cs +330 -0
  41. package/Runtime/API/Banner/AdPlacementHandler.cs.meta +11 -0
  42. package/Runtime/API/Banner/AdPosition.cs +13 -1
  43. package/Runtime/API/Banner/BannerAd.cs +339 -21
  44. package/Runtime/API/Banner/PreferredBannerSize.cs +27 -0
  45. package/Runtime/API/Banner/PreferredBannerSize.cs.meta +2 -0
  46. package/Runtime/API/BlueStackAds.cs +52 -33
  47. package/Runtime/API/BlueStackError.cs +12 -1
  48. package/Runtime/API/InitializationStatus.cs +25 -0
  49. package/Runtime/API/InterstitialAd.cs +61 -15
  50. package/Runtime/API/NativeAd/NativeAd.cs +36 -4
  51. package/Runtime/API/NativeAd/NativeAdEventArgs.cs +6 -2
  52. package/Runtime/API/NativeAd/NativeAdInteractionHandler.cs +19 -1
  53. package/Runtime/API/NativeAd/NativeAdLoader.cs +28 -2
  54. package/Runtime/API/NativeAd/NativeAdType.cs +11 -1
  55. package/Runtime/API/NativeAd/NativeAssetInfo.cs +23 -1
  56. package/Runtime/API/Preference/Gender.cs +7 -1
  57. package/Runtime/API/Preference/Location.cs +20 -1
  58. package/Runtime/API/Preference/Preference.cs +23 -1
  59. package/Runtime/API/Rewarded/Reward.cs +15 -2
  60. package/Runtime/API/Rewarded/RewardedAd.cs +130 -0
  61. package/Runtime/API/Rewarded/RewardedItem.cs +15 -2
  62. package/Runtime/API/SDKInitializationStatus.cs +6 -1
  63. package/Runtime/API/Settings.cs +10 -1
  64. package/Runtime/Common/AdsMainThreadDispatcher.cs +70 -0
  65. package/Runtime/Common/NativeAd/NativeUtils.cs +2 -2
  66. package/Runtime/Internal/IBannerAdClient.cs +19 -7
  67. package/Runtime/Internal/IBlueStackClient.cs +6 -3
  68. package/Runtime/Internal/IClientsFactory.cs +1 -1
  69. package/Runtime/Internal/IInterstitialAdClient.cs +7 -5
  70. package/Runtime/Internal/IRewardedAdClient.cs +23 -0
  71. package/Runtime/Platforms/Android/AndroidJavaObjectFactory.cs +6 -6
  72. package/Runtime/Platforms/Android/BannerAdClient.cs +60 -24
  73. package/Runtime/Platforms/Android/BlueStackClient.cs +35 -165
  74. package/Runtime/Platforms/Android/BlueStackNativeClassNames.cs +8 -16
  75. package/Runtime/Platforms/Android/ClientsFactory.cs +2 -2
  76. package/Runtime/Platforms/Android/InitializationStatusClient.cs +56 -5
  77. package/Runtime/Platforms/Android/InterstitialAdClient.cs +22 -10
  78. package/Runtime/Platforms/Android/NativeAdClient.cs +1 -1
  79. package/Runtime/Platforms/Android/PreferenceClient.cs +19 -19
  80. package/Runtime/Platforms/Android/{RewardedVideoAdClient.cs → RewardedAdClient.cs} +34 -22
  81. package/Runtime/Platforms/Unity/AdvertisementManager.cs +2 -2
  82. package/Runtime/Platforms/Unity/BannerAdClient.cs +284 -80
  83. package/Runtime/Platforms/Unity/BlueStackClient.cs +48 -4
  84. package/Runtime/Platforms/Unity/ClientsFactory.cs +2 -2
  85. package/Runtime/Platforms/Unity/InterstitialAdClient.cs +19 -10
  86. package/Runtime/Platforms/Unity/{RewardedVideoAdClient.cs → RewardedAdClient.cs} +25 -16
  87. package/Runtime/Platforms/iOS/BannerAdClient.cs +82 -25
  88. package/Runtime/Platforms/iOS/BlueStackClient.cs +26 -37
  89. package/Runtime/Platforms/iOS/ClientsFactory.cs +2 -2
  90. package/Runtime/Platforms/iOS/Externs.cs +68 -43
  91. package/Runtime/Platforms/iOS/InitializationStatusClient.cs +18 -28
  92. package/Runtime/Platforms/iOS/InterstitialAdClient.cs +133 -53
  93. package/Runtime/Platforms/iOS/RewardedAdClient.cs +251 -0
  94. package/Runtime/Platforms/iOS/Utils.cs +1 -1
  95. package/Runtime/Utilities/CoordinateConverter.cs +318 -0
  96. package/Runtime/Utilities/CoordinateConverter.cs.meta +11 -0
  97. package/package.json +3 -3
  98. package/Plugins/Android/bluestack-unity-android-bridge-5.4.0.aar +0 -0
  99. package/Plugins/Android/bluestack-unity-android-bridge-5.4.0.aar.meta +0 -2
  100. package/Plugins/iOS/BSUBanner.swift.wip +0 -303
  101. package/Plugins/iOS/BSURewardedVideoAd.h +0 -32
  102. package/Plugins/iOS/BSURewardedVideoAd.h.meta +0 -27
  103. package/Plugins/iOS/BSURewardedVideoAd.swift +0 -108
  104. package/Plugins/iOS/BSURewardedVideoAd.swift.meta +0 -37
  105. package/Runtime/API/AdaptersInitializationStatus.cs +0 -20
  106. package/Runtime/API/Rewarded/RewardedVideoAd.cs +0 -82
  107. package/Runtime/Common/NativeAd/AdsEventExecutor.cs +0 -83
  108. package/Runtime/Internal/IRewardedVideoAdClient.cs +0 -21
  109. package/Runtime/Platforms/iOS/RewardedVideoAdClient.cs +0 -174
  110. /package/Runtime/API/{AdaptersInitializationStatus.cs.meta → InitializationStatus.cs.meta} +0 -0
  111. /package/Runtime/API/Rewarded/{RewardedVideoAd.cs.meta → RewardedAd.cs.meta} +0 -0
  112. /package/Runtime/Common/{NativeAd/AdsEventExecutor.cs.meta → AdsMainThreadDispatcher.cs.meta} +0 -0
  113. /package/Runtime/Internal/{IRewardedVideoAdClient.cs.meta → IRewardedAdClient.cs.meta} +0 -0
  114. /package/Runtime/Platforms/Android/{RewardedVideoAdClient.cs.meta → RewardedAdClient.cs.meta} +0 -0
  115. /package/Runtime/Platforms/Unity/{RewardedVideoAdClient.cs.meta → RewardedAdClient.cs.meta} +0 -0
  116. /package/Runtime/Platforms/iOS/{RewardedVideoAdClient.cs.meta → RewardedAdClient.cs.meta} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,83 @@
1
1
  # Changelog
2
2
 
3
+ ## [6.0.0] - 2026-05-21
4
+
5
+ ### Native SDK upgrades
6
+
7
+ - Android: BlueStack Core SDK upgraded to 6.0.1
8
+ - Android: In-App Bidding mediation adapter upgraded to 6.0.0.1
9
+ - Android: Google Mobile Ads mediation adapter upgraded to 6.0.0.1
10
+ - Android: Equativ mediation adapter upgraded to 6.0.0.2
11
+ - iOS: BlueStack Core SDK upgraded to 6.0.0
12
+ - iOS: In-App Bidding mediation adapter upgraded to 6.0.2
13
+ - iOS: Google Mobile Ads mediation adapter upgraded to 6.0.0
14
+ - iOS: Equativ mediation adapter upgraded to 6.0.0
15
+
16
+ ### Added
17
+
18
+ - `BlueStackAds.SetDebugMode(bool)` for toggling native SDK debug logging at any time, plus
19
+ `BlueStackAds.IsDebugModeEnabled` to read the cached state.
20
+ - `BlueStackAds.IsInitialized` property to check native-side readiness.
21
+ - `InterstitialAd.IsReady` and `RewardedAd.IsReady` properties.
22
+ - `BannerAd` anchor-based positioning — new constructor
23
+ `BannerAd(string placementId, Transform anchor, Camera camera = null)`. The banner follows the
24
+ anchor's screen position automatically via the new `AdPlacementHandler` component.
25
+ - `BannerAd` custom screen-space position constructor — `BannerAd(string placementId, Vector2 position)`.
26
+ - Optional `useSafeArea` parameter on `BannerAd(string, AdPosition, bool useSafeArea = true)` to opt out
27
+ of safe-area insets for sticky Top/Bottom banners. Custom-positioned banners always ignore the safe area.
28
+ - Banner masking — `BannerAd.SetMask(RectTransform, Camera)` / `BannerAd.RemoveMask()` clip the banner
29
+ to a UI region. The mask follows the `RectTransform` as it animates or resizes.
30
+ - `BannerAd.OnAdResized` event delivers a `PreferredBannerSize` (`Width`, `Height`) whenever the SDK
31
+ reports a post-load size change.
32
+ - `BannerAd.OnAdLoaded` payload changed to `PreferredBannerSize` carrying the SDK-preferred dimensions
33
+ (was `EventArgs`).
34
+ - `RewardedAd.OnAdRewardEarned` (renamed from `OnRewardEarned`) delivers a `RewardedItem`.
35
+ - `UpdateInterval` API on `AdMaskHandler` and `AdPlacementHandler`, clamped to `[0, 5]` seconds
36
+ (0 = every frame).
37
+
38
+ ### Changed
39
+
40
+ - **Breaking** — `BlueStackAds.Initialize` signature simplified:
41
+ - Before: `Initialize(string appId, Settings settings, Action<SDKInitializationStatus> sdkCallback, Action<IInitializationStatusClient> adaptersCallback)`
42
+ - After: `Initialize(string appId, Action<InitializationStatus> initializationCompleteAction = null)`
43
+ - The `Settings`-based debug toggle is replaced by `BlueStackAds.SetDebugMode(bool)`.
44
+ - The separate success/fail `SDKInitializationStatus` callback is removed. The single completion
45
+ callback now delivers `InitializationStatus.AdapterStatusMap` (per-adapter `AdapterStatus`).
46
+ - The initialization callback is now consistently dispatched to the Unity main thread on both
47
+ iOS and Android.
48
+ - **Breaking** — `RewardedVideoAd` class renamed to `RewardedAd`.
49
+ - **Breaking** — Banner event names renamed:
50
+ - `OnBannerDidLoad` → `OnAdLoaded` (payload changed to `PreferredBannerSize`)
51
+ - `OnBannerDidFailed` → `OnAdFailedToLoad`
52
+ - `OnBannerDisplay` → `OnAdDisplayed`
53
+ - `OnBannerHide` → `OnAdHidden`
54
+ - `OnBannerDidRefresh` → `OnAdRefreshed`
55
+ - `OnBannerDidFailToRefresh` → `OnAdFailedToRefresh`
56
+ - **Breaking** — Interstitial event names renamed:
57
+ - `OnInterstitialDidLoaded` → `OnAdLoaded`
58
+ - `OnInterstitialDidFail` → `OnAdFailedToLoad`
59
+ - `OnInterstitialClicked` → `OnAdClicked`
60
+ - `OnInterstitialDidShown` → `OnAdDisplayed`
61
+ - `OnInterstitialDisappear` → `OnAdDismissed`
62
+ - **Breaking** — Rewarded event names renamed:
63
+ - `OnRewardedVideoAdLoaded` → `OnAdLoaded`
64
+ - `OnRewardedVideoAdError` → `OnAdFailedToLoad`
65
+ - `OnRewardedVideoAdAppeared` → `OnAdDisplayed`
66
+ - `OnRewardedVideoAdClicked` → `OnAdClicked`
67
+ - `OnRewardedVideoAdClosed` → `OnAdDismissed`
68
+ - `OnUserRewardEarned` → `OnAdRewardEarned`
69
+ - Banner ads now show automatically on load (auto-refresh handling moved to the BlueStack console).
70
+ - Banner container view now wraps the loaded ad's actual rendered size (previously used the requested
71
+ `AdSize`), reducing layout-padding artifacts for dynamic-width banners.
72
+ - iOS bridge routes init and SDK-config calls through a `BSUInitializer` Swift façade that caches the
73
+ debug-mode flag for bridge-side diagnostics.
74
+ - Android bridge routes init and SDK-config calls through a `UnityMobileAds` Kotlin singleton mirroring
75
+ the iOS façade.
76
+
77
+ ### Removed
78
+
79
+ - **Breaking** — `Settings` parameter removed from `BlueStackAds.Initialize`. The `Settings` class is retained for source compatibility only and is no longer used by the SDK.
80
+
3
81
  ## [3.4.1] - 2026-02-27
4
82
 
5
83
  ### Changed
package/CLAUDE.md ADDED
@@ -0,0 +1,157 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## What This Is
6
+
7
+ `com.azerion.bluestack` — a Unity UPM package (v6.0.0) that wraps the native BlueStack ad SDK for iOS and Android. It exposes a cross-platform C# API for banner, interstitial, rewarded, and native ad formats.
8
+ - **package project repo**: `/Users/moinhasan/Development/Azerdev/bluestack/unity/bluestack-sdk-unity`
9
+ - **UPM package directory**: `/Users/moinhasan/Development/Azerdev/bluestack/unity/bluestack-sdk-unity/plugin`
10
+
11
+ **Related repos worked on alongside this package:**
12
+ - **Demo/test app**: `/Users/moinhasan/Development/Azerdev/bluestack/unity/bluestack-demo-unity`
13
+ - **Android native bridge source**: `/Users/moinhasan/Development/Azerdev/bluestack/unity/bluestack-sdk-unity/android-bridge`
14
+ - **Public Documentation**: `/Users/moinhasan/Development/Azerdev/bluestack/bluestack-app`
15
+
16
+ ---
17
+
18
+ ## Build Commands
19
+
20
+ ### Rebuild Android Bridge AAR
21
+
22
+ After changing any Kotlin source in `android-bridge/`, rebuild and deploy the AAR:
23
+
24
+ ```bash
25
+ cd /Users/moinhasan/Development/Azerdev/bluestack/unity/bluestack-sdk-unity/android-bridge
26
+ ./gradlew mkBlueStackSdk
27
+ ```
28
+
29
+ Output goes to `plugin/Plugins/Android/bluestack-unity-android-bridge-{version}.aar`. The version is set in `android-bridge/build.gradle` ext block.
30
+
31
+ ### iOS Bridge
32
+
33
+ No build step — Swift/Objective-C files in `Plugins/iOS/` are compiled by Xcode during Unity iOS export. After exporting from Unity, run `pod install` in the generated Xcode project.
34
+
35
+ ### Run SDK Tests
36
+
37
+ Use **Unity Test Runner** (`Window > General > Test Runner`):
38
+ - `Tests/Runtime/` — `Azerion.BlueStack.Tests` assembly
39
+ - `Tests/Editor/` — `Azerion.BlueStack.Editor.Tests` assembly
40
+
41
+ Moq is available at `Plugins/Moq/` for mocking interfaces in tests.
42
+
43
+ ---
44
+
45
+ ## Architecture
46
+
47
+ ### Layer Stack
48
+
49
+ ```
50
+ Developer code
51
+
52
+ API layer Runtime/API/ Public classes (BannerAd, InterstitialAd, …)
53
+
54
+ Interfaces Runtime/Internal/ IBannerAdClient, IInterstitialAdClient, …
55
+
56
+ Platform clients Runtime/Platforms/
57
+ Android/ AndroidJavaProxy-based wrappers
58
+ iOS/ P/Invoke wrappers
59
+ Unity/ Editor stubs (simulate ads in Play mode)
60
+
61
+ Native bridge
62
+ Plugins/Android/*.aar Kotlin — com.azerion.bluestack.unity.*
63
+ Plugins/iOS/*.swift/.m Swift/Obj-C — BSU* classes
64
+ ```
65
+
66
+ ### Factory Pattern — Platform Selection
67
+
68
+ `BlueStackAds.GetClientsFactory()` (in `Runtime/API/BlueStackAds.cs`) selects the platform factory at runtime:
69
+
70
+ ```
71
+ Application.platform == Android → Platforms.Android.ClientsFactory
72
+ Application.platform == iPhone → Platforms.iOS.ClientsFactory
73
+ anything else (Editor) → Platforms.Unity.ClientsFactory (loaded via Activator.CreateInstance)
74
+ ```
75
+
76
+ The Unity editor factory uses reflection so its assembly (`Azerion.BlueStack.Editor`) doesn't need to be referenced from the runtime assembly. All platform clients implement `IClientsFactory` and create the six client interfaces: `IBlueStackClient`, `IBannerAdClient`, `IInterstitialAdClient`, `IRewardedVideoAdClient`, `INativeAdClient`, `IPreferenceClient`.
77
+
78
+ ### Main Thread Dispatcher
79
+
80
+ `BlueStackMainThreadDispatcher` (`Runtime/Common/`) is a `DontDestroyOnLoad` MonoBehaviour. Native SDK callbacks arrive on native threads; they must be marshalled to Unity's main thread before firing C# events.
81
+
82
+ - Call `BlueStackMainThreadDispatcher.ExecuteInUpdate(action)` from any thread
83
+ - Actions are drained in `Update()` under a lock
84
+ - Initialised once by `BlueStackAds.Initialize()`
85
+
86
+ ### Android Platform Client Pattern
87
+
88
+ - Client classes extend `AndroidJavaProxy`, passing the matching Java interface name to the base constructor (e.g. `UnityBannerAdListenerClassName`)
89
+ - The Java bridge calls back into C# by invoking the proxy's methods on the Unity thread
90
+ - All outbound calls to Java go through `AndroidJavaObjectFactory.Instance.RunOnUiThread(() => _unityBannerAd.Call("methodName", args))` — Android SDK requires UI thread
91
+ - Java class names are centralised in `BlueStackNativeClassNames.cs`
92
+
93
+ ### iOS Platform Client Pattern
94
+
95
+ - All native function declarations live in `Runtime/Platforms/iOS/Externs.cs` as `[DllImport("__Internal")]`
96
+ - Function naming: `BSU<AdFormat><Action>` (e.g. `BSULoadBannerAd`, `BSUShowRewardedAd`, `BSUDestroyInterstitialAd`)
97
+ - Callbacks from native → C# use typed `delegate` definitions + `[AOT.MonoPInvokeCallback(typeof(DelegateType))]` on `static` methods
98
+ - `GCHandle.Alloc(this)` pins the client instance; `GCHandle.ToIntPtr()` is passed to native as the "client ref" opaque pointer, recovered in callbacks via `GCHandle.FromIntPtr().Target`
99
+ - Native objects are kept alive in `BSUObjectCache` (Swift) until `BSURelease(ptr)` is called
100
+
101
+ ### iOS Native Bridge (Plugins/iOS/)
102
+
103
+ - `BSUInterface.m` — all `extern "C"` entry points; the only file that crosses the C↔Swift boundary
104
+ - `BSU<Format>.swift` — Swift classes implementing BlueStack iOS SDK delegates (e.g. `BSUBanner: NSObject, BannerViewDelegate`)
105
+ - `BSU<Format>.h` — Objective-C headers exposing Swift classes to C
106
+ - `BSUTypes.h` / `BSUTypes.swift` — opaque pointer `typedef`s (`BSUTypeBannerClientRef`, etc.) shared across all files
107
+ - `BSUObjectCache.swift` — thread-safe singleton (serial dispatch queue); keys objects by memory address string; objects are released by `BSURelease()`
108
+ - `MaskView.swift` — `MTKView` subclass for banner clipping/masking
109
+ - `UnityFramework.modulemap` — module map so Unity's Xcode build can import the bridge headers
110
+
111
+ Banner positioning strategy in `BSUBanner.swift`:
112
+ - Preset positions (top/bottom): `NSLayoutConstraint` Auto Layout anchored to safe area
113
+ - Custom positions: frame-based with `CATransaction.disableActions` to avoid implicit animations
114
+
115
+ ---
116
+
117
+ ## Key Files
118
+
119
+ | File | Purpose |
120
+ |---|---|
121
+ | `Runtime/API/BlueStackAds.cs` | SDK entry point; factory selection |
122
+ | `Runtime/Internal/IClientsFactory.cs` | Interface every platform factory must implement |
123
+ | `Runtime/Platforms/Android/BlueStackNativeClassNames.cs` | All Java class name constants |
124
+ | `Runtime/Platforms/Android/AndroidJavaObjectFactory.cs` | UI thread runner + Java object creation |
125
+ | `Runtime/Platforms/iOS/Externs.cs` | Every `[DllImport]` declaration |
126
+ | `Runtime/Common/BlueStackMainThreadDispatcher.cs` | Thread-safe callback queue |
127
+ | `Plugins/iOS/BSUInterface.m` | C entry points for all P/Invoke calls |
128
+ | `Plugins/iOS/BSUTypes.h` | Shared opaque pointer typedefs |
129
+ | `Plugins/iOS/BSUObjectCache.swift` | Native object lifetime management |
130
+ | `Editor/BlueStackSettingsEditor.cs` | `Azerion > BlueStack > Settings` menu |
131
+ | `package.json` | UPM manifest (version bump here) |
132
+ | `CHANGELOG.md` | Version history |
133
+
134
+ ---
135
+
136
+ ## Adding a New Ad Format
137
+
138
+ Follow the existing pattern — each format has the same set of files:
139
+
140
+ 1. `Runtime/API/<Format>.cs` — public API class, holds `IFormatClient` reference
141
+ 2. `Runtime/Internal/IFormatClient.cs` — interface with Load/Show/Destroy + events
142
+ 3. `Runtime/Platforms/Android/<Format>Client.cs` — extends `AndroidJavaProxy`, calls `_unityAd.Call(...)` on UI thread
143
+ 4. `Runtime/Platforms/iOS/<Format>Client.cs` — `IntPtr` holder + delegate types + `[MonoPInvokeCallback]` statics
144
+ 5. `Runtime/Platforms/Unity/<Format>Client.cs` — Editor stub
145
+ 6. Add `Create<Format>Client()` to all three `ClientsFactory.cs` files and to `IClientsFactory`
146
+ 7. `Plugins/iOS/BSU<Format>.swift` + `BSU<Format>.h` — Swift delegate implementation
147
+ 8. Add `extern "C"` functions to `BSUInterface.m` and declare in `Externs.cs`
148
+ 9. Android: add `Unity<Format>Ad.kt` + listener interface to `android-bridge`, rebuild AAR
149
+
150
+ ---
151
+
152
+ ## Editor Tooling
153
+
154
+ - **Settings window**: `Azerion > BlueStack > Settings` — configures AdMob App IDs and mediation networks; writes `Assets/Resources/BlueStackSettings.asset` into the consuming project
155
+ - **Dependency management**: `Editor/BlueStackDependenciesSource.xml` declares native dependencies; EDM4U (`com.google.external-dependency-manager`) resolves them into Android Gradle and iOS Podfile
156
+ - **Post-build hooks**: `Editor/Android/AndroidBuildPostProcess.cs` and `Editor/iOS/BlueStackBuildPostProcess.cs` run after Unity builds to patch Xcode project / Gradle config
157
+ - **Asset post-processor**: `BlueStackAssetPostProcessor.cs` syncs dependency metadata when SDK version changes
@@ -1,6 +1,6 @@
1
1
  fileFormatVersion: 2
2
- guid: 5e1fbc30526a049ce8e6e3c773bea82d
3
- DefaultImporter:
2
+ guid: 30145a51ef72f455e943b78a0e0f7e1c
3
+ TextScriptImporter:
4
4
  externalObjects: {}
5
5
  userData:
6
6
  assetBundleName:
@@ -1,27 +1,27 @@
1
- <dependencies version="3.4.1">
1
+ <dependencies version="6.0.0">
2
2
  <androidPackages>
3
- <androidPackage alias="BlueStack" spec="com.azerion:bluestack-sdk-core:5.4.1">
3
+ <androidPackage alias="BlueStack" spec="com.azerion:bluestack-sdk-core:6.0.1">
4
4
  <repositories>
5
5
  <repository>https://packagecloud.io/smartadserver/android/maven2</repository>
6
6
  <repository>https://s01.oss.sonatype.org/content/repositories/snapshots/</repository>
7
7
  </repositories>
8
8
  </androidPackage>
9
- <androidPackage alias="In-App Bidding" spec="com.azerion:bluestack-mediation-bidding:5.4.0.0">
9
+ <androidPackage alias="In-App Bidding" spec="com.azerion:bluestack-mediation-bidding:6.0.0.1">
10
10
  <repositories>
11
11
  <repository>https://packagecloud.io/smartadserver/android/maven2</repository>
12
12
  </repositories>
13
13
  </androidPackage>
14
- <androidPackage alias="Google Mobile Ads" spec="com.azerion:bluestack-mediation-google:5.4.1.0"/>
15
- <androidPackage alias="Equativ" spec="com.azerion:bluestack-mediation-equativ:5.2.1.1">
14
+ <androidPackage alias="Google Mobile Ads" spec="com.azerion:bluestack-mediation-google:6.0.0.1"/>
15
+ <androidPackage alias="Equativ" spec="com.azerion:bluestack-mediation-equativ:6.0.0.2">
16
16
  <repositories>
17
17
  <repository>https://packagecloud.io/smartadserver/android/maven2</repository>
18
18
  </repositories>
19
19
  </androidPackage>
20
20
  </androidPackages>
21
21
  <iosPods>
22
- <iosPod alias="BlueStack" name="BlueStack-SDK" version="5.4.1" bitcodeEnabled="false" addToAllTargets="false"/>
23
- <iosPod alias="In-App Bidding" name="BlueStackBiddingAdapter" version="5.4.0" bitcodeEnabled="false" addToAllTargets="false"/>
24
- <iosPod alias="Google Mobile Ads" name="BlueStackGoogleAdapter" version="5.4.0" bitcodeEnabled="false" addToAllTargets="false"/>
25
- <iosPod alias="Equativ" name="BlueStackEquativAdapter" version="5.1.8" bitcodeEnabled="false" addToAllTargets="false"/>
22
+ <iosPod alias="BlueStack" name="BlueStack-SDK" version="6.0.0" bitcodeEnabled="false" addToAllTargets="false"/>
23
+ <iosPod alias="In-App Bidding" name="BlueStackBiddingAdapter" version="6.0.2" bitcodeEnabled="false" addToAllTargets="false"/>
24
+ <iosPod alias="Google Mobile Ads" name="BlueStackGoogleAdapter" version="6.0.0" bitcodeEnabled="false" addToAllTargets="false"/>
25
+ <iosPod alias="Equativ" name="BlueStackEquativAdapter" version="6.0.0" bitcodeEnabled="false" addToAllTargets="false"/>
26
26
  </iosPods>
27
27
  </dependencies>
@@ -0,0 +1,314 @@
1
+ %YAML 1.1
2
+ %TAG !u! tag:unity3d.com,2011:
3
+ --- !u!1 &1746883794458476
4
+ GameObject:
5
+ m_ObjectHideFlags: 0
6
+ m_CorrespondingSourceObject: {fileID: 0}
7
+ m_PrefabInstance: {fileID: 0}
8
+ m_PrefabAsset: {fileID: 0}
9
+ serializedVersion: 6
10
+ m_Component:
11
+ - component: {fileID: 224102598220924924}
12
+ - component: {fileID: 222746751799034550}
13
+ - component: {fileID: 114085332113477484}
14
+ - component: {fileID: 114158516453251810}
15
+ m_Layer: 5
16
+ m_Name: Image
17
+ m_TagString: Untagged
18
+ m_Icon: {fileID: 0}
19
+ m_NavMeshLayer: 0
20
+ m_StaticEditorFlags: 0
21
+ m_IsActive: 1
22
+ --- !u!224 &224102598220924924
23
+ RectTransform:
24
+ m_ObjectHideFlags: 0
25
+ m_CorrespondingSourceObject: {fileID: 0}
26
+ m_PrefabInstance: {fileID: 0}
27
+ m_PrefabAsset: {fileID: 0}
28
+ m_GameObject: {fileID: 1746883794458476}
29
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
30
+ m_LocalPosition: {x: 0, y: 0, z: 0}
31
+ m_LocalScale: {x: 1, y: 1, z: 1}
32
+ m_ConstrainProportionsScale: 0
33
+ m_Children: []
34
+ m_Father: {fileID: 5943901153347441392}
35
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
36
+ m_AnchorMin: {x: 0.5, y: 0}
37
+ m_AnchorMax: {x: 0.5, y: 0}
38
+ m_AnchoredPosition: {x: 0, y: 56.128017}
39
+ m_SizeDelta: {x: 1120, y: 175}
40
+ m_Pivot: {x: 0.5, y: 0.5}
41
+ --- !u!222 &222746751799034550
42
+ CanvasRenderer:
43
+ m_ObjectHideFlags: 0
44
+ m_CorrespondingSourceObject: {fileID: 0}
45
+ m_PrefabInstance: {fileID: 0}
46
+ m_PrefabAsset: {fileID: 0}
47
+ m_GameObject: {fileID: 1746883794458476}
48
+ m_CullTransparentMesh: 1
49
+ --- !u!114 &114085332113477484
50
+ MonoBehaviour:
51
+ m_ObjectHideFlags: 0
52
+ m_CorrespondingSourceObject: {fileID: 0}
53
+ m_PrefabInstance: {fileID: 0}
54
+ m_PrefabAsset: {fileID: 0}
55
+ m_GameObject: {fileID: 1746883794458476}
56
+ m_Enabled: 1
57
+ m_EditorHideFlags: 0
58
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
59
+ m_Name:
60
+ m_EditorClassIdentifier:
61
+ m_Material: {fileID: 0}
62
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
63
+ m_RaycastTarget: 1
64
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
65
+ m_Maskable: 1
66
+ m_OnCullStateChanged:
67
+ m_PersistentCalls:
68
+ m_Calls: []
69
+ m_Sprite: {fileID: 21300000, guid: 5a6531d4c9c484d679a2d6f9e6fefed5, type: 3}
70
+ m_Type: 0
71
+ m_PreserveAspect: 0
72
+ m_FillCenter: 1
73
+ m_FillMethod: 4
74
+ m_FillAmount: 1
75
+ m_FillClockwise: 1
76
+ m_FillOrigin: 0
77
+ m_UseSpriteMesh: 0
78
+ m_PixelsPerUnitMultiplier: 1
79
+ --- !u!114 &114158516453251810
80
+ MonoBehaviour:
81
+ m_ObjectHideFlags: 0
82
+ m_CorrespondingSourceObject: {fileID: 0}
83
+ m_PrefabInstance: {fileID: 0}
84
+ m_PrefabAsset: {fileID: 0}
85
+ m_GameObject: {fileID: 1746883794458476}
86
+ m_Enabled: 1
87
+ m_EditorHideFlags: 0
88
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
89
+ m_Name:
90
+ m_EditorClassIdentifier:
91
+ m_Navigation:
92
+ m_Mode: 3
93
+ m_WrapAround: 0
94
+ m_SelectOnUp: {fileID: 0}
95
+ m_SelectOnDown: {fileID: 0}
96
+ m_SelectOnLeft: {fileID: 0}
97
+ m_SelectOnRight: {fileID: 0}
98
+ m_Transition: 1
99
+ m_Colors:
100
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
101
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
102
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
103
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
104
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
105
+ m_ColorMultiplier: 1
106
+ m_FadeDuration: 0.1
107
+ m_SpriteState:
108
+ m_HighlightedSprite: {fileID: 0}
109
+ m_PressedSprite: {fileID: 0}
110
+ m_SelectedSprite: {fileID: 0}
111
+ m_DisabledSprite: {fileID: 0}
112
+ m_AnimationTriggers:
113
+ m_NormalTrigger: Normal
114
+ m_HighlightedTrigger: Highlighted
115
+ m_PressedTrigger: Pressed
116
+ m_SelectedTrigger: Highlighted
117
+ m_DisabledTrigger: Disabled
118
+ m_Interactable: 1
119
+ m_TargetGraphic: {fileID: 114085332113477484}
120
+ m_OnClick:
121
+ m_PersistentCalls:
122
+ m_Calls: []
123
+ --- !u!1 &1922916089534430
124
+ GameObject:
125
+ m_ObjectHideFlags: 0
126
+ m_CorrespondingSourceObject: {fileID: 0}
127
+ m_PrefabInstance: {fileID: 0}
128
+ m_PrefabAsset: {fileID: 0}
129
+ serializedVersion: 6
130
+ m_Component:
131
+ - component: {fileID: 224975965904302652}
132
+ - component: {fileID: 223151453590684250}
133
+ - component: {fileID: 114308861063183428}
134
+ - component: {fileID: 114122664426735340}
135
+ m_Layer: 5
136
+ m_Name: BannerMask
137
+ m_TagString: Untagged
138
+ m_Icon: {fileID: 0}
139
+ m_NavMeshLayer: 0
140
+ m_StaticEditorFlags: 0
141
+ m_IsActive: 1
142
+ --- !u!224 &224975965904302652
143
+ RectTransform:
144
+ m_ObjectHideFlags: 0
145
+ m_CorrespondingSourceObject: {fileID: 0}
146
+ m_PrefabInstance: {fileID: 0}
147
+ m_PrefabAsset: {fileID: 0}
148
+ m_GameObject: {fileID: 1922916089534430}
149
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
150
+ m_LocalPosition: {x: 0, y: 0, z: 0}
151
+ m_LocalScale: {x: 0, y: 0, z: 0}
152
+ m_ConstrainProportionsScale: 0
153
+ m_Children:
154
+ - {fileID: 5943901153347441392}
155
+ m_Father: {fileID: 0}
156
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
157
+ m_AnchorMin: {x: 0, y: 0}
158
+ m_AnchorMax: {x: 0, y: 0}
159
+ m_AnchoredPosition: {x: 0, y: 0}
160
+ m_SizeDelta: {x: 0, y: 0}
161
+ m_Pivot: {x: 0, y: 0}
162
+ --- !u!223 &223151453590684250
163
+ Canvas:
164
+ m_ObjectHideFlags: 0
165
+ m_CorrespondingSourceObject: {fileID: 0}
166
+ m_PrefabInstance: {fileID: 0}
167
+ m_PrefabAsset: {fileID: 0}
168
+ m_GameObject: {fileID: 1922916089534430}
169
+ m_Enabled: 1
170
+ serializedVersion: 3
171
+ m_RenderMode: 0
172
+ m_Camera: {fileID: 0}
173
+ m_PlaneDistance: 100
174
+ m_PixelPerfect: 0
175
+ m_ReceivesEvents: 1
176
+ m_OverrideSorting: 0
177
+ m_OverridePixelPerfect: 0
178
+ m_SortingBucketNormalizedSize: 0
179
+ m_VertexColorAlwaysGammaSpace: 0
180
+ m_AdditionalShaderChannelsFlag: 0
181
+ m_UpdateRectTransformForStandalone: 0
182
+ m_SortingLayerID: 0
183
+ m_SortingOrder: 100
184
+ m_TargetDisplay: 0
185
+ --- !u!114 &114308861063183428
186
+ MonoBehaviour:
187
+ m_ObjectHideFlags: 0
188
+ m_CorrespondingSourceObject: {fileID: 0}
189
+ m_PrefabInstance: {fileID: 0}
190
+ m_PrefabAsset: {fileID: 0}
191
+ m_GameObject: {fileID: 1922916089534430}
192
+ m_Enabled: 1
193
+ m_EditorHideFlags: 0
194
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
195
+ m_Name:
196
+ m_EditorClassIdentifier:
197
+ m_IgnoreReversedGraphics: 1
198
+ m_BlockingObjects: 0
199
+ m_BlockingMask:
200
+ serializedVersion: 2
201
+ m_Bits: 4294967295
202
+ --- !u!114 &114122664426735340
203
+ MonoBehaviour:
204
+ m_ObjectHideFlags: 0
205
+ m_CorrespondingSourceObject: {fileID: 0}
206
+ m_PrefabInstance: {fileID: 0}
207
+ m_PrefabAsset: {fileID: 0}
208
+ m_GameObject: {fileID: 1922916089534430}
209
+ m_Enabled: 1
210
+ m_EditorHideFlags: 0
211
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
212
+ m_Name:
213
+ m_EditorClassIdentifier:
214
+ m_UiScaleMode: 1
215
+ m_ReferencePixelsPerUnit: 100
216
+ m_ScaleFactor: 1
217
+ m_ReferenceResolution: {x: 1440, y: 2560}
218
+ m_ScreenMatchMode: 0
219
+ m_MatchWidthOrHeight: 0.5
220
+ m_PhysicalUnit: 3
221
+ m_FallbackScreenDPI: 96
222
+ m_DefaultSpriteDPI: 96
223
+ m_DynamicPixelsPerUnit: 1
224
+ m_PresetInfoIsWorld: 0
225
+ --- !u!1 &4706684995468568117
226
+ GameObject:
227
+ m_ObjectHideFlags: 0
228
+ m_CorrespondingSourceObject: {fileID: 0}
229
+ m_PrefabInstance: {fileID: 0}
230
+ m_PrefabAsset: {fileID: 0}
231
+ serializedVersion: 6
232
+ m_Component:
233
+ - component: {fileID: 5943901153347441392}
234
+ - component: {fileID: 1502867231817071720}
235
+ - component: {fileID: 6636735685827176976}
236
+ - component: {fileID: 3708979713080471518}
237
+ m_Layer: 0
238
+ m_Name: Mask
239
+ m_TagString: Untagged
240
+ m_Icon: {fileID: 0}
241
+ m_NavMeshLayer: 0
242
+ m_StaticEditorFlags: 0
243
+ m_IsActive: 1
244
+ --- !u!224 &5943901153347441392
245
+ RectTransform:
246
+ m_ObjectHideFlags: 0
247
+ m_CorrespondingSourceObject: {fileID: 0}
248
+ m_PrefabInstance: {fileID: 0}
249
+ m_PrefabAsset: {fileID: 0}
250
+ m_GameObject: {fileID: 4706684995468568117}
251
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
252
+ m_LocalPosition: {x: 0, y: 0, z: 0}
253
+ m_LocalScale: {x: 1, y: 1, z: 1}
254
+ m_ConstrainProportionsScale: 0
255
+ m_Children:
256
+ - {fileID: 224102598220924924}
257
+ m_Father: {fileID: 224975965904302652}
258
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
259
+ m_AnchorMin: {x: 0.5, y: 0.5}
260
+ m_AnchorMax: {x: 0.5, y: 0.5}
261
+ m_AnchoredPosition: {x: 0, y: -1295}
262
+ m_SizeDelta: {x: 600, y: 200}
263
+ m_Pivot: {x: 0.5, y: 0.5}
264
+ --- !u!222 &1502867231817071720
265
+ CanvasRenderer:
266
+ m_ObjectHideFlags: 0
267
+ m_CorrespondingSourceObject: {fileID: 0}
268
+ m_PrefabInstance: {fileID: 0}
269
+ m_PrefabAsset: {fileID: 0}
270
+ m_GameObject: {fileID: 4706684995468568117}
271
+ m_CullTransparentMesh: 1
272
+ --- !u!114 &6636735685827176976
273
+ MonoBehaviour:
274
+ m_ObjectHideFlags: 0
275
+ m_CorrespondingSourceObject: {fileID: 0}
276
+ m_PrefabInstance: {fileID: 0}
277
+ m_PrefabAsset: {fileID: 0}
278
+ m_GameObject: {fileID: 4706684995468568117}
279
+ m_Enabled: 1
280
+ m_EditorHideFlags: 0
281
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
282
+ m_Name:
283
+ m_EditorClassIdentifier:
284
+ m_Material: {fileID: 0}
285
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
286
+ m_RaycastTarget: 1
287
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
288
+ m_Maskable: 1
289
+ m_OnCullStateChanged:
290
+ m_PersistentCalls:
291
+ m_Calls: []
292
+ m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0}
293
+ m_Type: 1
294
+ m_PreserveAspect: 0
295
+ m_FillCenter: 1
296
+ m_FillMethod: 4
297
+ m_FillAmount: 1
298
+ m_FillClockwise: 1
299
+ m_FillOrigin: 0
300
+ m_UseSpriteMesh: 0
301
+ m_PixelsPerUnitMultiplier: 1
302
+ --- !u!114 &3708979713080471518
303
+ MonoBehaviour:
304
+ m_ObjectHideFlags: 0
305
+ m_CorrespondingSourceObject: {fileID: 0}
306
+ m_PrefabInstance: {fileID: 0}
307
+ m_PrefabAsset: {fileID: 0}
308
+ m_GameObject: {fileID: 4706684995468568117}
309
+ m_Enabled: 1
310
+ m_EditorHideFlags: 0
311
+ m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
312
+ m_Name:
313
+ m_EditorClassIdentifier:
314
+ m_ShowMaskGraphic: 0
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 0dda0d089da664598b51f7ea0792ce49
3
+ NativeFormatImporter:
4
+ externalObjects: {}
5
+ mainObjectFileID: 100100000
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant: