Skip to content

Bump native SDKs to iOS 4.5.0 and Android 1.7.0 (stable) - #9

Merged
jsantelys-as merged 2 commits into
mainfrom
chore/bump-native-sdks-ios-4.5.0-android-1.7.0
Aug 12, 2026
Merged

Bump native SDKs to iOS 4.5.0 and Android 1.7.0 (stable)#9
jsantelys-as merged 2 commits into
mainfrom
chore/bump-native-sdks-ios-4.5.0-android-1.7.0

Conversation

@jsantelys-as

@jsantelys-as jsantelys-as commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Moves both native dependency pins to the latest stable releases: Android 1.7.0 and iOS 4.5.0.

This is the follow-up #7 asked for. That PR pinned Android to 1.7.0-SNAPSHOT and noted "Snapshots are mutable and expire: this must go back to a plain release version before the package ships." 1.7.0 is now published on Maven Central, so this replaces the snapshot pin with the stable release and removes the scaffolding that existed only to serve it.

Version pins

  • Editor/AppstackDependencies.xml1.7.0-SNAPSHOT1.7.0
  • Editor/AppstackIOSPostProcessBuild.cs4.4.04.5.0

Snapshot scaffolding removed

Now that the pin is a plain release, the Central Portal snapshot repository is no longer needed and is dropped from all three places #7 added it:

  • Editor/AppstackDependencies.xml (the EDM4U <repository> entry)
  • Documentation~/Android.md (the manual-Gradle snippet integrators copy)
  • Tests~/Native/Android/settings.gradle.kts (the scoped appstackSnapshots repo)

The real-artifact fixture now resolves 1.7.0 from mavenCentral() alone, verified below. #7's release.yml -SNAPSHOT guard is kept as-is. Simulating the release assembly confirms the guard passes on this branch, which it could not do before.

API compatibility

Both bumps are purely additive for every API the bridges call:

  • Android configureWrapper is byte-identical between 1.5.0 and 1.7.0.
  • iOS @_spi configure(apiKey:logLevel:customerUserId:wrapperVersion:) is unchanged.
  • sendEvent, getAppstackId, isSdkDisabled, awaitAttributionParams / getAttributionParams, and setProxyUrl all keep their signatures.

Platform floors are unchanged, so the documented support matrix holds: iOS .v15, Android minSdk 21.

Correction: the earlier iOS note in this description was wrong

An earlier revision of this description stated that the distributed 4.5.0 binary does not export setCustomerUserId and that #7's iOS blocker still stood. Both claims were incorrect and are withdrawn.

That note was based on the AppstackSDK.xcframework directory committed in ios-appstack-sdk, which is vestigial after the move to binaryTarget(url:checksum:) and is byte-identical across 4.4.0 through 4.5.0. The artifact SPM downloads is the release zip, and it does export setCustomerUserId, verified at the checksum Package.swift declares.

iOS 4.5.0 ships the setter and #7's iOS blocker is cleared by this bump. Nothing needs re-cutting in ios-appstack-sdk.

The stale directory also affected this PR's iOS fixture, which read it: the iOS verification below was made against 4.4.0-era bits. #10 changes the fixture to resolve and checksum the real release artifact, where it also passes.

Behavior change worth reviewing

Both new versions discard a manually sent INSTALL event — Android 1.7.0 returns early from sendEvent, and iOS 4.5.0 rejects automatic-only lifecycle events at the entry point. The native comments attribute this to an observed install/first-open over-count. At the old pins that call reached the wire.

Nothing throws, so this is not an API break, but USAGE.md described INSTALL as "App install (SDK may track)", which is no longer accurate. That row is corrected and a changelog note added. Any integrator sending INSTALL by hand will silently stop counting after this bump.

Verification

  • Android fixture passes from a clean state — 33 contract tests, 0 failures, and real-artifact compiles the production Java bridge against the real artifact. Confirmed the resolved coordinate is genuinely 1.7.0 ({strictly 1.7.0} -> 1.7.0) from mavenCentral() with the snapshot repo removed, not a stale cache.
  • iOS fixture passes — 9 XCTest cases, then the production bridge compiled against the real 4.5.0 XCFramework for an iOS 15 simulator target with all 7 expected C ABI symbols present.
  • Release guard simulated — assembled the package exactly as release.yml does and confirmed no -SNAPSHOT remains.
  • Both artifacts are published and reachable: Android 1.7.0 returns 200 from Maven Central; the 4.5.0 binaryTarget zip returns 200, and the XCFramework is still committed at that tag, which the iOS fixture's git archive step depends on.

Not covered

  • The Unity editor suite (Tests/Editor/) and the on-device integration build were not run — they need the Unity CLI. The only C# touched is an Editor-only const and an assertion string in the integration build project, so the public API snapshot surface is untouched.
  • Unity's EventType enum still lacks iOS's FIRST_OPEN / FIRST_OPEN_GUARDED. Pre-existing and unrelated to this bump (both already existed at 4.4.0, Android has never had them), and they are automatic-only events, so they are intentionally left out.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: baa855a8-f762-478e-be87-13905c039684

📥 Commits

Reviewing files that changed from the base of the PR and between 2173e1e and 4793910.

📒 Files selected for processing (2)
  • Tests~/Native/README.md
  • Tests~/Native/iOS/run-tests.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • Tests~/Native/README.md
📜 Recent review details
🔇 Additional comments (1)
Tests~/Native/iOS/run-tests.sh (1)

25-43: LGTM!

Also applies to: 80-80


📝 Walkthrough

Summary by CodeRabbit

  • Documentation

    • Updated supported native SDK versions to Android 1.7.0 and iOS 4.5.0.
    • Clarified that the INSTALL event is emitted automatically on first launch; manually sending it has no effect.
    • Updated setup, architecture, integration, and usage guidance to reflect the latest SDK versions.
  • Tests

    • Updated native and integration validation to use Android SDK 1.7.0 and iOS SDK 4.5.0.

Walkthrough

The pull request updates native Android and iOS SDK references to Android 1.7.0 and iOS 4.5.0. It also documents automatic INSTALL emission and ignored manual INSTALL events.

Changes

Native SDK alignment

Layer / File(s) Summary
SDK version references
DEVELOPMENT.md, Documentation~/Android.md, Editor/*, CHANGELOG.md
Project configuration and documentation now reference Android SDK 1.7.0 and iOS SDK 4.5.0.
Native validation versions
Tests~/Integration/*, Tests~/Native/*
Integration and native test fixtures now validate against the updated SDK versions. The iOS test script reports whether the SDK version is tag-verified or version-unverified.
INSTALL event documentation
CHANGELOG.md, USAGE.md
Documentation states that INSTALL is emitted automatically on first launch and manual sends are ignored.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Possibly related PRs

Suggested labels: enhancement

Poem

A rabbit checks each version pin,
Android stable now steps in.
iOS four-five guides the way,
INSTALL arrives on launch day.
Manual sends no longer win.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the primary change: updating the iOS and Android native SDKs to stable versions.
Description check ✅ Passed The description directly explains the SDK updates, snapshot removal, compatibility, documentation changes, and verification performed.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/bump-native-sdks-ios-4.5.0-android-1.7.0
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch chore/bump-native-sdks-ios-4.5.0-android-1.7.0

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Tests`~/Native/iOS/run-tests.sh:
- Line 70: Update the SDK_INPUT validation flow in run-tests.sh so direct
.xcframework paths and directories are rejected unless they provide a trusted
AppstackSDK 4.5.0 version identifier or matching checksum. Ensure every accepted
input is verified as 4.5.0 before emitting the line-70 success message.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6db53168-76b8-4a3a-94fe-59db0fcf69df

📥 Commits

Reviewing files that changed from the base of the PR and between 2007fb0 and 839900d.

📒 Files selected for processing (11)
  • CHANGELOG.md
  • DEVELOPMENT.md
  • Documentation~/Android.md
  • Editor/AppstackDependencies.xml
  • Editor/AppstackIOSPostProcessBuild.cs
  • Tests~/Integration/README.md
  • Tests~/Integration/UnityProject/Assets/Editor/AppstackIntegrationBuild.cs
  • Tests~/Native/Android/real-artifact/build.gradle.kts
  • Tests~/Native/README.md
  • Tests~/Native/iOS/run-tests.sh
  • USAGE.md
📜 Review details
🔇 Additional comments (10)
DEVELOPMENT.md (1)

58-60: LGTM!

Also applies to: 102-102

Documentation~/Android.md (1)

36-36: LGTM!

Editor/AppstackDependencies.xml (1)

10-10: LGTM!

Editor/AppstackIOSPostProcessBuild.cs (1)

13-13: LGTM!

CHANGELOG.md (1)

14-15: LGTM!

Also applies to: 27-32

Tests~/Integration/README.md (1)

60-60: LGTM!

Tests~/Integration/UnityProject/Assets/Editor/AppstackIntegrationBuild.cs (1)

264-264: LGTM!

Tests~/Native/Android/real-artifact/build.gradle.kts (1)

24-24: LGTM!

Tests~/Native/README.md (1)

12-12: LGTM!

Also applies to: 29-29

USAGE.md (1)

127-127: LGTM!

Comment thread Tests~/Native/iOS/run-tests.sh Outdated
done

echo "Verified iOS bridge against AppstackSDK 4.4.0 and all expected C symbols."
echo "Verified iOS bridge against AppstackSDK 4.5.0 and all expected C symbols."

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
file='Tests~/Native/iOS/run-tests.sh'
rg -n -C 4 'SDK_INPUT|git archive 4\.5\.0|\.xcframework|Verified iOS bridge' "$file"

Repository: appstack-tech/appstack-unity-sdk

Length of output: 1317


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
file='Tests~/Native/iOS/run-tests.sh'
cat -n "$file"
printf '\n--- related version and artifact references ---\n'
rg -n -C 3 '4\.5\.0|4\.4\.0|CFBundleShortVersionString|CFBundleVersion|AppstackSDK\.xcframework|APPSTACK_IOS_DISTRIBUTION_REPO' \
  Tests~ Runtime README.md .github 2>/dev/null || true

Repository: appstack-tech/appstack-unity-sdk

Length of output: 7233


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re

path = Path("Tests~/Native/iOS/run-tests.sh")
lines = path.read_text().splitlines()

# Model the three input-selection branches without executing repository code.
def selected_xcframework(sdk_input: str) -> str:
    if sdk_input.endswith(".xcframework"):
        return sdk_input
    return sdk_input.rstrip("/") + "/AppstackSDK.xcframework"

for value in ("/tmp/AppstackSDK-4.4.0.xcframework", "/tmp/sdk-4.4.0"):
    print(f"{value} -> {selected_xcframework(value)}")

direct_branch = "\n".join(lines[29:34])
version_checks = [
    line for line in lines[29:34]
    if re.search(r"4\.5\.0|version|checksum|sha256|CFBundle", line, re.I)
]
print("direct-branch-version-checks:", version_checks or "none")
print("success-message:", lines[69])
PY

Repository: appstack-tech/appstack-unity-sdk

Length of output: 433


Ensure every accepted input proves the SDK version.

SDK_INPUT accepts direct .xcframework paths and directories without version checks. A compatible 4.4.0 artifact can pass the structural and symbol checks, while line 70 reports validation against AppstackSDK 4.5.0. Reject unversioned inputs or validate a trusted version identifier or checksum before printing this message.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Tests`~/Native/iOS/run-tests.sh at line 70, Update the SDK_INPUT validation
flow in run-tests.sh so direct .xcframework paths and directories are rejected
unless they provide a trusted AppstackSDK 4.5.0 version identifier or matching
checksum. Ensure every accepted input is verified as 4.5.0 before emitting the
line-70 success message.

Update both native dependency pins from iOS 4.4.0 / Android 1.5.0 to the
latest stable releases, and keep the editor integration, public setup
documentation, changelog, and validation fixtures in sync.

Both releases are purely additive for the APIs the bridges use:
configureWrapper is unchanged on Android and the @_spi
configure(apiKey:logLevel:customerUserId:wrapperVersion:) is unchanged on
iOS. Platform floors are unchanged (iOS 15, Android minSdk 21).

Behavior change from the native SDKs: manually sent INSTALL events are now
discarded on both platforms (they are emitted automatically on first launch),
so SendEvent(EventType.INSTALL) is a no-op. Documented in USAGE.md and the
changelog.

Verified:
- iOS contract fixture compiles the production bridge against the real 4.5.0
  XCFramework, with all expected C ABI symbols present.
- Android fixture compiles the production Java bridge against the real 1.7.0
  artifact from Maven Central.
@jsantelys-as
jsantelys-as force-pushed the chore/bump-native-sdks-ios-4.5.0-android-1.7.0 branch from 839900d to 2173e1e Compare August 12, 2026 10:48
@jsantelys-as jsantelys-as changed the title Bump native SDKs to iOS 4.5.0 and Android 1.7.0 Bump native SDKs to iOS 4.5.0 and Android 1.7.0 (stable) Aug 12, 2026
The runner accepts three input forms but only the git-checkout form pins a tag,
yet the success message asserted the pinned version for all three. A developer
passing a local XCFramework got a "Verified against AppstackSDK 4.5.0" line the
script had not checked.

An XCFramework carries no trustworthy marketing version
(CFBundleShortVersionString is 1.0 in the shipped artifact), so a caller-supplied
binary cannot be validated against the pin. The message now names what was
actually used and marks unpinned inputs as unverified, which keeps the local
escape hatch without the false claim.

Also lifts the tag into EXPECTED_SDK_VERSION so the archive tag and the message
cannot drift apart on the next bump.

Verified both paths: the checkout form still reports 4.5.0, and a raw
.xcframework path reports it as unverified.
@jsantelys-as

jsantelys-as commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator Author

Rebased onto main to pick up #7, and addressed the review comment.

Conflict resolution. #7 pinned Android to 1.7.0-SNAPSHOT; this PR moves it to the stable 1.7.0, which is what #7 called for once the release was published. The Central Portal snapshot repository is removed from all three places #7 added it: the EDM4U declaration, the manual-Gradle snippet in Documentation~/Android.md, and the fixture's settings.gradle.kts. #7's release.yml -SNAPSHOT guard is unchanged and now passes, verified by assembling the package exactly as release.yml does.

run-tests.sh review comment. Fixed in 4793910, by a different route than suggested. The runner accepts three input forms but only the git-checkout form pins a tag, so the version claim was false for the other two. A trusted version or checksum check on caller-supplied binaries is not achievable: the shipped XCFramework's CFBundleShortVersionString is 1.0 rather than the marketing version, and the Package.swift checksum covers the release zip, not an extracted directory. Rejecting those inputs outright would remove a useful local escape hatch, so the message now names the artifact actually used and marks unpinned inputs as unverified. The tag also moved into EXPECTED_SDK_VERSION so the archive tag and the message cannot drift apart on the next bump.

Fixtures on the rebased tree. 33 Android contract tests pass, with the coordinate resolving as 1.7.0 from mavenCentral() alone. The iOS bridge compiles with all expected C symbols present.

@coderabbitai coderabbitai Bot added the enhancement New feature or request label Aug 12, 2026
@jsantelys-as
jsantelys-as merged commit 5567fce into main Aug 12, 2026
1 check passed
@jsantelys-as
jsantelys-as deleted the chore/bump-native-sdks-ios-4.5.0-android-1.7.0 branch August 12, 2026 13:33
@jsantelys-as

jsantelys-as commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator Author

Correction to the iOS note in the description above. That note claimed the distributed 4.5.0 binary does not export setCustomerUserId. It is wrong, and the description has been updated.

It was based on the AppstackSDK.xcframework directory committed in ios-appstack-sdk. That directory is vestigial after the move to binaryTarget(url:checksum:) and does not track tags — its subtree hash is byte-identical across 4.4.0, 4.4.1, 4.5.0-rc0 and 4.5.0. What SPM downloads, and what a Unity iOS build links, is the release zip named by binaryTarget(url:).

Checked against that artifact: its SHA256 is 4745e8d48767daf034fdaa4e347c0a7f52e5589cba265af7bc3e7da12e0c57e9, matching the checksum Package.swift declares, and setCustomerUserId is present in its public and private .swiftinterface files and in the binary under nm.

iOS 4.5.0 ships the setter, so #7's iOS blocker is cleared by this bump and no re-cut is needed in ios-appstack-sdk. The stale committed directory is worth deleting there: it is what a reader would naturally inspect, and removing it also shrinks clones.

This narrows what this PR's iOS verification established. The bridge does compile and export every expected C symbol, but against the stale committed bits rather than the 4.5.0 artifact. #10 changes the fixture to resolve and checksum the real release artifact, and it passes there, so the conclusion holds. The Android fixture is unaffected: it resolves the real 1.7.0 from Maven Central.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant