{"id":31582264,"url":"https://github.com/affise/affise-mmp-sdk-unity","last_synced_at":"2026-05-12T13:01:03.068Z","repository":{"id":56013509,"uuid":"523373342","full_name":"affise/affise-mmp-sdk-unity","owner":"affise","description":"Affise Attribution Unity SDK","archived":false,"fork":false,"pushed_at":"2026-03-06T11:47:36.000Z","size":3587,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-03-06T15:46:17.379Z","etag":null,"topics":["affise","cross-platform","metrics","mobile","sdk","unity","unity-plugin"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/affise.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-08-10T14:21:03.000Z","updated_at":"2026-03-06T11:47:36.000Z","dependencies_parsed_at":"2023-02-17T22:00:42.660Z","dependency_job_id":"4809809b-846b-417e-86ba-e11ce2ea2ff6","html_url":"https://github.com/affise/affise-mmp-sdk-unity","commit_stats":{"total_commits":36,"total_committers":2,"mean_commits":18.0,"dds":0.02777777777777779,"last_synced_commit":"ac563884869d0d289a63c8b86cc167d1f71a43fc"},"previous_names":["affise/affise-mmp-sdk-unity","affise/sdk-unity"],"tags_count":62,"template":false,"template_full_name":null,"purl":"pkg:github/affise/affise-mmp-sdk-unity","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/affise%2Faffise-mmp-sdk-unity","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/affise%2Faffise-mmp-sdk-unity/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/affise%2Faffise-mmp-sdk-unity/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/affise%2Faffise-mmp-sdk-unity/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/affise","download_url":"https://codeload.github.com/affise/affise-mmp-sdk-unity/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/affise%2Faffise-mmp-sdk-unity/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32940110,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T09:19:52.626Z","status":"ssl_error","status_checked_at":"2026-05-12T09:17:33.438Z","response_time":102,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["affise","cross-platform","metrics","mobile","sdk","unity","unity-plugin"],"created_at":"2025-10-05T22:38:35.223Z","updated_at":"2026-05-12T13:01:03.060Z","avatar_url":"https://github.com/affise.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Affise Unity package\n\n[![telegram](https://badges.ws/badge/Affise%20channel-08c?icon=telegram)](https://t.me/AffiseChangelog)\n[![latest release](https://badges.ws/github/release/affise/affise-mmp-sdk-unity)]((https://github.com/affise/affise-mmp-sdk-unity/releases/latest))\n![license](https://badges.ws/github/l/affise/affise-mmp-sdk-unity)\n![repo size](https://badges.ws/github/repo-size/affise/affise-mmp-sdk-unity)\n![last commit](https://badges.ws/github/last-commit/affise/affise-mmp-sdk-unity)\n\n[![Change Log](https://badges.ws/badge/Change%20Log?icon=unity)](CHANGELOG.md)\n\n| Artifact      | Version               |\n|---------------|-----------------------|\n| `attribution` | [![latest release](https://badges.ws/github/release/affise/affise-mmp-sdk-unity)]((https://github.com/affise/affise-mmp-sdk-unity/releases/latest)) |\n\n- [Affise Unity package](#affise-unity-package)\n- [Description](#description)\n  - [Quick start](#quick-start)\n    - [SDK compatibility](#sdk-compatibility)\n  - [Integration](#integration)\n    - [Integrate unity package](#integrate-unity-package)\n    - [Integrate unitypackage file](#integrate-unitypackage-file)\n    - [Initialize](#initialize)\n      - [Unity asset](#unity-asset)\n        - [Domain](#domain)\n      - [Manual](#manual)\n        - [Initialization callbacks](#initialization-callbacks)\n        - [Domain](#domain-1)\n      - [Before application is published](#before-application-is-published)\n    - [Requirements](#requirements)\n      - [iOS](#ios)\n    - [Modules](#modules)\n      - [Android](#android)\n      - [iOS](#ios-1)\n      - [Installed active modules](#installed-active-modules)\n      - [Manual exclude modules](#manual-exclude-modules)\n      - [Module AdService](#module-adservice)\n      - [Module Advertising](#module-advertising)\n        - [iOS](#ios-2)\n      - [Module Huawei](#module-huawei)\n      - [Module AppsFlyer](#module-appsflyer)\n      - [Module Link](#module-link)\n      - [Module Meta](#module-meta)\n      - [Module Persistent](#module-persistent)\n      - [Module Status](#module-status)\n      - [Module Subscription](#module-subscription)\n      - [Module TikTok](#module-tiktok)\n    - [Persistent data](#persistent-data)\n    - [Reinstall tracking](#reinstall-tracking)\n  - [Build](#build)\n    - [iOS](#ios-3)\n- [Features](#features)\n  - [ProviderType identifiers collection](#providertype-identifiers-collection)\n    - [Attribution](#attribution)\n    - [AdService](#adservice)\n    - [Advertising](#advertising)\n    - [AndroidId](#androidid)\n    - [Huawei](#huawei)\n    - [Meta](#meta)\n    - [Network](#network)\n    - [Phone](#phone)\n  - [Event send control](#event-send-control)\n  - [Events tracking](#events-tracking)\n    - [Custom events tracking](#custom-events-tracking)\n  - [Predefined event parameters](#predefined-event-parameters)\n    - [PredefinedString](#predefinedstring)\n    - [PredefinedLong](#predefinedlong)\n    - [PredefinedFloat](#predefinedfloat)\n    - [PredefinedObject](#predefinedobject)\n    - [PredefinedListObject](#predefinedlistobject)\n    - [PredefinedListString](#predefinedliststring)\n  - [Events buffering](#events-buffering)\n  - [Advertising Identifier (google) tracking](#advertising-identifier-google-tracking)\n  - [Open Advertising Identifier (huawei) tracking](#open-advertising-identifier-huawei-tracking)\n  - [Push token tracking](#push-token-tracking)\n    - [Firebase Plugin](#firebase-plugin)\n  - [Links](#links)\n    - [Config](#config)\n    - [Deeplinks manual](#deeplinks-manual)\n      - [Android](#android-1)\n      - [iOS](#ios-4)\n    - [Applinks manual](#applinks-manual)\n      - [Android](#android-2)\n      - [iOS](#ios-5)\n    - [Get deferred deeplink](#get-deferred-deeplink)\n    - [Get deferred deeplink value](#get-deferred-deeplink-value)\n  - [Offline mode](#offline-mode)\n  - [Disable tracking](#disable-tracking)\n  - [Disable background tracking](#disable-background-tracking)\n  - [Get random user Id](#get-random-user-id)\n  - [Get Affice device Id](#get-affice-device-id)\n  - [Get providers](#get-providers)\n  - [Is first run](#is-first-run)\n  - [Get referrer](#get-referrer)\n  - [Get referrer value](#get-referrer-value)\n  - [Referrer keys](#referrer-keys)\n  - [Get module status](#get-module-status)\n  - [Platform specific](#platform-specific)\n    - [StoreKit Ad Network](#storekit-ad-network)\n- [SDK to SDK integrations](#sdk-to-sdk-integrations)\n- [Debug](#debug)\n  - [Validate credentials](#validate-credentials)\n  - [Version](#version)\n  - [Version native](#version-native)\n- [Troubleshoots](#troubleshoots)\n  - [iOS](#ios-6)\n  - [Android](#android-3)\n  - [Unity In-App Purchasing](#unity-in-app-purchasing)\n\n# Description\n\nAffise SDK is a software you can use to collect app usage statistics, device identifiers, deeplink usage, track install\nreferrer.\n\n## Quick start\n\n### SDK compatibility\n\n- `Xcode`   `14.2+`  \n- `iOS`     `12+`\n- `Android` `24+`\n\n## Integration\n\n### Integrate unity package\n\nOpen Package Manager(`Window / Package Manager`)\n\nAdd package from git url `https://github.com/affise/affise-mmp-sdk-unity.git`\n\n\u003cdiv align=center\u003e\n    \u003cimg src=\"https://github.com/affise/affise-mmp-sdk-unity/blob/assets/package_git.png?raw=true\" alt=\"package_manager\"\u003e\n\u003c/div\u003e\n\n### Integrate unitypackage file\n\nDownload latest Affise SDK [`attribution-1.7.6.unitypackage`](https://github.com/affise/affise-mmp-sdk-unity/releases/download/1.7.6/attribution-1.7.6.unitypackage)\nfrom [releases page](https://github.com/affise/affise-mmp-sdk-unity/releases) and drop this file to unity editor\n\n### Initialize\n\n#### Unity asset\n\nAfter package is added to unity project, initialize affise settings.\n\nOpen Project Settings(`Edit / Project Settings`)\n\nOn Affise tab click `Create` button.\n\n![affise_settings_new](https://github.com/affise/affise-mmp-sdk-unity/blob/assets/affise_settings_new.png?raw=true)\n\nThis will create `Affise Settings.asset` in `Assets / Affise / Resources` directory.\n\n\u003e [!NOTE] \n\u003e\n\u003e 🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦\n\u003e\n\u003e Settings set in `Edit / Project Settings / Affise` are marked as `Active Settings`\n\u003e\n\u003e Affise is using settings marked as `Active Settings`\n\u003e\n\u003e located in root of folder `Resources` which can be located in any folder\n\u003e\n\u003e Example `\u003cAny folder\u003e / Resources / \u003cYour affise settings\u003e.asset`\n\u003e\n\u003e 🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦🟦\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\u003e\n\u003e Settings located in `Editor` folder are **invalid**.\n\u003e\n\u003e Example: `Editor / Resources / \u003cYour affise settings\u003e.asset`\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\nFill all required fields\n\n![affise_settings](https://github.com/affise/affise-mmp-sdk-unity/blob/assets/affise_settings.png?raw=true)\n\n##### Domain\n\nSet SDK server domain:\n\n1. Open `Edit / Project Settings / Affise`\n2. Unfold `Optional` section at the bottom\n3. Fill `Domain` field\n\n#### Manual\n\n\u003e Demo app [AffiseDemo.cs](Samples~/AffiseDemoApp/Scripts/AffiseDemo.cs)\n\n```c#\nAffise\n    .Settings(\n        affiseAppId: \"Your appId\", //Change to your app id\n        secretKey: \"Your SDK secretKey\" //Change to your SDK secretKey\n    )\n    .Start(); // Start Affise SDK\n```\n\n##### Initialization callbacks\n\nCheck Affise library initialization\n\n```dart\nAffise\n    .Settings(\n        affiseAppId: \"Your appId\",\n        secretKey: \"Your SDK secretKey\"\n    )\n    .SetOnInitSuccess(() =\u003e {\n        Debug.Log(\"Affise: init success\");\n    })\n    .SetOnInitError((error) =\u003e {\n        Debug.Log($\"Affise: init error {error}\");\n    })\n    .Start(); // Start Affise SDK\n```\n\n##### Domain\n\nSet SDK server domain:\n\n```c#\nAffise\n    .Settings(\n        affiseAppId: \"Your appId\",\n        secretKey: \"Your SDK secretKey\"\n    )\n    .setDomain(\"https://YoureCustomDomain/\") // Set custom domain\n    .Start(); // Start Affise SDK\n```\n\n#### Before application is published\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Please make sure your credentials are valid\n\u003e\n\u003e Visit section [validation credentials](#validate-credentials)\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n### Requirements\n\n#### iOS\n\nAffise Advertising module uses `AppTrackingTransparency` framework to get `advertisingIdentifier`\nFor working functionality your app needs to declare [`NSUserTrackingUsageDescription` permission](https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription):\n\nKey `NSUserTrackingUsageDescription` value is set in `Edit / Project Settings / Affise / Modules`\n\nKey added automatically then module `Advertising` is selected\n\nDefault value is empty string \"\"\n\n### Modules\n\nOpen `Edit / Project Settings / Affise`\n\nOn `Modules` tab select all required\n\n![affise_modules](https://github.com/affise/affise-mmp-sdk-unity/blob/assets/affise_modules.png?raw=true)\n\n#### Android\n\nAll affise modules is updated automatically on build\n\n\u003e [!CAUTION]\n\u003e\n\u003e **No manual editing is required**\n\n| Module         | Version                                                                                                                                                                      |\n|----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `Advertising`  | [![module-advertising](https://img.shields.io/maven-central/v/com.affise/module-advertising?label=latest)](https://mvnrepository.com/artifact/com.affise/module-advertising) |\n| `AndroidId`    | [![module-androidid](https://img.shields.io/maven-central/v/com.affise/module-androidid?label=latest)](https://mvnrepository.com/artifact/com.affise/module-androidid)       |\n| `AppsFlyer`    | [![module-appsflyer](https://img.shields.io/maven-central/v/com.affise/module-appsflyer?label=latest)](https://mvnrepository.com/artifact/com.affise/module-appsflyer)       |\n| `Link`         | [![module-link](https://img.shields.io/maven-central/v/com.affise/module-link?label=latest)](https://mvnrepository.com/artifact/com.affise/module-link)                      |\n| `Network`      | [![module-network](https://img.shields.io/maven-central/v/com.affise/module-network?label=latest)](https://mvnrepository.com/artifact/com.affise/module-network)             |\n| `Phone`        | [![module-phone](https://img.shields.io/maven-central/v/com.affise/module-phone?label=latest)](https://mvnrepository.com/artifact/com.affise/module-phone)                   |\n| `Status`       | [![module-status](https://img.shields.io/maven-central/v/com.affise/module-status?label=latest)](https://mvnrepository.com/artifact/com.affise/module-status)                |\n| `Subscription` | [![module-status](https://img.shields.io/maven-central/v/com.affise/module-subscription?label=latest)](https://mvnrepository.com/artifact/com.affise/module-subscription)    |\n| `RuStore`      | [![module-rustore](https://img.shields.io/maven-central/v/com.affise/module-rustore?label=latest)](https://mvnrepository.com/artifact/com.affise/module-rustore)             |\n| `Huawei`       | [![module-huawei](https://img.shields.io/maven-central/v/com.affise/module-huawei?label=latest)](https://mvnrepository.com/artifact/com.affise/module-huawei)                |\n| `Meta`         | [![module-meta](https://img.shields.io/maven-central/v/com.affise/module-meta?label=latest)](https://mvnrepository.com/artifact/com.affise/module-meta)                      |\n| `TikTok`       | [![module-tiktok](https://img.shields.io/maven-central/v/com.affise/module-tiktok?label=latest)](https://mvnrepository.com/artifact/com.affise/module-tiktok)                |\n\nDependencies located in Android project gradle file `build.gradle`\n\n```gradle\nfinal affise_version = '1.7.6'\n\ndependencies {\n    // ...\n    // Affise modules\n    implementation \"com.affise:module-advertising:$affise_version\"\n    implementation \"com.affise:module-androidid:$affise_version\"\n    implementation \"com.affise:module-link:$affise_version\"\n    implementation \"com.affise:module-network:$affise_version\"\n    implementation \"com.affise:module-phone:$affise_version\"\n    implementation \"com.affise:module-status:$affise_version\"\n    implementation \"com.affise:module-subscription:$affise_version\"\n    implementation \"com.affise:module-meta:$affise_version\"\n    implementation \"com.affise:module-rustore:$affise_version\"\n    implementation \"com.affise:module-huawei:$affise_version\"\n    implementation \"com.affise:module-appsflyer:$affise_version\"\n    implementation \"com.affise:module-tiktok:$affise_version\"\n}\n```\n\n#### iOS\n\nAll affise modules is updated automatically on build\n\n\u003e [!CAUTION]\n\u003e\n\u003e **No manual editing is required**\n\n| Module         |                                       Version                                        |\n|----------------|:------------------------------------------------------------------------------------:|\n| `AdService`    | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n| `Advertising`  | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n| `AppsFlyer`    | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n| `Link`         | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n| `Persistent`   | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n| `Status`       | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n| `Subscription` | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n| `TikTok`       | [![latest](https://badges.ws/cocoapods/v/AffiseModule)](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) |\n\nDependencies located in XCode project folder `Podfile`\n\n```rb\nplatform :ios, '12.0'\n\ntarget 'UnityFramework' do\n  pod 'AffiseInternal', '1.7.6'\n\n  # Affise Modules\n  pod 'AffiseModule/AdService', '1.7.6'\n  pod 'AffiseModule/Advertising', '1.7.6'\n  pod 'AffiseModule/AppsFlyer', '1.7.6'\n  pod 'AffiseModule/Link', '1.7.6'\n  pod 'AffiseModule/Persistent', '1.7.6'\n  pod 'AffiseModule/Status', '1.7.6'\n  pod 'AffiseModule/Subscription', '1.7.6'\n  pod 'AffiseModule/TikTok', '1.7.6'\nend\n\ntarget 'Unity-iPhone' do\nend\n\nuse_frameworks! :linkage =\u003e :static\n```\n\n#### Installed active modules\n\nGet list of installed modules:\n\n```c#\nAffise.Module.GetModulesInstalled()\n```\n\n#### Manual exclude modules\n\nTo manually stop modules from starting use `Affise.Settings.SetDisableModules`:\n\n```c#\nAffise\n    .Settings(\n        affiseAppId: \"Your appId\", //Change to your app id\n        secretKey: \"Your SDK secretKey\", //Change to your SDK secretKey\n    )\n    .SetDisableModules(new List\u003cAffiseModules\u003e {\n        // Exclude modules from start\n        AffiseModules.Advertising,\n        AffiseModules.Persistent,\n        AffiseModules.Subscription,\n    })\n    .Start(); // Start Affise SDK\n```\n\n#### Module AdService\n\n`iOS 14.3+`\n\nSends `attributionToken` from `AdServices` framework `AAAttribution.attributionToken()` to Affise server\n\n#### Module Advertising\n\n##### iOS\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e `iOS` only\n\u003e \n\u003e Advertising Module starting **Manually**\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n```c#\nAffise.Module.Advertising.StartModule();\n```\n\nThis module required to Use [`IDFA`](https://developer.apple.com/documentation/adsupport/asidentifiermanager/advertisingidentifier) (Identifier for advertisers)\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Module Advertising requires `NSUserTrackingUsageDescription` key in `info.plist`\n\u003e\n\u003e Application **will crash** if key not present\n\u003e\n\u003e Key `NSUserTrackingUsageDescription` value is set in `Edit / Project Settings / Affise / Modules`\n\u003e\n\u003e Key added automatically then module `Advertising` is selected\n\u003e\n\u003e Default value is empty string \"\"\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\nOr Manual open `info.plist` and add key `NSUserTrackingUsageDescription` with string value. For more information [read requirements](#requirements)\n\n#### Module Huawei\n\n\u003e [!NOTE] \n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Use `Android` [Huawei Module](#modules) to get OAID (Open Advertising Identifier)\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n```c#\nvar providers = Affise.GetProviders();\nvar key = ProviderType.OAID;\nif (providers.ContainsKey(key)) {\n    var oaid = providers[key];\n}\n```\n\n#### Module AppsFlyer\n\nSend AppsFlyer event data to Affise\n\n[AppsFlyer In-App Events Docs](https://dev.appsflyer.com/hc/docs/inappevents#send-event)\n\n```C#\n//AppsFlyer event data\nconst string eventName = \"af_add_to_wishlist\";\nDictionary\u003cstring, string\u003e eventValues = new()\n{\n    {AFInAppEvents.PRICE, \"1234.56\"},\n    {AFInAppEvents.CONTENT_ID, \"1234567\"}\n};\n\n// Send AppsFlyer event\nAppsFlyer.sendEvent(eventName, eventValues);\n\n// Send AppsFlyer data to Affise\nAffise.Module.AppsFlyer.LogEvent(eventName, eventValues);\n```\n\nIs Module present:\n\n```C#\nAffise.Module.AppsFlyer.HasModule();\n```\n\n#### Module Link\n\nReturn last url in chan of redirection\n\n🟥Support MAX 10 redirections🟥\n\n```C#\nAffise.Module.Link.Resolve(\"SITE_WITH_REDIRECTION\", (redirectUrl) =\u003e {  \n    // handle redirect url\n});\n```\n\nIs Module present:\n\n```C#\nAffise.Module.Link.HasModule();\n```\n\n#### Module Meta\n\n- [Meta Install Referrer Docs](https://developers.facebook.com/docs/app-ads/meta-install-referrer)\n- [Google's Install Referral Docs](https://developer.android.com/google/play/installreferrer)\n\n1. Add `queries` to your `AndroidManifest.xml`\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cmanifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\u003e\n    \u003cqueries\u003e\n        \u003cpackage android:name=\"com.facebook.katana\" /\u003e\n        \u003cpackage android:name=\"com.instagram.android\" /\u003e\n        \u003cpackage android:name=\"com.facebook.lite\" /\u003e\n    \u003c/queries\u003e\n\n    \u003capplication\u003e\n      ...\n    \u003c/application\u003e\n\u003c/manifest\u003e\n```\n\n2. Add your `Facebook App Id` as config value `AffiseConfig.FB_APP_ID` in `Affise.settings`\n\n```c#\nAffise\n    .Settings(\n        affiseAppId: \"Your appId\", //Change to your app id\n        secretKey: \"Your SDK secretKey\", //Change to your SDK secretKey\n    )\n    .setConfigValue(AffiseConfig.FB_APP_ID, \"Your Facebook App Id\")\n    .Start(); // Start Affise SDK\n```\n\n#### Module Persistent\n\n`iOS Only`\n\n\u003e [!NOTE]\n\u003e \n\u003e Module requires user phone to be authenticated by Apple ID\n\u003e\n\u003e It uses Apple `Security` framework to store protected information in user account\n\nPersist `device id` value for [Get random device Id](#get-random-device-id) on application reinstall\n\n#### Module Status\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e If `getStatus` return an error or working more than 2 minutes\n\u003e\n\u003e Please see section [validation credentials](#validate-credentials)\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n```C#\nAffise.Module.GetStatus(AffiseModules.Status, response =\u003e {\n    // handle response\n});\n```\n\n#### Module Subscription\n\nGet products by ids:\n\n```C#\nvar ids = new List\u003cAffiseProduct\u003e {\n    \"exampple.product.id_1\", \n    \"exampple.product.id_2\",\n};\n\nAffise.Module.Subscription.FetchProducts(ids, (result) =\u003e\n{\n    if (result.IsSuccess)\n    {\n        var value = result.AsSuccess;\n        var products = value.Products;\n        var invalidIds = value.InvalidIds;\n    }\n    else\n    {\n        var error = result.AsFailure;\n    }\n});\n```\n\nPurchase product:\n\n```C#\n// Specify product type for correct affise event\nAffise.Module.Subscription.Purchase(product, AffiseProductType.CONSUMABLE, (result) =\u003e\n{\n    if (result.IsSuccess)\n    {\n        AffisePurchasedInfo purchasedInfo = result.AsSuccess;\n    }\n    else\n    {\n        var error = result.AsFailure;\n    }\n});\n```\n\nIs Module present:\n\n```C#\nAffise.Module.Subscription.HasModule();\n```\n\n#### Module TikTok\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Module TikTok requires [TikTok Business Unity SDK](https://github.com/tiktok/tiktok-business-unity-sdk)\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\nSend TikTok event data to Affise [TikTok Docs](https://business-api.tiktok.com/gateway/docs/index?identify_key=c0138ffadd90a955c1f0670a56fe348d1d40680b3c89461e09f78ed26785164b\u0026language=ENGLISH\u0026doc_id=1824036608950273#item-link-3.2.2%20Content%20parameters%20for%20standard%20events)\n\n```c#\nvar tiktokEvent = new TikTokAddToCartEvent(\"eventID\");\ntiktokEvent.SetDescription(\"Description of the product\");\ntiktokEvent.SetCurrency(TTCurrency.TTCurrencyUSD);\ntiktokEvent.SetValue(4.99);\ntiktokEvent.SetContentType(\"Type of the product\");\ntiktokEvent.SetContentId(\"ABC\");\n\nvar eventContent = new TikTokContentParams();\neventContent.price = 4.99;\neventContent.quantity = 1;\neventContent.brand = \"Brand of the product\";\neventContent.contentName = \"Name of the product\";\nTikTokContentParams[] contents = {eventContent};\n\ntiktokEvent.SetContents(contents);\n\n// Send TikTok event\nTikTokBusinessSDK.TrackTTEvent(cartEvent);\n\n// Prepare TikTok event data to Affise\nvar eventName = tiktokEvent.EventParams[\"eventName\"];\nvar eventId = tiktokEvent.EventParams[\"eventId\"];\nvar jsonString = tiktokEvent.EventParams[\"properties\"];\nvar properties = Utils.JsonToDictionary(jsonString);\n// Send TikTok event data to Affise\nAffise.Module.TikTok.SendEvent(eventName, properties, eventId);\n```\n\nIs Module present:\n\n```c#\nAffise.Module.TikTok.HasModule();\n```\n\n### Persistent data\n\nSome methods require to return **same data** on application reinstall\n\nIt is achieved by using [Affise Persistent Module](#module-persistent) for `iOS` and [Affise AndroidId Module](#modules) for `Android`\n\nSuch SDK methods are:\n\n- [Get Affice device Id](#get-affice-device-id)\n\nTo simulate multiple device install for testing purpose you can use one of two options:\n\n1. Disable module dependencies:\n\n- for `iOS` [Affise Persistent Module](#modules) \n- for `Android` [Affise AndroidId Module](#modules) \n\n2. Disable module programmatically:\n\n```c#\nAffise\n    .Settings(\n        affiseAppId: \"Your appId\",\n        secretKey: \"Your SDK secretKey\",\n    )\n    .SetDisableModules(new List\u003cAffiseModules\u003e {\n        AffiseModules.Persistent, // Disable module programmatically for iOS\n        AffiseModules.AndroidId, // Disable module programmatically for Android\n    })\n    .Start();\n```\n\n### Reinstall tracking\n\n\u003e [!NOTE]\n\u003e\n\u003e Read more about [Persistent data](#persistent-data)\n\nThere are two working mode for [Affice device Id](#get-affice-device-id):\n\n1. Return persistent value on each reinstall\n2. Return new value on each reinstall\n\nFirst mode require:\n\n- Enabling [Affise Persistent Module](#modules) for `iOS`\n- Enabling [Affise AndroidId Module](#modules) for `Android`\n\nEven after deleting application [Affice device Id](#get-affice-device-id) will be preserved and will restore on next installation\n\nSecond mode is convenient for testing.\nBy [disabling module in UI](#modules), [disabling module programmatically](#manual-exclude-modules) or removing dependency, a new [Affice device Id](#get-affice-device-id) will be generated for each **new** installation.\n\n## Build\n\n### iOS\n\nSDK is using Cocoapods\n\n1. In `Build setting` select iOS platform and press `Build`\n2. Select build folder (unity will exported iOS project to build folder)\n3. Build folder should contain `Podfile`\n4. In Terminal open build folder and run commend `pod install`\n5. Open generated `*.worksapce` to build your unity project\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\u003e\n\u003e If command `pod install` returns error `CocoaPods could not find compatible versions for pod \"AffiseInternal\"`\n\u003e\n\u003e Run `pod repo update` and then run `pod install` again\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\nIf Podfile hasn't generated you can create it manually using this [Podfile](Editor/Resources/iOS/AffisePodfile.rb) as template\n\nPodfile:\n\n```rb\nplatform :ios, '11.0'\n\ntarget 'UnityFramework' do\n  pod 'AffiseInternal', '1.7.6'\n\n  # Affise Modules\n  # pod 'AffiseModule', `1.7.6`\nend\n\ntarget 'Unity-iPhone' do\nend\n\nuse_frameworks! :linkage =\u003e :static\n```\n\n# Features\n\n## ProviderType identifiers collection\n\nTo match users with events and data library is sending, these `ProviderType` identifiers are collected:\n\n### Attribution\n\n- `AFFISE_APP_ID`\n- `AFFISE_PKG_APP_NAME`\n- `AFF_APP_NAME_DASHBOARD`\n- `APP_VERSION`\n- `APP_VERSION_RAW`\n- `STORE`\n- `TRACKER_TOKEN`\n- `TRACKER_NAME`\n- `FIRST_TRACKER_TOKEN`\n- `FIRST_TRACKER_NAME`\n- `LAST_TRACKER_TOKEN`\n- `LAST_TRACKER_NAME`\n- `OUTDATED_TRACKER_TOKEN`\n- `INSTALLED_TIME`\n- `FIRST_OPEN_TIME`\n- `INSTALLED_HOUR`\n- `FIRST_OPEN_HOUR`\n- `INSTALL_FIRST_EVENT`\n- `INSTALL_BEGIN_TIME`\n- `INSTALL_FINISH_TIME`\n- `REFERRER_INSTALL_VERSION`\n- `REFERRAL_TIME`\n- `REFERRER_CLICK_TIME`\n- `REFERRER_CLICK_TIME_SERVER`\n- `REFERRER_GOOGLE_PLAY_INSTANT`\n- `CREATED_TIME`\n- `CREATED_TIME_MILLI`\n- `CREATED_TIME_HOUR`\n- `UNINSTALL_TIME`\n- `REINSTALL_TIME`\n- `LAST_SESSION_TIME`\n- `CPU_TYPE`\n- `HARDWARE_NAME`\n- `DEVICE_MANUFACTURER`\n- `DEEPLINK_CLICK`\n- `DEVICE_ATLAS_ID`\n- `AFFISE_DEVICE_ID`\n- `AFFISE_ALT_DEVICE_ID`\n- `REFTOKEN`\n- `REFTOKENS`\n- `REFERRER`\n- `REFERRER_UPDATED`\n- `USER_AGENT`\n- `MCCODE`\n- `MNCODE`\n- `REGION`\n- `COUNTRY`\n- `LANGUAGE`\n- `DEVICE_NAME`\n- `DEVICE_TYPE`\n- `OS_NAME`\n- `PLATFORM`\n- `SDK_PLATFORM`\n- `API_LEVEL_OS`\n- `AFFISE_SDK_VERSION`\n- `OS_VERSION`\n- `RANDOM_USER_ID`\n- `AFFISE_SDK_POS`\n- `TIMEZONE_DEV`\n- `AFFISE_EVENT_NAME`\n- `AFFISE_EVENT_TOKEN`\n- `LAST_TIME_SESSION`\n- `TIME_SESSION`\n- `AFFISE_SESSION_COUNT`\n- `LIFETIME_SESSION_COUNT`\n- `AFFISE_DEEPLINK`\n- `AFFISE_PART_PARAM_NAME`\n- `AFFISE_PART_PARAM_NAME_TOKEN`\n- `AFFISE_APP_TOKEN`\n- `LABEL`\n- `AFFISE_SDK_SECRET_ID`\n- `UUID`\n- `AFFISE_APP_OPENED`\n- `PUSHTOKEN`\n- `PUSHTOKEN_SERVICE`\n- `AFFISE_EVENTS_COUNT`\n- `AFFISE_SDK_EVENTS_COUNT`\n- `AFFISE_METRICS_EVENTS_COUNT`\n- `AFFISE_INTERNAL_EVENTS_COUNT`\n- `IS_ROOTED`\n- `IS_EMULATOR`\n\n### AdService\n\n- `AD_SERVICE_ATTRIBUTION`\n\n### Advertising\n\n- `GAID_ADID`\n- `GAID_ADID_MD5`\n- `ADID`\n- `ALTSTR_ADID`\n- `FIREOS_ADID`\n- `COLOROS_ADID`\n\n### AndroidId\n\n- `ANDROID_ID`\n- `ANDROID_ID_MD5`\n\n### Huawei\n\n- `OAID`\n- `OAID_MD5`\n\n### Meta\n\n- `META`\n\n### Network\n\n- `MAC_SHA1`\n- `MAC_MD5`\n- `CONNECTION_TYPE`\n- `PROXY_IP_ADDRESS`\n\n### Phone\n\n- `NETWORK_TYPE`\n- `ISP`\n\n## Event send control\n\nThere are two ways to send events\n\n1. Cache event to later scheduled send in batch\n\n```c#\nAddToCartEvent()\n    .Send();\n```\n\n2. Send event right now\n\n```c#\nAddToCartEvent()\n    .SendNow(() =\u003e\n        {\n            // handle event send success\n        }, (errorResponse) =\u003e\n        {\n            // handle event send failed\n            // 🟥Warning:🟥 event is NOT cached for later send\n        }\n    );\n```\n\n## Events tracking\n\nFor example, we want to track achievements. To send event first create it with\nfollowing code\n\n```c#\nclass Presenter {\n    void OnUnlockAchievement()\n    {\n        var achievement =  new JSONObject\n        {\n            [\"achievement\"] = \"new level\",\n        };\n\n        new UnlockAchievementEvent(\"best damage\")\n            .AddPredefinedParameter(PredefinedLong.USER_SCORE, 12552L)\n            .AddPredefinedParameter(PredefinedString.ACHIEVEMENT_ID, \"1334-1225-ASDZ\")\n            .AddPredefinedParameter(PredefinedObject.CONTENT, achievement)\n            .Send();\n    }\n}\n```\n\nWith above example you can implement other events:\n\n- `AchieveLevel`\n- `AddPaymentInfo`\n- `AddToCart`\n- `AddToWishlist`\n- `AdRevenue`\n- `ClickAdv`\n- `CompleteRegistration`\n- `CompleteStream`\n- `CompleteTrial`\n- `CompleteTutorial`\n- `Contact`\n- `ContentItemsView`\n- `CustomizeProduct`\n- `DeepLinked`\n- `Donate`\n- `FindLocation`\n- `InitiateCheckout`\n- `InitiatePurchase`\n- `InitiateStream`\n- `Invite`\n- `LastAttributedTouch`\n- `Lead`\n- `ListView`\n- `Login`\n- `OpenedFromPushNotification`\n- `Order`\n- `OrderItemAdded`\n- `OrderItemRemove`\n- `OrderCancel`\n- `OrderReturnRequest`\n- `OrderReturnRequestCancel`\n- `Purchase`\n- `Rate`\n- `ReEngage`\n- `Reserve`\n- `Sales`\n- `Schedule`\n- `Search`\n- `Share`\n- `SpendCredits`\n- `StartRegistration`\n- `StartTrial`\n- `StartTutorial`\n- `SubmitApplication`\n- `Subscribe`\n- `TravelBooking`\n- `UnlockAchievement`\n- `Unsubscribe`\n- `Update`\n- `ViewAdv`\n- `ViewCart`\n- `ViewContent`\n- `ViewItem`\n- `ViewItems`\n- `InitialSubscription`\n- `InitialTrial`\n- `InitialOffer`\n- `ConvertedTrial`\n- `ConvertedOffer`\n- `TrialInRetry`\n- `OfferInRetry`\n- `SubscriptionInRetry`\n- `RenewedSubscription`\n- `FailedSubscriptionFromRetry`\n- `FailedOfferFromRetry`\n- `FailedTrialFromRetry`\n- `FailedSubscription`\n- `FailedOfferise`\n- `FailedTrial`\n- `ReactivatedSubscription`\n- `RenewedSubscriptionFromRetry`\n- `ConvertedOfferFromRetry`\n- `ConvertedTrialFromRetry`\n- `Unsubscription`\n\n### Custom events tracking\n\nUse any of custom events if default doesn't fit your scenario:\n\n- `CustomId01Event`\n- `CustomId02Event`\n- `CustomId03Event`\n- `CustomId04Event`\n- `CustomId05Event`\n- `CustomId06Event`\n- `CustomId07Event`\n- `CustomId08Event`\n- `CustomId09Event`\n- `CustomId10Event`\n\nIf above event functionality still limits your usecase, you can use `UserCustomEvent`\n\n```c#\nnew UserCustomEvent(eventName: \"MyCustomEvent\")\n    .Send();  \n```\n\n## Predefined event parameters\n\nTo enrich your event with another dimension, you can use predefined parameters for most common cases.\nAdd it to any event:\n\n```c#\nclass Presenter {\n    void OnUnlockAchievement()\n    {\n        var achievement = new JSONObject\n        {\n            [\"achievement\"] = \"new level\",\n        };\n        \n        new UnlockAchievementEvent(\n            userData: \"best damage\"\n        )\n            .AddPredefinedParameter(PredefinedString.DESCRIPTION, \"best damage\")\n            .AddPredefinedParameter(PredefinedObject.CONTENT, achievement)\n            .Send();\n    }\n}\n```\n\nIn examples above `PredefinedParameters.DESCRIPTION` and `PredefinedObject.CONTENT` is used, but many others is available:\n\n| PredefinedParameter                           | Type                   |\n|-----------------------------------------------|------------------------|\n| [PredefinedString](#predefinedstring)         | string                 |\n| [PredefinedLong](#predefinedlong)             | long                   |\n| [PredefinedFloat](#predefinedfloat)           | float                  |\n| [PredefinedObject](#predefinedobject)         | JSONObject             |\n| [PredefinedListObject](#predefinedlistobject) | List\u0026lt;JSONObject\u0026gt; |\n| [PredefinedListString](#predefinedliststring) | List\u0026lt;string\u0026gt;     |\n\n### PredefinedString\n\n- `ACHIEVEMENT_ID`\n- `ADREV_AD_TYPE`\n- `BRAND`\n- `BRICK`\n- `CAMPAIGN_ID`\n- `CATALOGUE_ID`\n- `CHANNEL_TYPE`\n- `CITY`\n- `CLASS`\n- `CLICK_ID`\n- `CONTENT_ID`\n- `CONTENT_NAME`\n- `CONTENT_TYPE`\n- `CONVERSION_ID`\n- `COUNTRY`\n- `COUPON_CODE`\n- `CURRENCY`\n- `CUSTOMER_SEGMENT`\n- `CUSTOMER_TYPE`\n- `CUSTOMER_USER_ID`\n- `DEEP_LINK`\n- `DESCRIPTION`\n- `DESTINATION_A`\n- `DESTINATION_B`\n- `DESTINATION_LIST`\n- `EVENT_NAME`\n- `NEW_VERSION`\n- `OLD_VERSION`\n- `ORDER_ID`\n- `PARAM_01`\n- `PARAM_02`\n- `PARAM_03`\n- `PARAM_04`\n- `PARAM_05`\n- `PARAM_06`\n- `PARAM_07`\n- `PARAM_08`\n- `PARAM_09`\n- `PARAM_10`\n- `PAYMENT_INFO_AVAILABLE`\n- `PID`\n- `PREFERRED_NEIGHBORHOODS`\n- `PRODUCT_ID`\n- `PRODUCT_NAME`\n- `PURCHASE_CURRENCY`\n- `RECEIPT_ID`\n- `REGION`\n- `REGISTRATION_METHOD`\n- `REVIEW_TEXT`\n- `SEARCH_STRING`\n- `SEGMENT`\n- `STATUS`\n- `SUBSCRIPTION_ID`\n- `SUCCESS`\n- `SUGGESTED_DESTINATIONS`\n- `SUGGESTED_HOTELS`\n- `TUTORIAL_ID`\n- `UTM_CAMPAIGN`\n- `UTM_MEDIUM`\n- `UTM_SOURCE`\n- `VALIDATED`\n- `VERTICAL`\n- `VIRTUAL_CURRENCY_NAME`\n- `VOUCHER_CODE`\n\n### PredefinedLong\n\n- `AMOUNT`\n- `DATE_A`\n- `DATE_B`\n- `DEPARTING_ARRIVAL_DATE`\n- `DEPARTING_DEPARTURE_DATE`\n- `HOTEL_SCORE`\n- `LEVEL`\n- `MAX_RATING_VALUE`\n- `NUM_ADULTS`\n- `NUM_CHILDREN`\n- `NUM_INFANTS`\n- `PREFERRED_NUM_STOPS`\n- `PREFERRED_STAR_RATINGS`\n- `QUANTITY`\n- `RATING_VALUE`\n- `RETURNING_ARRIVAL_DATE`\n- `RETURNING_DEPARTURE_DATE`\n- `SCORE`\n- `TRAVEL_START`\n- `TRAVEL_END`\n- `USER_SCORE`\n- `EVENT_START`\n- `EVENT_END`\n\n### PredefinedFloat\n\n- `PREFERRED_PRICE_RANGE`\n- `PRICE`\n- `REVENUE`\n- `LAT`\n- `LONG`\n\n### PredefinedObject\n\n- `CONTENT`\n\n### PredefinedListObject\n\n- `CONTENT_LIST`\n\n### PredefinedListString\n\n- `CONTENT_IDS`\n\n## Events buffering\n\nAffise library will send any pending events with first opportunity,\nbut if there is no network connection or device is disabled, events are kept locally for 7 days before deletion.\n\n## Advertising Identifier (google) tracking\n\n\u003e [!NOTE] \n\u003e\n\u003e `Android` only\n\u003e\n\u003e Requires [Affise Advertising Module](#modules)\n\nAdvertising Identifier (google) tracking is supported automatically, no actions needed\n\n## Open Advertising Identifier (huawei) tracking\n\n\u003e [!NOTE] \n\u003e\n\u003e `Android` only\n\u003e\n\u003e Requires [Affise Huawei Module](#modules)\n\nOpen Advertising Identifier is supported automatically, no actions needed\n\n## Push token tracking\n\nTo let affise track push token you need to receive it from your push service provider, and pass to Affise library.\n\n```c#\nAffise.AddPushToken(token, PushTokenService.FIREBASE);\n```\n\nSupported service providers:\n\n- `APPLE` - **iOS only**\n- `FIREBASE`\n\n### Firebase Plugin\n\n[Add Firebase to your Unity project](https://firebase.google.com/docs/unity/setup)\n\n[Retrieve ID tokens on clients](https://firebase.google.com/docs/auth/admin/verify-id-tokens#unity)\n\n```c#\nFirebase.Auth.FirebaseUser user = Firebase.Auth.FirebaseAuth.DefaultInstance.CurrentUser;\n\nuser.TokenAsync(true).ContinueWith(task =\u003e {\n    if (task.IsCanceled) {\n        Debug.LogError(\"TokenAsync was canceled.\");\n        return;\n    }\n\n    if (task.IsFaulted) {\n        Debug.LogError(\"TokenAsync encountered an error: \" + task.Exception);\n        return;\n    }\n\n    string idToken = task.Result;\n\n    Affise.AddPushToken(idToken, PushTokenService.FIREBASE);\n});\n```\n\n## Links\n\n- Register deeplink callback right after `Affise.Settings(affiseAppId,secretKey).Start()`\n\n```c#\nAffise.RegisterDeeplinkCallback((value) =\u003e\n{ \n    // full uri \"scheme://host/path?parameters\"\n    var deeplink = value.Deeplink;\n\n    // separated for convenience\n    var scheme = value.Scheme;\n    var host = value.Host;\n    var path = value.Path;\n    var queryParametersMap = value.Parameters;\n\n    if(queryParametersMap[\"\u003cyour_uri_key\u003e\"]?.Contains(\"\u003cyour_uri_key_value\u003e\") == true) {\n      // handle value\n    }\n});\n```\n\nTest Android DeepLink via terminal command:\n\n```terminal\nadb shell am start -a android.intent.action.VIEW -d \"YOUR_SCHEME://YOUR_DOMAIN/somepath?param=1\\\u0026list=some\\\u0026list=other\\\u0026list=\"\n```\n\nTest iOS DeepLink via terminal command:\n\n```terminal\nxcrun simctl openurl booted \"YOUR_SCHEME://YOUR_DOMAIN/somepath?param=1\u0026list=some\u0026list=other\u0026list=1\"\n```\n\n### Config\n\nOpen `Edit / Project Settings / Affise`\n\nOn `Settings` tab add links\n\n![affise_deeplinks](https://github.com/affise/affise-mmp-sdk-unity/blob/assets/affise_deeplinks.png?raw=true)\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\u003e\n\u003e For Android deeplink remove is manual\n\u003e\n\u003e Open Android project and remove deeplink `intent-filter` from `AndroidManifest.xml`\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\n### Deeplinks manual\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Deeplinks support only **CUSTOM** scheme **NOT** `http` or `https`\n\u003e\n\u003e For `http` or `https` read how to setup [AppLinks](#config-applink-manual)\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n#### Android\n\nTo integrate deeplink support in android you need:\n\n- Add intent filter to `AndroidManifest.xml`. For more info read [Unity docs](https://docs.unity3d.com/Manual/android-manifest.html)\n\n- Add **custom** scheme (**NOT** `http` or `https`) and host to filter\n\nExample: `YOUR_SCHEME://YOUR_DOMAIN`\n\nExample: `myapp://mydomain.com`\n\n```xml\n\u003cintent-filter android:autoVerify=\"true\"\u003e\n    \u003caction android:name=\"android.intent.action.VIEW\" /\u003e\n    \n    \u003ccategory android:name=\"android.intent.category.DEFAULT\" /\u003e\n    \u003ccategory android:name=\"android.intent.category.BROWSABLE\" /\u003e\n    \n    \u003cdata\n        android:host=\"YOUR_DOMAIN\"\n        android:scheme=\"YOUR_SCHEME\" /\u003e\n\u003c/intent-filter\u003e\n```\n\n#### iOS\n\nTo integrate deeplink support in iOS you need:\n\nAdd key `CFBundleURLTypes` to `Info.plist` file in Xcode project folder\n\nExample: `YOUR_SCHEME://YOUR_DOMAIN`\n\nExample: `myapp://mydomain.com`\n\n```xml\n\u003ckey\u003eCFBundleURLTypes\u003c/key\u003e\n\u003carray\u003e\n    \u003cdict\u003e\n        \u003ckey\u003eCFBundleTypeRole\u003c/key\u003e\n        \u003cstring\u003eEditor\u003c/string\u003e\n        \u003ckey\u003eCFBundleURLName\u003c/key\u003e\n        \u003cstring\u003eYOUR_DOMAIN\u003c/string\u003e\n        \u003ckey\u003eCFBundleURLSchemes\u003c/key\u003e\n        \u003carray\u003e\n            \u003cstring\u003eYOUR_SCHEME\u003c/string\u003e\n        \u003c/array\u003e\n    \u003c/dict\u003e\n\u003c/array\u003e\n```\n\n### Applinks manual\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e You must owne website domain.\n\u003e\n\u003e And has ability to add file `https://yoursite/.well-known/apple-app-site-association` for iOS support\n\u003e\n\u003e And has ability to add file `https://yoursite/.well-known/assetlinks.json` for Android support\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n#### Android\n\nTo integrate applink support in android you need:\n\n- Add intent filter to `AndroidManifest.xml`. For more info read [Unity docs](https://docs.unity3d.com/Manual/android-manifest.html)\n\n- Add `https` or `http` scheme and host to filter\n\nExample: `https://YOUR_DOMAIN`\n\nExample: `https://mydomain.com`\n\n```xml\n\u003cintent-filter android:autoVerify=\"true\"\u003e\n    \u003caction android:name=\"android.intent.action.VIEW\" /\u003e\n    \n    \u003ccategory android:name=\"android.intent.category.DEFAULT\" /\u003e\n    \u003ccategory android:name=\"android.intent.category.BROWSABLE\" /\u003e\n    \n    \u003cdata\n        android:host=\"YOUR_DOMAIN\"\n        android:scheme=\"https\" /\u003e\n\u003c/intent-filter\u003e\n```\n\n- Associate your app with your website. [Read Google instructions](https://developer.android.com/studio/write/app-link-indexing#associatesite) \u003cdetails\u003e\n  \u003csummary\u003eHow To Associate your app with your website\u003c/summary\u003e\n\n  ---\n\n  After setting up URL support for your app, the App Links Assistant generates a Digital Assets Links file you can use to [associate your website with your app](https://developer.android.com/training/app-links/verify-android-applinks#web-assoc).\n\n  As an alternative to using the Digital Asset Links file, you can [associate your site and app in Search Console](https://support.google.com/webmasters/answer/6212023).\n\n  If you're using [Play App Signing](https://support.google.com/googleplay/android-developer/answer/9842756) for your app, then the certificate fingerprint produced by the App Links Assistant usually doesn't match the one on users' devices. In this case, you can find the correct Digital Asset Links JSON snippet for your app in your [Play Console](https://play.google.com/console/) developer account under **Release** \u003e **Setup** \u003e **App signing**.\n\n  To associate your app and your website using the App Links Assistant, click **Open Digital Asset Links File Generator** from the App Links Assistant and follow these steps:\n\n  ![app-links-assistant-dal-file-generator_2x](https://developer.android.com/static/studio/images/write/app-links-assistant-dal-file-generator_2x.png)\n  **Figure 2**. Enter details about your site and app to generate a Digital Asset Links file.\n\n  1. Enter your **Site domain** and your [**Application ID**](https://developer.android.com/studio/build/configure-app-module#set-application-id).\n\n  2. To include support in your Digital Asset Links file for [One Tap sign-in](https://developers.google.com/identity/one-tap/android/overview), select **Support sharing credentials between the app and the website** and enter your site's sign-in URL.This adds the following string to your Digital Asset Links file declaring that your app and website share sign-in credentials: `delegate_permission/common.get_login_creds`.\n\n  3. Specify the [signing config](https://developer.android.com/studio/publish/app-signing#sign-auto) or select a [keystore file](https://developer.android.com/studio/publish/app-signing#certificates-keystores).\n\n  Make sure you select the right release config or keystore file for the release build or the debug config or keystore file for the debug build of your app. If you want to set up your production build, use the release config. If you want to test your build, use the debug config.\n\n  4. Click **Generate Digital Asset Links file**.\n  5. Once Android Studio generates the file, click **Save file** to download it.\n  6. Upload the `assetlinks.json` file to your site, with read access for everyone, at `https://yoursite/.well-known/assetlinks.json`.\n\n  \u003e [!IMPORTANT]\n  \u003e\n  \u003e The system verifies the Digital Asset Links file via the encrypted HTTPS protocol. Make sure that the **assetlinks.json** file is accessible over an HTTPS connection, regardless of whether your app's intent filter includes **https**.\n\n  7. Click **Link and Verify** to confirm that you've uploaded the correct Digital Asset Links file to the correct location.\n\n  Learn more about associating your website with your app through the Digital Asset Links file in Declare website associations.\n\n  ---\n\n\u003c/details\u003e\n\n#### iOS\n\nTo integrate applink support in iOS you need:\n\n- Follow how to set up applink in the [official documentation](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app).\n\n- Associate your app with your website. [Supporting associated domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains)\n\n- [Configuring an associated domain](https://developer.apple.com/documentation/xcode/configuring-an-associated-domain/)\n\n- Add key `com.apple.developer.associated-domains` to `Info.plist`\n\nExample: `https://YOUR_DOMAIN`\n\nExample: `https://mydomain.com`\n\n```xml\n\u003ckey\u003ecom.apple.developer.associated-domains\u003c/key\u003e\n\u003carray\u003e\n    \u003cstring\u003eapplinks:YOUR_DOMAIN\u003c/string\u003e\n\u003c/array\u003e\n```\n\n### Get deferred deeplink\n\n\u003e [!NOTE] \n\u003e\n\u003e Requires [`Affise Status Module`](#modules)\n\nUse the next public method of SDK to get deferred deeplink from server\n\n```C#\nAffise.GetDeferredDeeplink(deferredDeeplink =\u003e {\n    // handle deferred deeplink\n});\n```\n\n### Get deferred deeplink value\n\n\u003e [!NOTE] \n\u003e\n\u003e Requires [`Affise Status Module`](#modules)\n\nUse the next public method of SDK to get deferred deeplink value from server\n\n```C#\nAffise.GetReferrerOnServerValue(ReferrerKey.CLICK_ID, deferredDeeplinkValue =\u003e {\n    // handle deferred deeplink value\n});\n```\n\n## Offline mode\n\nIn some scenarios you would want to limit Affise network usage, to pause that activity call anywhere in your application following code after Affise start:\n\n```c#\nAffise.SetOfflineModeEnabled(true) // to enable offline mode\nAffise.SetOfflineModeEnabled(false) // to disable offline mode\n```\n\nWhile offline mode is enabled, your metrics and other events are kept locally, and will be delivered once offline mode is disabled.\nOffline mode is persistent as Application lifecycle, and will be disabled with process termination automatically.\nTo check current offline mode status call:\n\n```c#\nAffise.IsOfflineModeEnabled() // returns true or false describing current tracking state\n```\n\n## Disable tracking\n\nTo disable any tracking activity, storing events and gathering device identifiers and metrics call anywhere in your application following code after Affise start:\n\n```c#\nAffise.SetTrackingEnabled(true) // to enable tracking\nAffise.SetTrackingEnabled(false) // to disable tracking\n```\n\nBy default tracking is enabled.\n\nWhile tracking mode is disabled, metrics and other identifiers is not generated locally.\nKeep in mind that this flag is persistent until app reinstall, and don't forget to reactivate tracking when needed.\nTo check current status of tracking call:\n\n```c#\nAffise.IsTrackingEnabled() // returns true or false describing current tracking state\n```\n\n## Disable background tracking\n\nTo disable any background tracking activity, storing events and gathering device identifiers and metrics call anywhere in your application following code after Affise start:\n\n```c#\nAffise.SetBackgroundTrackingEnabled(true) // to enable background tracking\nAffise.SetBackgroundTrackingEnabled(false) // to disable background tracking\n```\n\nBy default background tracking is enabled.\n\nWhile background tracking mode is disabled, metrics and other identifiers is not generated locally.\nBackground tracking mode is persistent as Application lifecycle, and will be re-enabled with process termination automatically.\nTo check current status of background tracking call:\n\n```c#\nAffise.IsBackgroundTrackingEnabled() // returns true or false describing current background tracking state\n```\n\n## Get random user Id\n\n```c#\nAffise.GetRandomUserId();\n```\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Return `11111111-1111-1111-1111-111111111111` if **Affise SDK not initialized**\n\u003e \n\u003e Return `22222222-2222-2222-2222-222222222222` if **no valid methods** to retrieve id **for current device**\n\u003e\n\u003e `AffiseError.UUID_NOT_INITIALIZED` == `11111111-1111-1111-1111-111111111111`\n\u003e\n\u003e `AffiseError.UUID_NO_VALID_METHOD` == `22222222-2222-2222-2222-222222222222`\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n## Get Affice device Id\n\n\u003e [!NOTE] \n\u003e\n\u003e To make `device id` more persistent on application reinstall\n\u003e\n\u003e use [Affise `Persistent` Module](#module-persistent) for `iOS`\n\u003e\n\u003e use [Affise `AndroidId` Module](#modules) for `Android`\n\n\u003e [!NOTE]\n\u003e\n\u003e Read more about [Persistent data](#persistent-data) and [Reinstall tracking](#reinstall-tracking)\n\n```c#\nAffise.GetRandomDeviceId();\n```\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Return `11111111-1111-1111-1111-111111111111` if **Affise SDK not initialized**\n\u003e \n\u003e Return `22222222-2222-2222-2222-222222222222` if **no valid methods** to retrieve id **for current device**\n\u003e \n\u003e `AffiseError.UUID_NOT_INITIALIZED` == `11111111-1111-1111-1111-111111111111`\n\u003e \n\u003e `AffiseError.UUID_NO_VALID_METHOD` == `22222222-2222-2222-2222-222222222222`\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n## Get providers\n\nReturns providers map with [ProviderType](#providertype-identifiers-collection) as key\n\n```c#\nvar providers = Affise.GetProviders();\nvar key = ProviderType.AFFISE_APP_TOKEN;\nif (providers.ContainsKey(key)) {\n    var value = providers[key];\n}\n```\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Return **Empty Map** if **Affise SDK not initialized**\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n## Is first run\n\n```c#\nAffise.IsFirstRun();\n```\n\n## Get referrer\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\u003e\n\u003e Don't call this method directly in `Awake()` it may cause `NullReferenceException`\n\u003e\n\u003e 🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n\nUse the next public method of SDK to get referrer\n\n\u003e To get Install referrer by installing from `Android` `RuStore` include module [`RuStore`](#modules)\n\n\u003e To get Install referrer by installing from `Android` `AppGallery` include module [`Huawei`](#modules)\n\n```C#\nAffise.GetReferrerUrl(referrer =\u003e {\n    // handle referrer\n});\n```\n\n## Get referrer value\n\nUse the next public method of SDK to get referrer value by\n\n\u003e To get Install referrer by installing from `Android` `RuStore` include module [`RuStore`](#modules)\n\n\u003e To get Install referrer by installing from `Android` `AppGallery` include module [`Huawei`](#modules)\n\n```C#\nAffise.GetReferrerUrlValue(ReferrerKey.CLICK_ID, referrer =\u003e {\n    // handle referrer value\n});\n```\n\n## Referrer keys\n\nIn examples above `ReferrerKey.CLICK_ID` is used, but many others is available:\n\n- `AD_ID`\n- `CAMPAIGN_ID`\n- `CLICK_ID`\n- `AFFISE_AD`\n- `AFFISE_AD_ID`\n- `AFFISE_AD_TYPE`\n- `AFFISE_ADSET`\n- `AFFISE_ADSET_ID`\n- `AFFISE_AFFC_ID`\n- `AFFISE_CHANNEL`\n- `AFFISE_CLICK_LOOK_BACK`\n- `AFFISE_COST_CURRENCY`\n- `AFFISE_COST_MODEL`\n- `AFFISE_COST_VALUE`\n- `AFFISE_DEEPLINK`\n- `AFFISE_KEYWORDS`\n- `AFFISE_MEDIA_TYPE`\n- `AFFISE_MODEL`\n- `AFFISE_OS`\n- `AFFISE_PARTNER`\n- `AFFISE_REF`\n- `AFFISE_SITE_ID`\n- `AFFISE_SUB_SITE_ID`\n- `AFFISE_SUB_1`\n- `AFFISE_SUB_2`\n- `AFFISE_SUB_3`\n- `AFFISE_SUB_4`\n- `AFFISE_SUB_5`\n- `AFFC`\n- `PID`\n- `SUB_1`\n- `SUB_2`\n- `SUB_3`\n- `SUB_4`\n- `SUB_5`\n\n## Get module status\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Required [Module Status](#module-status)\n\u003e \n\u003e If `getStatus` return an error or working more than 2 minutes\n\u003e\n\u003e Please see section [validation credentials](#validate-credentials)\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n```C#\nAffise.Module.GetStatus(AffiseModules.Status, response =\u003e {\n    // handle response\n});\n```\n\n## Platform specific\n\n### StoreKit Ad Network\n\n\u003e `iOS Only`\n\nFor ios prior `16.1` first call\n\n```C#\nAffise.IOS.RegisterAppForAdNetworkAttribution(error =\u003e\n{\n    // Handle error\n});\n```\n\nUpdates the fine and coarse conversion values, and calls a completion handler if the update fails.\nSecond argument coarseValue is available in iOS 16.1+\n\n```C#\nAffise.IOS.UpdatePostbackConversionValue(1, SKAdNetwork.CoarseConversionValue.Medium, error =\u003e\n{\n    // Handle error\n});\n```\n\nConfigure your app to send postback copies to Affise:\n\nAdd key `NSAdvertisingAttributionReportEndpoint` to project `Info.plist`\nSet key value to `https://affise-skadnetwork.com/`\n\n```xml\n\u003ckey\u003eCFBundleURLTypes\u003c/key\u003e\n\u003carray\u003e\n    \u003cdict\u003e\n      \u003ckey\u003eNSAdvertisingAttributionReportEndpoint\u003c/key\u003e\n      \u003cstring\u003ehttps://affise-skadnetwork.com/\u003c/string\u003e\n    \u003c/dict\u003e\n\u003c/array\u003e\n```\n\n# SDK to SDK integrations\n\n```c#\n// Send AdRevenue info\nnew AffiseAdRevenue(AffiseAdSource.ADMOB)\n        .SetRevenue(2.5f, \"ImpressionData_Currency\")\n        .SetNetwork(\"ImpressionData_Network\")\n        .SetUnit(\"ImpressionData_Unit\")\n        .SetPlacement(\"ImpressionData_Placement\")\n        .Send();\n```\n\n# Debug\n\n## Validate credentials\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Debug methods WON'T work on Production \n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\nValidate your credentials by receiving `ValidationStatus` values:\n\n- `VALID` - your credentials are valid\n- `INVALID_APP_ID` - your app id is not valid \n- `INVALID_SECRET_KEY` - your SDK secretKey is not valid\n- `PACKAGE_NAME_NOT_FOUND` - your application package name not found\n- `NOT_WORKING_ON_PRODUCTION` - you using debug method on production\n- `NETWORK_ERROR` - network or server not available (for example `Airoplane mode` is active)\n\n```c#\nAffise\n    .Settings(\n        affiseAppId: \"Your appId\",\n        secretKey: \"Your SDK secretKey\"\n    )\n    .SetProduction(false) //To enable debug methods set Production to false\n    .Start(); // Start Affise SDK\n\nAffise.Debug.Validate(status =\u003e\n{\n    // Handle validation status\n});\n```\n\n## Version\n\nGet Affise library version\n\n```c#\nAffise.Debug.Version()\n```\n\n## Version native\n\nGet Affise native `Android`/`iOS` library version\n\n```c#\nAffise.Debug.VersionNative();\n```\n\n# Troubleshoots\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e \n\u003e If Affise settings doesn't change or api is working incorrectly\n\u003e\n\u003e **First**: completely stop mobile application on device\n\u003e \n\u003e **Second**: try **reset cache** for project\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\n## iOS\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e This app has crashed because Affise Advertising Module is attempted to access privacy-sensitive data without a usage description.\n\u003e\n\u003e The app's `Info.plist` must contain an `NSUserTrackingUsageDescription` key with a string value explaining\n\u003e\n\u003e to the user how the app uses this data.\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\nOpen `info.plist` and add key `NSUserTrackingUsageDescription` with string value. For more information [read requirements](#requirements)\n\n## Android\n\n\u003e [!CAUTION]\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\u003e\n\u003e Application has crashed on Android 14 (API level 34) with error\n\u003e\n\u003e `java.lang.SecurityException: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts`\n\u003e\n\u003e Cause: Google enforced new security policy for Android 14 (API level 34).\n\u003e\n\u003e 🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥🟥\n\nUpdate `Unity` minimum version for  `2023.3.0a4`, `2022.3.14f1`, `2021.3.33f1`\n[Related Unity issue](https://issuetracker.unity3d.com/issues/android-targetapi-34-crash-on-launch)\n\nEarlier versions are not supported\n\n## Unity In-App Purchasing\n\n`iOS` only\n\nThen using package `Unity In-App Purchasing`.\n\nIf build failed with unknown protocol `SKPaymentTransactionObserver` in `UnityFramework-Swift.h`,\nadd `#import \u003cStoreKit/StoreKit.h\u003e` before `UnityFramework-Swift.h`\n\n```objective-c\n#import \u003cStoreKit/StoreKit.h\u003e\n#include \"UnityFramework/UnityFramework-Swift.h\"\n```\n\n\u003e [!NOTE] \n\u003e \n\u003e `UnityFramework-Swift.h` is an auto-generated Xcode header that exposes Swift code to Objective-C\n\u003e\n\u003e `SKPaymentTransactionObserver` appearing only when unity package `Unity In-App Purchasing` is added\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faffise%2Faffise-mmp-sdk-unity","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faffise%2Faffise-mmp-sdk-unity","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faffise%2Faffise-mmp-sdk-unity/lists"}