← Hive AxylCONTENT HISTORY
WHAT CHANGED
Update to Hive Axyl
Snapshot Oct 24, 2026 · 13:42 UTC · version 2.1.0
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Hive Axyl and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Use for shared or multi-platform push preparation, language/consent changes and app-policy-driven account binding in Hive Axyl Unity. Native APNs/FCM details are bundled; sending campaigns and local notifications are outside this skill.",
"included_files": [
{
"relative_path": "references/apns.md",
"size_in_bytes": 3256
},
{
"relative_path": "references/fcm.md",
"size_in_bytes": 1343
}
],
"name": "axyl-push",
"skill_md_contents": "---\nname: axyl-push\ndescription: \"Use for shared or multi-platform push preparation, language/consent changes and app-policy-driven account binding in Hive Axyl Unity. Native APNs/FCM details are bundled; sending campaigns and local notifications are outside this skill.\"\nlicense: Apache-2.0\nmetadata:\n author: Com2uS Platform Corporation\n sdk-version: 1.0.0\n engine: Unity 6000.0+\n---\n\n# Prepare a device for push\n\nRegisters the device's push token with Axyl on iOS, macOS or Android, and changes an\nexisting registration's language, consent or player binding. The Installed SDK, SDK\nresults, Push registration and Push settings and account binding sections below\napply to every step.\n\n**Inputs:** the player's session, country, IANA time zone, language and the three\nconsents; for a change, the registered device token.\n**App owns:** permission UI, lifecycle, retry scheduling, consent storage and the\naccount-binding policy.\n\nFor an APNs-only or Android-only request, prefer the installed `axyl-push-apns` or\n`axyl-push-fcm` skill. For preparation, read the platform procedure (both only for\nmulti-platform work):\n\n| Platform | Read | Covers |\n|---|---|---|\n| iOS, macOS | [APNs](references/apns.md) | Native forwarding, permission owner, entitlement environment, reception and cold start |\n| Android | [FCM](references/fcm.md) | Firebase configuration, `POST_NOTIFICATIONS`, token renewal, reception and cold start |\n\nA settings or account change on a known registration needs no permission, token or\naddon work. Sending campaigns and local notifications are outside this skill.\n\n## Verify\n\n- [ ] Permission denial or an invalid input makes no token or registration call.\n- [ ] Registration sends the right provider type (the APNs environment or `Fcm`) and\n the full `Agreement`; OS permission never sets consent.\n- [ ] A token refresh during registration ends with the latest token and consent\n registered, without permission or token loops.\n- [ ] A settings change uses its dedicated patch with the full `Agreement` and keeps\n the desired state on failure; a logout detach follows app policy only.\n- [ ] Registration, device delivery and campaign tests are reported separately.\n\n<!-- axyl-shared: core/installed-sdk.md -->\n\n## Installed SDK\n\n- Read `Packages/manifest.json`, the lock file and each resolved `package.json`.\n All `com.com2usplatform.hiveaxyl.*` packages must be the same release (UPM does\n not enforce this); `com.hive.axyl.*` packages are a release before 1.0.0-rc.9.\n- The installed SDK wins for APIs, types and contracts. If its release differs\n from this skill's `sdk-version`, apply a step only after its fields, result\n variants, platform support and failure behaviour match; otherwise stop at that\n step and report what is missing. Never change the installed version.\n- The app owns UI, storage, the device key and orchestration. Sample and recipe\n classes are not SDK APIs.\n\n<!-- /axyl-shared -->\n\n<!-- axyl-shared: core/results.md -->\n\n## SDK results\n\nMatch each call's concrete result and read `Success.Data` only after checking the\nfields the next step needs. The markers live in `Hive.Axyl.Contracts.Result`.\n\n| Result | Handling |\n|---|---|\n| `IUserCanceledOutcome` | The user dismissed OS or provider UI: stop this attempt quietly |\n| `IUnknownOutcome` | Keep `Code` and `RawJson`; never treat it as a known refusal or a success |\n| `IUntypedProblem` | Technical failure in `Problem` (`HiveError`): network, timeout or caller `Cancelled` |\n| Other typed variant | Only that call's documented meaning |\n\nPass `new ApiCallContext { Token = ct }` and check cancellation before each\nfollow-up call; a request cancelled in flight may still have taken effect. Never\nbranch on HTTP status, exception text or raw bodies, and never log tokens or\ncredentials.\n\n<!-- /axyl-shared -->\n\n<!-- axyl-shared: core/push-preparation.md -->\n\n## Push registration\n\nResolve `Hive.Axyl.Push.IPushService`, registered once with `AddPush()`, which\nalready binds `https://app-api.hiveaxyl.com` (`AddPush(baseUrl)` is only for an\nexplicitly provisioned host; Push has no sandbox or zone), and the selected APNs or\nFCM addon. Registration needs the player's authenticated session, from which the\nserver takes the player ID. The registration belongs to the device token, so logout\ndoes not remove it. Never log device tokens or notification payloads.\n\n**Registration inputs:** ISO country, an IANA time zone ID, a defined `LanguageCode`\n(never `Unspecified`, never parsed from a number), the optional server ID and app\nversion, and three explicit consents: information, advertising and night\nadvertising, where `Night = true` requires `Advertise = true`. OS permission is not\nconsent.\n\n1. Validate the inputs before asking for permission.\n2. Check or request permission with the platform procedure. Denial is an expected\n state: stop before the token and the registration.\n3. Get a nonempty token and its `UpsertTokenRequestProviderType`: `Apns` or\n `ApnsSandbox` from the actual APNs entitlement environment, `Fcm` for FCM. An\n unknown environment or an empty token stops here.\n4. `push.UpsertTokenAsync(new UpsertTokenRequest { Token = deviceToken,\n ProviderType = providerType, Language = language, Country = country,\n TimezoneId = timezoneId, Agreement = new Agreement { Info = infoConsent,\n Advertise = advertiseConsent, Night = nightConsent }, ServerId = serverId,\n AppVersion = appVersion }, new ApiCallContext { Token = ct })`.\n5. `PushUpsertTokenResult.Success` means the registry accepted the update\n asynchronously; keep the token and provider type used. It does not prove delivery.\n\nCheck cancellation after the permission, token and registration steps; a request\nthat may have reached the server stays uncertain rather than undone. A settings\nchange on a known registration uses the settings patches below, never a new\npermission prompt or token.\n\n### Token renewal\n\nSubscribe to the plugin's `TokenRefreshed` for the app-owned lifetime and\nunsubscribe on teardown. Re-register the latest token with the current account,\nenvironment, language and full consent. Serialize as the recipe does: while a\nregistration runs, keep only the latest event token, and after `Success` register\nagain only if it differs. Stop on failure or cancellation; a bounded retry is the\napp's choice and must keep the latest desired state. A repeated token, including one\nthe token lookup itself emits, must not loop permission or token calls.\nRegistration has no revision field, so client ordering does not prove the server's\nwrite order after a timeout.\n\n<!-- /axyl-shared -->\n\n<!-- axyl-shared: core/push-management.md -->\n\n## Push settings and account binding\n\nUse `Hive.Axyl.Push.IPushService` with the account's authenticated session and the\ndevice token actually registered; a login access token is not a device token. The\nrecipes do not compose these calls: the coordination below is the app's design.\n\n| Change | Call with `new ApiCallContext { Token = ct }` |\n|---|---|\n| Language | `PatchTokenLanguageAsync(new PatchTokenLanguageRequest { Token = deviceToken, Language = language }, ctx)` |\n| Consent | `PatchTokenAgreementAsync(new PatchTokenAgreementRequest { Token = deviceToken, Agreement = new Agreement { Info = info, Advertise = advertise, Night = night } }, ctx)` |\n| Player binding | `DetachTokenIdentifierAsync(new DetachTokenIdentifierRequest { Token = deviceToken }, ctx)` |\n\nEach result has `Success`, `ResourceNotInScope`, `InvalidSubject`, unknown and\n`Failure` variants. `Success` means the server accepted the change asynchronously,\nnot that it was applied or that delivery changed. Keep the latest desired state\nafter a failure; a typed refusal is no reason to resend it unchanged.\n\n- `Language` is a defined `LanguageCode`, never `Unspecified`.\n- The consent patch replaces the whole `Agreement`; `Night = true` requires\n `Advertise = true`. Consent comes from app policy, never from OS permission.\n- A new registration or token uses the full `UpsertTokenAsync`; a patch changes one\n setting of a known registration. Run patches and upserts through one app-owned\n update flow that carries account, token and the latest full state, so an old\n result never marks a newer token synchronized. Client ordering does not prove\n server apply order after a timeout.\n\n### Logout and account switch\n\nWhether logout detaches the player binding, and whether a detach failure blocks\nlogout, is app policy: reuse it or ask the app developer, never add it silently.\n\n| Policy | Boundary |\n|---|---|\n| Detach on logout | Capture the player and device token, pause queued upserts, and dispatch the detach while that account is still authenticated, before Auth logout; then apply the app's failure policy and the logout result |\n| Keep the binding | The token keeps targeting that player; login alone does not rebind it, and an app rebind upserts with the new account and its consent |\n\nDetach removes only the player ID from the registration: it does not delete the\ntoken, revoke OS permission, reset consent or recall queued notifications. Never\nsend one account's cleanup as another, or retry it with an invalidated token. If the\ndetach succeeds but Auth logout is refused or cancelled, report that split state;\nnever rebind automatically or call it a rollback.\n\n<!-- /axyl-shared -->\n"
}SHA-256 of public snapshot: 8c07965eeaee15b18cb35b1e6c35028aaa388afd23d844154f1c62e237ac5993