Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/affise/sdk-unity
Affise Attribution Unity SDK
https://github.com/affise/sdk-unity
affise cross-platform metrics mobile sdk unity unity-plugin
Last synced: about 1 month ago
JSON representation
Affise Attribution Unity SDK
- Host: GitHub
- URL: https://github.com/affise/sdk-unity
- Owner: affise
- License: mit
- Created: 2022-08-10T14:21:03.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2024-09-20T17:04:03.000Z (about 2 months ago)
- Last Synced: 2024-09-27T23:04:48.849Z (about 2 months ago)
- Topics: affise, cross-platform, metrics, mobile, sdk, unity, unity-plugin
- Language: C#
- Homepage:
- Size: 3.42 MB
- Stars: 1
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Affise Unity package
[Change Log](CHANGELOG.md)
| Artifact | Version |
|---------------|-----------------------|
| `attribution` | [`1.6.24`](/releases/tag/1.6.24) |- [Affise Unity package](#affise-unity-package)
- [Description](#description)
- [Quick start](#quick-start)
- [Integration](#integration)
- [Integrate unity package](#integrate-unity-package)
- [Integrate unitypackage file](#integrate-unitypackage-file)
- [Initialize](#initialize)
- [Unity asset](#unity-asset)
- [Domain](#domain)
- [Manual](#manual)
- [Domain](#domain-1)
- [Before application is published](#before-application-is-published)
- [Requirements](#requirements)
- [iOS](#ios)
- [Modules](#modules)
- [Android](#android)
- [iOS](#ios-1)
- [Module Advertising](#module-advertising)
- [iOS](#ios-2)
- [Module Link](#module-link)
- [Module Status](#module-status)
- [Module Subscription](#module-subscription)
- [Build](#build)
- [iOS](#ios-3)
- [Features](#features)
- [ProviderType identifiers collection](#providertype-identifiers-collection)
- [Attribution](#attribution)
- [Advertising](#advertising)
- [Network](#network)
- [Phone](#phone)
- [Event send control](#event-send-control)
- [Events tracking](#events-tracking)
- [Custom events tracking](#custom-events-tracking)
- [Predefined event parameters](#predefined-event-parameters)
- [PredefinedString](#predefinedstring)
- [PredefinedLong](#predefinedlong)
- [PredefinedFloat](#predefinedfloat)
- [PredefinedObject](#predefinedobject)
- [PredefinedListObject](#predefinedlistobject)
- [PredefinedListString](#predefinedliststring)
- [Events buffering](#events-buffering)
- [Push token tracking](#push-token-tracking)
- [Deeplinks / Applink](#deeplinks--applink)
- [Config](#config)
- [Config Deeplink Manual](#config-deeplink-manual)
- [Android](#android-1)
- [iOS](#ios-4)
- [Config Applink Manual](#config-applink-manual)
- [Android](#android-2)
- [iOS](#ios-5)
- [Offline mode](#offline-mode)
- [Disable tracking](#disable-tracking)
- [Disable background tracking](#disable-background-tracking)
- [Get random user Id](#get-random-user-id)
- [Get random device Id](#get-random-device-id)
- [Get providers](#get-providers)
- [Is first run](#is-first-run)
- [Get referrer](#get-referrer)
- [Get referrer value](#get-referrer-value)
- [Get referrer on server](#get-referrer-on-server)
- [Get referrer on server parameter](#get-referrer-on-server-parameter)
- [Referrer keys](#referrer-keys)
- [Get module state](#get-module-state)
- [Platform specific](#platform-specific)
- [StoreKit Ad Network](#storekit-ad-network)
- [SDK to SDK integrations](#sdk-to-sdk-integrations)
- [Debug](#debug)
- [Validate credentials](#validate-credentials)
- [Troubleshoots](#troubleshoots)
- [iOS](#ios-6)
- [Android](#android-3)# Description
Affise SDK is a software you can use to collect app usage statistics, device identifiers, deeplink usage, track install
referrer.## Quick start
## Integration
### Integrate unity package
Open Package Manager(`Window / Package Manager`)
Add package from git url `https://github.com/affise/sdk-unity.git`
### Integrate unitypackage file
Download latest Affise SDK [`attribution-1.6.24.unitypackage`](https://github.com/affise/sdk-unity/releases/download/1.6.24/attribution-1.6.24.unitypackage)
from [releases page](https://github.com/affise/sdk-unity/releases) and drop this file to unity editor### Initialize
#### Unity asset
After package is added to unity project, initialize affise settings.
Open Project Settings(`Edit / Project Settings`)
On Affise tab click `Create` button.
![affise_settings_new](https://github.com/affise/sdk-unity/blob/assets/affise_settings_new.png?raw=true)
This will create `Affise Settings.asset` in `Assets / Affise / Resources` directory.
> **Note**
>
> π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦
>
> Settings set in `Edit / Project Settings / Affise` are marked as `Active Settings`
>
> Affise is using settings marked as `Active Settings`
>
> located in root of folder `Resources` which can be located in any folder
>
> Example ` / Resources / .asset`
>
> π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦π¦> **Warning**
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§
>
> Settings located in `Editor` folder are **invalid**.
>
> Example: `Editor / Resources / .asset`
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§Fill all required fields
![affise_settings](https://github.com/affise/sdk-unity/blob/assets/affise_settings.png?raw=true)
##### Domain
Set SDK server domain:
1. Open `Edit / Project Settings / Affise`
2. Unfold `Optional` section at the bottom
3. Fill `Domain` field#### Manual
> Demo app [AffiseDemo.cs](Samples~/AffiseDemoApp/Scripts/AffiseDemo.cs)
```c#
Affise
.Settings(
affiseAppId: "Your appId", //Change to your app id
secretKey: "Your SDK secretKey" //Change to your SDK secretKey
)
.Start(); // Start Affise SDK
```##### Domain
Set SDK server domain:
```c#
Affise
.Settings(
affiseAppId: "Your appId",
secretKey: "Your SDK secretKey"
)
.setDomain("https://YoureCustomDomain/") // Set custom domain
.Start(); // Start Affise SDK
```#### Before application is published
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> Please make sure your credentials are valid
>
> Visit section [validation credentials](#validate-credentials)
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯### Requirements
#### iOS
Affise Advertising module uses `AppTrackingTransparency` framework to get `advertisingIdentifier`
For working functionality your app needs to declare [`NSUserTrackingUsageDescription` permission](https://developer.apple.com/documentation/bundleresources/information_property_list/nsusertrackingusagedescription):Key `NSUserTrackingUsageDescription` value is set in `Edit / Project Settings / Affise / Modules`
Key added automatically then module `Advertising` is selected
Default value is empty string ""
### Modules
Open `Edit / Project Settings / Affise`
On `Modules` tab select all required
![affise_modules](https://github.com/affise/sdk-unity/blob/assets/affise_modules.png?raw=true)
If module start `type` is `manual`, then call is code:
```c#
Affise.Module.ModuleStart(AffiseModules.Advertising);
```Get list of installed modules:
```c#
Affise.Module.GetModulesInstalled()
```#### Android
All affise modules is updated automatically on build
> **Warning**
>
> **No manual editing is reqired**| Module | Version | Start |
|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------|
| `Advertising` | [![module-advertising](https://img.shields.io/maven-central/v/com.affise/module-advertising?label=latest)](https://mvnrepository.com/artifact/com.affise/module-advertising) | `Auto` |
| `AndroidId` | [![module-androidid](https://img.shields.io/maven-central/v/com.affise/module-androidid?label=latest)](https://mvnrepository.com/artifact/com.affise/module-androidid) | `Auto` |
| `Link` | [![module-link](https://img.shields.io/maven-central/v/com.affise/module-link?label=latest)](https://mvnrepository.com/artifact/com.affise/module-link) | `Auto` |
| `Network` | [![module-network](https://img.shields.io/maven-central/v/com.affise/module-network?label=latest)](https://mvnrepository.com/artifact/com.affise/module-network) | `Auto` |
| `Phone` | [![module-phone](https://img.shields.io/maven-central/v/com.affise/module-phone?label=latest)](https://mvnrepository.com/artifact/com.affise/module-phone) | `Auto` |
| `Status` | [![module-status](https://img.shields.io/maven-central/v/com.affise/module-status?label=latest)](https://mvnrepository.com/artifact/com.affise/module-status) | `Auto` |Dependencies located in Android project gradle file `build.gradle`
```gradle
dependencies {
// ...
// Affise modules
implementation 'com.affise:module-advertising:1.6.45'
implementation 'com.affise:module-androidid:1.6.45'
implementation 'com.affise:module-link:1.6.45'
implementation 'com.affise:module-network:1.6.45'
implementation 'com.affise:module-phone:1.6.45'
implementation 'com.affise:module-status:1.6.45'
}
```#### iOS
All affise modules is updated automatically on build
> **Warning**
>
> **No manual editing is reqired**| Module | Version | Start |
|---------------|:------------------------------------------------------------------------------------:|----------|
| `Advertising` | [`1.6.42`](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) | `Manual` |
| `Link` | [`1.6.42`](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) | `Auto` |
| `Status` | [`1.6.42`](https://github.com/CocoaPods/Specs/tree/master/Specs/0/3/d/AffiseModule/) | `Auto` |Dependencies located in XCode project folder `Podfile`
```rb
platform :ios, '11.0'target 'UnityFramework' do
pod 'AffiseInternal', '1.6.42'# Affise Modules
pod 'AffiseModule/Advertising', `1.6.42`
pod 'AffiseModule/Link', '~> 1.6.42'
pod 'AffiseModule/Status', `1.6.42`
endtarget 'Unity-iPhone' do
enduse_frameworks! :linkage => :static
```#### Module Advertising
##### iOS
This module required to Use [`IDFA`](https://developer.apple.com/documentation/adsupport/asidentifiermanager/advertisingidentifier) (Identifier for advertisers)
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> Module Advertising requires `NSUserTrackingUsageDescription` key in `info.plist`
>
> Application **will crash** if key not present
>
> Key `NSUserTrackingUsageDescription` value is set in `Edit / Project Settings / Affise / Modules`
>
> Key added automatically then module `Advertising` is selected
>
> Default value is empty string ""
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯Or Manual open `info.plist` and add key `NSUserTrackingUsageDescription` with string value. For more information [read requirements](#requirements)
#### Module Link
Return last url in chan of redirection
π₯Support MAX 10 redirectionsπ₯
```C#
Affise.Module.LinkResolve("SITE_WITH_REDIRECTION", (redirectUrl) => {
// handle redirect url
});
```#### Module Status
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> If `getStatus` return an error or working more than 2 minutes
>
> Please see section [validation credentials](#validate-credentials)
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯```C#
Affise.Module.GetStatus(AffiseModules.Status, response => {
// handle response
});
```#### Module Subscription
Get products by ids:
```C#
var ids = new List {
"exampple.product.id_1",
"exampple.product.id_2",
};Affise.Module.FetchProducts(ids, (result) =>
{
if (result.IsSuccess)
{
var value = result.AsSuccess;
var products = value.Products;
var invalidIds = value.InvalidIds;
}
else
{
var error = result.AsFailure;
}
});
```Purchase product:
```C#
// Specify product type for correct affise event
Affise.Module.Purchase(product, AffiseProductType.CONSUMABLE, (result) =>
{
if (result.IsSuccess)
{
AffisePurchasedInfo purchasedInfo = result.AsSuccess;
}
else
{
var error = result.AsFailure;
}
});
```## Build
### iOS
SDK is using Cocoapods
1. In `Build setting` select iOS platform and press `Build`
2. Select build folder (unity will exported iOS project to build folder)
3. Build folder should contain `Podfile`
4. In Terminal open build folder and run commend `pod install`
5. Open generated `*.worksapce` to build your unity project> **Warning**
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§
>
> If command `pod install` returns error `CocoaPods could not find compatible versions for pod "AffiseInternal"`
>
> Run `pod repo update` and then run `pod install` again
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§If Podfile hasn't generated you can create it manually using this [Podfile](Editor/Resources/iOS/AffisePodfile.rb) as template
Podfile:
```rb
platform :ios, '11.0'target 'UnityFramework' do
pod 'AffiseInternal', '1.6.42'# Affise Modules
# pod 'AffiseModule', `1.6.42`
endtarget 'Unity-iPhone' do
enduse_frameworks! :linkage => :static
```# Features
## ProviderType identifiers collection
To match users with events and data library is sending, these `ProviderType` identifiers are collected:
### Attribution
- `AFFISE_APP_ID`
- `AFFISE_PKG_APP_NAME`
- `AFF_APP_NAME_DASHBOARD`
- `APP_VERSION`
- `APP_VERSION_RAW`
- `STORE`
- `TRACKER_TOKEN`
- `TRACKER_NAME`
- `FIRST_TRACKER_TOKEN`
- `FIRST_TRACKER_NAME`
- `LAST_TRACKER_TOKEN`
- `LAST_TRACKER_NAME`
- `OUTDATED_TRACKER_TOKEN`
- `INSTALLED_TIME`
- `FIRST_OPEN_TIME`
- `INSTALLED_HOUR`
- `FIRST_OPEN_HOUR`
- `INSTALL_FIRST_EVENT`
- `INSTALL_BEGIN_TIME`
- `INSTALL_FINISH_TIME`
- `REFERRER_INSTALL_VERSION`
- `REFERRAL_TIME`
- `REFERRER_CLICK_TIME`
- `REFERRER_CLICK_TIME_SERVER`
- `REFERRER_GOOGLE_PLAY_INSTANT`
- `CREATED_TIME`
- `CREATED_TIME_MILLI`
- `CREATED_TIME_HOUR`
- `UNINSTALL_TIME`
- `REINSTALL_TIME`
- `LAST_SESSION_TIME`
- `CPU_TYPE`
- `HARDWARE_NAME`
- `DEVICE_MANUFACTURER`
- `DEEPLINK_CLICK`
- `DEVICE_ATLAS_ID`
- `AFFISE_DEVICE_ID`
- `AFFISE_ALT_DEVICE_ID`
- `ANDROID_ID`
- `ANDROID_ID_MD5`
- `REFTOKEN`
- `REFTOKENS`
- `REFERRER`
- `USER_AGENT`
- `MCCODE`
- `MNCODE`
- `REGION`
- `COUNTRY`
- `LANGUAGE`
- `DEVICE_NAME`
- `DEVICE_TYPE`
- `OS_NAME`
- `PLATFORM`
- `SDK_PLATFORM`
- `API_LEVEL_OS`
- `AFFISE_SDK_VERSION`
- `OS_VERSION`
- `RANDOM_USER_ID`
- `AFFISE_SDK_POS`
- `TIMEZONE_DEV`
- `AFFISE_EVENT_NAME`
- `AFFISE_EVENT_TOKEN`
- `LAST_TIME_SESSION`
- `TIME_SESSION`
- `AFFISE_SESSION_COUNT`
- `LIFETIME_SESSION_COUNT`
- `AFFISE_DEEPLINK`
- `AFFISE_PART_PARAM_NAME`
- `AFFISE_PART_PARAM_NAME_TOKEN`
- `AFFISE_APP_TOKEN`
- `LABEL`
- `AFFISE_SDK_SECRET_ID`
- `UUID`
- `AFFISE_APP_OPENED`
- `PUSHTOKEN`
- `AFFISE_EVENTS_COUNT`
- `AFFISE_SDK_EVENTS_COUNT`
- `AFFISE_METRICS_EVENTS_COUNT`
- `AFFISE_INTERNAL_EVENTS_COUNT`
- `IS_ROOTED`
- `IS_EMULATOR`### Advertising
- `GAID_ADID`
- `GAID_ADID_MD5`
- `OAID`
- `OAID_MD5`
- `ADID`
- `ALTSTR_ADID`
- `FIREOS_ADID`
- `COLOROS_ADID`### Network
- `MAC_SHA1`
- `MAC_MD5`
- `CONNECTION_TYPE`
- `PROXY_IP_ADDRESS`### Phone
- `NETWORK_TYPE`
- `ISP`## Event send control
There are two ways to send events
1. Cache event to later scheduled send in batch
```c#
AddToCartEvent()
.Send();
```2. Send event right now
```c#
AddToCartEvent()
.SendNow(() =>
{
// handle event send success
}, (errorResponse) =>
{
// handle event send failed
// π₯Warning:π₯ event is NOT cached for later send
}
);
```## Events tracking
For example, we want to track achievements. To send event first create it with
following code```c#
class Presenter {
void OnUnlockAchievement()
{
var achievement = new JSONObject
{
["achievement"] = "new level",
};new UnlockAchievementEvent("best damage")
.AddPredefinedParameter(PredefinedLong.USER_SCORE, 12552L)
.AddPredefinedParameter(PredefinedString.ACHIEVEMENT_ID, "1334-1225-ASDZ")
.AddPredefinedParameter(PredefinedObject.CONTENT, achievement)
.Send();
}
}
```With above example you can implement other events:
- `AchieveLevel`
- `AddPaymentInfo`
- `AddToCart`
- `AddToWishlist`
- `AdRevenue`
- `ClickAdv`
- `CompleteRegistration`
- `CompleteStream`
- `CompleteTrial`
- `CompleteTutorial`
- `Contact`
- `ContentItemsView`
- `CustomizeProduct`
- `DeepLinked`
- `Donate`
- `FindLocation`
- `InitiateCheckout`
- `InitiatePurchase`
- `InitiateStream`
- `Invite`
- `LastAttributedTouch`
- `Lead`
- `ListView`
- `Login`
- `OpenedFromPushNotification`
- `Order`
- `OrderItemAdded`
- `OrderItemRemove`
- `OrderCancel`
- `OrderReturnRequest`
- `OrderReturnRequestCancel`
- `Purchase`
- `Rate`
- `ReEngage`
- `Reserve`
- `Sales`
- `Schedule`
- `Search`
- `Share`
- `SpendCredits`
- `StartRegistration`
- `StartTrial`
- `StartTutorial`
- `SubmitApplication`
- `Subscribe`
- `TravelBooking`
- `UnlockAchievement`
- `Unsubscribe`
- `Update`
- `ViewAdv`
- `ViewCart`
- `ViewContent`
- `ViewItem`
- `ViewItems`
- `InitialSubscription`
- `InitialTrial`
- `InitialOffer`
- `ConvertedTrial`
- `ConvertedOffer`
- `TrialInRetry`
- `OfferInRetry`
- `SubscriptionInRetry`
- `RenewedSubscription`
- `FailedSubscriptionFromRetry`
- `FailedOfferFromRetry`
- `FailedTrialFromRetry`
- `FailedSubscription`
- `FailedOfferise`
- `FailedTrial`
- `ReactivatedSubscription`
- `RenewedSubscriptionFromRetry`
- `ConvertedOfferFromRetry`
- `ConvertedTrialFromRetry`
- `Unsubscription`### Custom events tracking
Use any of custom events if default doesn't fit your scenario:
- `CustomId01Event`
- `CustomId02Event`
- `CustomId03Event`
- `CustomId04Event`
- `CustomId05Event`
- `CustomId06Event`
- `CustomId07Event`
- `CustomId08Event`
- `CustomId09Event`
- `CustomId10Event`If above event functionality still limits your usecase, you can use `UserCustomEvent`
```c#
new UserCustomEvent(eventName: "MyCustomEvent")
.Send();
```## Predefined event parameters
To enrich your event with another dimension, you can use predefined parameters for most common cases.
Add it to any event:```c#
class Presenter {
void OnUnlockAchievement()
{
var achievement = new JSONObject
{
["achievement"] = "new level",
};
new UnlockAchievementEvent(
userData: "best damage"
)
.AddPredefinedParameter(PredefinedString.DESCRIPTION, "best damage")
.AddPredefinedParameter(PredefinedObject.CONTENT, achievement)
.Send();
}
}
```In examples above `PredefinedParameters.DESCRIPTION` and `PredefinedObject.CONTENT` is used, but many others is available:
| PredefinedParameter | Type |
|-----------------------------------------------|------------------------|
| [PredefinedString](#predefinedstring) | string |
| [PredefinedLong](#predefinedlong) | long |
| [PredefinedFloat](#predefinedfloat) | float |
| [PredefinedObject](#predefinedobject) | JSONObject |
| [PredefinedListObject](#predefinedlistobject) | List<JSONObject> |
| [PredefinedListString](#predefinedliststring) | List<string> |### PredefinedString
- `ACHIEVEMENT_ID`
- `ADREV_AD_TYPE`
- `BRAND`
- `BRICK`
- `CAMPAIGN_ID`
- `CATALOGUE_ID`
- `CHANNEL_TYPE`
- `CITY`
- `CLASS`
- `CLICK_ID`
- `CONTENT_ID`
- `CONTENT_NAME`
- `CONTENT_TYPE`
- `CONVERSION_ID`
- `COUNTRY`
- `COUPON_CODE`
- `CURRENCY`
- `CUSTOMER_SEGMENT`
- `CUSTOMER_TYPE`
- `CUSTOMER_USER_ID`
- `DEEP_LINK`
- `DESCRIPTION`
- `DESTINATION_A`
- `DESTINATION_B`
- `DESTINATION_LIST`
- `EVENT_NAME`
- `NEW_VERSION`
- `OLD_VERSION`
- `ORDER_ID`
- `PARAM_01`
- `PARAM_02`
- `PARAM_03`
- `PARAM_04`
- `PARAM_05`
- `PARAM_06`
- `PARAM_07`
- `PARAM_08`
- `PARAM_09`
- `PARAM_10`
- `PAYMENT_INFO_AVAILABLE`
- `PID`
- `PREFERRED_NEIGHBORHOODS`
- `PRODUCT_ID`
- `PRODUCT_NAME`
- `PURCHASE_CURRENCY`
- `RECEIPT_ID`
- `REGION`
- `REGISTRATION_METHOD`
- `REVIEW_TEXT`
- `SEARCH_STRING`
- `SEGMENT`
- `STATUS`
- `SUBSCRIPTION_ID`
- `SUCCESS`
- `SUGGESTED_DESTINATIONS`
- `SUGGESTED_HOTELS`
- `TUTORIAL_ID`
- `UTM_CAMPAIGN`
- `UTM_MEDIUM`
- `UTM_SOURCE`
- `VALIDATED`
- `VERTICAL`
- `VIRTUAL_CURRENCY_NAME`
- `VOUCHER_CODE`### PredefinedLong
- `AMOUNT`
- `DATE_A`
- `DATE_B`
- `DEPARTING_ARRIVAL_DATE`
- `DEPARTING_DEPARTURE_DATE`
- `HOTEL_SCORE`
- `LEVEL`
- `MAX_RATING_VALUE`
- `NUM_ADULTS`
- `NUM_CHILDREN`
- `NUM_INFANTS`
- `PREFERRED_NUM_STOPS`
- `PREFERRED_STAR_RATINGS`
- `QUANTITY`
- `RATING_VALUE`
- `RETURNING_ARRIVAL_DATE`
- `RETURNING_DEPARTURE_DATE`
- `SCORE`
- `TRAVEL_START`
- `TRAVEL_END`
- `USER_SCORE`
- `EVENT_START`
- `EVENT_END`### PredefinedFloat
- `PREFERRED_PRICE_RANGE`
- `PRICE`
- `REVENUE`
- `LAT`
- `LONG`### PredefinedObject
- `CONTENT`
### PredefinedListObject
- `CONTENT_LIST`
### PredefinedListString
- `CONTENT_IDS`
## Events buffering
Affise library will send any pending events with first opportunity,
but if there is no network connection or device is disabled, events are kept locally for 7 days before deletion.## Push token tracking
To let affise track push token you need to receive it from your push service provider, and pass to Affise library.
First add firebase integration to your app completing these steps: Firebase [iOS](https://firebase.google.com/docs/cloud-messaging/ios/client) or [Android](https://firebase.google.com/docs/cloud-messaging/android/client) Docs```c#
Affise.AddPushToken(token);
```## Deeplinks / Applink
- Register deeplink callback right after `Affise.Settings(affiseAppId,secretKey).Start()`
```c#
Affise.RegisterDeeplinkCallback((value) =>
{
// full uri "scheme://host/path?parameters"
var deeplink = value.Deeplink;// separated for convenience
var scheme = value.Scheme;
var host = value.Host;
var path = value.Path;
var queryParametersMap = value.Parameters;if(queryParametersMap[""]?.Contains("") == true) {
// handle value
}
});
```Test Android DeepLink via terminal command:
```terminal
adb shell am start -a android.intent.action.VIEW -d "YOUR_SCHEME://YOUR_DOMAIN/somepath?param=1\&list=some\&list=other\&list="
```Test iOS DeepLink via terminal command:
```terminal
xcrun simctl openurl booted "YOUR_SCHEME://YOUR_DOMAIN/somepath?param=1&list=some&list=other&list=1"
```### Config
Open `Edit / Project Settings / Affise`
On `Settings` tab add links
![affise_deeplinks](https://github.com/affise/sdk-unity/blob/assets/affise_deeplinks.png?raw=true)
> **Warning**
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§
>
> For Android deeplink remove is manual
>
> Open Android project and remove deeplink `intent-filter` from `AndroidManifest.xml`
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§### Config Deeplink Manual
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> Deeplinks support only **CUSTOM** scheme **NOT** `http` or `https`
>
> For `http` or `https` read how to setup [AppLinks](#config-applink-manual)
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯#### Android
To integrate deeplink support in android you need:
- Add intent filter to `AndroidManifest.xml`. For more info read [Unity docs](https://docs.unity3d.com/Manual/android-manifest.html)
- Add **custom** scheme (**NOT** `http` or `https`) and host to filter
Example: `YOUR_SCHEME://YOUR_DOMAIN`
Example: `myapp://mydomain.com`
```xml
```
#### iOS
To integrate deeplink support in iOS you need:
Add key `CFBundleURLTypes` to `Info.plist` file in Xcode project folder
Example: `YOUR_SCHEME://YOUR_DOMAIN`
Example: `myapp://mydomain.com`
```xml
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLName
YOUR_DOMAIN
CFBundleURLSchemes
YOUR_SCHEME
```
### Config Applink Manual
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> You must owne website domain.
>
> And has ability to add file `https://yoursite/.well-known/apple-app-site-association` for iOS support
>
> And has ability to add file `https://yoursite/.well-known/assetlinks.json` for Android support
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯#### Android
To integrate applink support in android you need:
- Add intent filter to `AndroidManifest.xml`. For more info read [Unity docs](https://docs.unity3d.com/Manual/android-manifest.html)
- Add `https` or `http` scheme and host to filter
Example: `https://YOUR_DOMAIN`
Example: `https://mydomain.com`
```xml
```
- Associate your app with your website. [Read Google instructions](https://developer.android.com/studio/write/app-link-indexing#associatesite)
How To Associate your app with your website---
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).
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).
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** > **Setup** > **App signing**.
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:
![app-links-assistant-dal-file-generator_2x](https://developer.android.com/static/studio/images/write/app-links-assistant-dal-file-generator_2x.png)
**Figure 2**. Enter details about your site and app to generate a Digital Asset Links file.1. Enter your **Site domain** and your [**Application ID**](https://developer.android.com/studio/build/configure-app-module#set-application-id).
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`.
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).
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.
4. Click **Generate Digital Asset Links file**.
5. Once Android Studio generates the file, click **Save file** to download it.
6. Upload the `assetlinks.json` file to your site, with read access for everyone, at `https://yoursite/.well-known/assetlinks.json`.> **Important**
>
> 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**.7. Click **Link and Verify** to confirm that you've uploaded the correct Digital Asset Links file to the correct location.
Learn more about associating your website with your app through the Digital Asset Links file in Declare website associations.
---
#### iOS
To integrate applink support in iOS you need:
- Follow how to set up applink in the [official documentation](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app).
- Associate your app with your website. [Supporting associated domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains)
- [Configuring an associated domain](https://developer.apple.com/documentation/xcode/configuring-an-associated-domain/)
- Add key `com.apple.developer.associated-domains` to `Info.plist`
Example: `https://YOUR_DOMAIN`
Example: `https://mydomain.com`
```xml
com.apple.developer.associated-domainsapplinks:YOUR_DOMAIN
```
## Offline mode
In some scenarios you would want to limit Affise network usage, to pause that activity call anywhere in your application following code after Affise start:
```c#
Affise.SetOfflineModeEnabled(true) // to enable offline mode
Affise.SetOfflineModeEnabled(false) // to disable offline mode
```While offline mode is enabled, your metrics and other events are kept locally, and will be delivered once offline mode is disabled.
Offline mode is persistent as Application lifecycle, and will be disabled with process termination automatically.
To check current offline mode status call:```c#
Affise.IsOfflineModeEnabled() // returns true or false describing current tracking state
```## Disable tracking
To disable any tracking activity, storing events and gathering device identifiers and metrics call anywhere in your application following code after Affise start:
```c#
Affise.SetTrackingEnabled(true) // to enable tracking
Affise.SetTrackingEnabled(false) // to disable tracking
```By default tracking is enabled.
While tracking mode is disabled, metrics and other identifiers is not generated locally.
Keep in mind that this flag is persistent until app reinstall, and don't forget to reactivate tracking when needed.
To check current status of tracking call:```c#
Affise.IsTrackingEnabled() // returns true or false describing current tracking state
```## Disable background tracking
To disable any background tracking activity, storing events and gathering device identifiers and metrics call anywhere in your application following code after Affise start:
```c#
Affise.SetBackgroundTrackingEnabled(true) // to enable background tracking
Affise.SetBackgroundTrackingEnabled(false) // to disable background tracking
```By default background tracking is enabled.
While background tracking mode is disabled, metrics and other identifiers is not generated locally.
Background tracking mode is persistent as Application lifecycle, and will be re-enabled with process termination automatically.
To check current status of background tracking call:```c#
Affise.IsBackgroundTrackingEnabled() // returns true or false describing current background tracking state
```## Get random user Id
```c#
Affise.GetRandomUserId();
```## Get random device Id
```c#
Affise.GetRandomDeviceId();
```## Get providers
Returns providers map with [ProviderType](#providertype-identifiers-collection) as key
```c#
var providers = Affise.GetProviders();
var key = ProviderType.AFFISE_APP_TOKEN;
if (providers.ContainsKey(key)) {
var value = providers[key];
}
```## Is first run
```c#
Affise.IsFirstRun();
```## Get referrer
> **Warning**
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§
>
> Don't call this method directly in `Awake()` it may cause `NullReferenceException`
>
> π§π§π§π§π§π§π§π§π§π§π§π§π§π§π§Use the next public method of SDK to get referrer
```C#
Affise.GetReferrerUrl(referrer => {
// handle referrer
});
```## Get referrer value
Use the next public method of SDK to get referrer value by
```C#
Affise.GetReferrerUrlValue(ReferrerKey.CLICK_ID, referrer => {
// handle referrer value
});
```## Get referrer on server
> `iOS Only`
> **Note**
>
> Requires [Affise Status Module](#modules) for [ios](#ios-1)Use the next public method of SDK
```C#
Affise.IOS.GetReferrerOnServer(referrer => {
// handle referrer
});
```## Get referrer on server parameter
> `iOS Only`
> **Note**
>
> Requires [Affise Status Module](#modules) for [ios](#ios)Use the next public method of SDK to get referrer parameter by
```C#
Affise.IOS.GetReferrerOnServerValue(ReferrerKey.CLICK_ID, referrer => {
// handle referrer value
});
```## Referrer keys
In examples above `ReferrerKey.CLICK_ID` is used, but many others is available:
- `AD_ID`
- `CAMPAIGN_ID`
- `CLICK_ID`
- `AFFISE_AD`
- `AFFISE_AD_ID`
- `AFFISE_AD_TYPE`
- `AFFISE_ADSET`
- `AFFISE_ADSET_ID`
- `AFFISE_AFFC_ID`
- `AFFISE_CHANNEL`
- `AFFISE_CLICK_LOOK_BACK`
- `AFFISE_COST_CURRENCY`
- `AFFISE_COST_MODEL`
- `AFFISE_COST_VALUE`
- `AFFISE_DEEPLINK`
- `AFFISE_KEYWORDS`
- `AFFISE_MEDIA_TYPE`
- `AFFISE_MODEL`
- `AFFISE_OS`
- `AFFISE_PARTNER`
- `AFFISE_REF`
- `AFFISE_SITE_ID`
- `AFFISE_SUB_SITE_ID`
- `AFFISE_SUB_1`
- `AFFISE_SUB_2`
- `AFFISE_SUB_3`
- `AFFISE_SUB_4`
- `AFFISE_SUB_5`
- `AFFC`
- `PID`
- `SUB_1`
- `SUB_2`
- `SUB_3`
- `SUB_4`
- `SUB_5`## Get module state
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> If `getStatus` return an error or working more than 2 minutes
>
> Please see section [validation credentials](#validate-credentials)
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯```C#
Affise.Module.GetStatus(AffiseModules.Status, response => {
// handle response
});
```## Platform specific
### StoreKit Ad Network
> `iOS Only`
For ios prior `16.1` first call
```C#
Affise.IOS.RegisterAppForAdNetworkAttribution(error =>
{
// Handle error
});
```Updates the fine and coarse conversion values, and calls a completion handler if the update fails.
Second argument coarseValue is available in iOS 16.1+```C#
Affise.IOS.UpdatePostbackConversionValue(1, SKAdNetwork.CoarseConversionValue.Medium, error =>
{
// Handle error
});
```Configure your app to send postback copies to Affise:
Add key `NSAdvertisingAttributionReportEndpoint` to project `Info.plist`
Set key value to `https://affise-skadnetwork.com/````xml
CFBundleURLTypes
NSAdvertisingAttributionReportEndpoint
https://affise-skadnetwork.com/
```
# SDK to SDK integrations
```c#
// Send AdRevenue info
new AffiseAdRevenue(AffiseAdSource.ADMOB)
.SetRevenue(2.5f, "ImpressionData_Currency")
.SetNetwork("ImpressionData_Network")
.SetUnit("ImpressionData_Unit")
.SetPlacement("ImpressionData_Placement")
.Send();
```# Debug
## Validate credentials
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> Debug methods WON'T work on Production
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯Validate your credentials by receiving `ValidationStatus` values:
- `VALID` - your credentials are valid
- `INVALID_APP_ID` - your app id is not valid
- `INVALID_SECRET_KEY` - your SDK secretKey is not valid
- `PACKAGE_NAME_NOT_FOUND` - your application package name not found
- `NOT_WORKING_ON_PRODUCTION` - you using debug method on production
- `NETWORK_ERROR` - network or server not available (for example `Airoplane mode` is active)```c#
Affise
.Settings(
affiseAppId: "Your appId",
secretKey: "Your SDK secretKey"
)
.SetProduction(false) //To enable debug methods set Production to false
.Start(); // Start Affise SDKAffise.Debug.Validate(status =>
{
// Handle validation status
});
```# Troubleshoots
## iOS
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> This app has crashed because Affise Advertising Module is attempted to access privacy-sensitive data without a usage description.
>
> The app's `Info.plist` must contain an `NSUserTrackingUsageDescription` key with a string value explaining
>
> to the user how the app uses this data.
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯Open `info.plist` and add key `NSUserTrackingUsageDescription` with string value. For more information [read requirements](#requirements)
## Android
> **Warning**
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯
>
> Application has crashed on Android 14 (API level 34) with error
>
> `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`
>
> Cause: Google enforced new security policy for Android 14 (API level 34).
>
> π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯Update `Unity` minimum version for `2023.3.0a4`, `2022.3.14f1`, `2021.3.33f1`
[Related Unity issue](https://issuetracker.unity3d.com/issues/android-targetapi-34-crash-on-launch)Earlier versions are not supported