适用于 Unity 的 Install Referrer SDK(版本 10.3.0)
SDK Install referrer 是一款用于广告和分析系统的归因工具。 它允许您跟踪通过广告链接从 RuStore 下载并安装您的应用程序的数量。
RuStore 接受如下格式的链接:https://www.rustore.ru/catalog/app/com.packagename.yourapp?referrerId=<referrer>。
当用户点击广告链接并开始安装应用程序时,RuStore 会保存该链接中的 referrer 值。
SDK 会请求 RuStore 获取 referrer 值,并将其通过 InstallReferrer 参数传递给您的应用程序。
这样,应用程序就能获得关于通过特定广告链接完成安装的信息。
在 RuStore 将 referrer 值传递给 SDK 后,该值将从 RuStore 中删除。
即使 SDK 没有请求 referrer,该值在 RuStore 中也仅存储 10 天,之后将被删除。
连接到项目
- 通过 Package Manager 安装
- 通过 .unitypackage 安装
- 克隆仓库
ru.rustore.core-version.tgzru.rustore.installreferrer-version.tgz
通过 Package Manager 将包导入到项目中 (Window → Package Manager → + → Add package from tarball...)。
如果您使用的是 macOS 操作系统,请更改归档实用程序的设置。 在 Archive Utility 设置中,取消勾选“尽可能继续解压 (Keep expanding if possible)”。 否则,项目存档将无法正确下载。
如需连接,请从发布页面下载 RuStoreUnityInstallReferrerSDK-version.unitypackage 文件并将其导入到项目中 (Assets → Import Package → Custom Package)。 依赖项将通过 External Dependency Manager (包含在 .unitypackage 中) 自动连接。
如果您使用的是 macOS 操作系统,请更改归档实用程序的设置。 在 Archive Utility 设置中,取消勾选“尽可能继续解压 (Keep expanding if possible)”。 否则,项目存档将无法正确下载。
该仓库包含插件的源代码和一个演示项目,该项目展示了 SDK 所有方法的运行情况。
请勿使用 GitFlic 网站上的“代码 → 下载”按钮,因为该方法无法下载 Git LFS 中的文件。
在克隆仓库之前,请下载并安装以下工具:
安装完成后,请在命令行中执行:
git lfs install
请使用以下一组命令来克隆仓库:
git clone https://gitflic.ru/project/rustore/unity-rustore-install-referrer-sdk.git
cd unity-rustore-install-referrer-sdk
git lfs pull
为了正确处理 SDK 依赖项,请执行以下设置。
-
打开项目设置:Edit → Project Settings → Player → Android Settings。
-
在 Publishing Settings 部分,启用以下设置:
- Custom Main Manifest。
- Custom Main Gradle Template。
- Custom Gradle Properties Template。
-
在 Other Settings 部分,配置:
- package name。
- Minimum API Level = 24。
- Target API Level = 34。
解决依赖关系
- 自动解决依赖关系
- 手动连接依赖项
Android 构建的依赖项将通过 External Dependency Manager 工具自动连接。
要自动解析依赖项,请使用以下命令:Assets → External Dependency Manager → Android Resolver → Force Resolve。 每次添加新版本的插件或重新创建 Assets / Plugins / Android / mainTemplate.gradle 和 Assets / Plugins / Android / settingsTemplate.gradle 文件时,都应执行此操作。
-
通过 *.unitypackage 安装 RuStore 插件时,无需单独安装 External Dependency Manager。
-
通过 Package Manager 安装 RuStore 插件时,请执行以下操作:
- 在软件包管理器窗口中打开 RuStore Core 插件选项卡:Window → Package Manager → Packages RuStore → RuStore Core.
- 切换到 Samples 选项卡。
- 导入 External Dependency Manager 示例。
-
您也可以从 GitHub 上的开发者仓库获取最新版本的 External Dependency Manager:
- 打开软件包管理器窗口:Window → Package Manager → + → Add package from git URL...。
- 使用链接 https://github.com/googlesamples/unity-jar-resolver.git?path=/upm 来连接该包。
- 为了解决 "Google.IOSResolver.dll will not be loaded" 错误,请为您的 Unity 版本安装 iOS 构建模块:UnityHub → Installs → 您的 Unity 版本 → Add modules → iOS Build Support。
Assembly 'Packages/com.google.external-dependency-manager/ExternalDependencyManager/Editor/1.2.182/Google.IOSResolver.dll' will not be loaded due to errors:
Unable to resolve reference 'UnityEditor.iOS.Extensions.Xcode'. Is the assembly missing or incompatible with the current platform?
Reference validation can be disabled in the Plugin Inspector.
- 打开 mainTemplate.gradle 文件:Assets / Plugins / Android / mainTemplate.gradle。 在 dependencies 部分添加以下行:
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22'
implementation 'ru.rustore.sdk:billingclient:x.y.z'
dependencies 部分的配置示例:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22'
implementation 'ru.rustore.sdk:billingclient:x.y.z'
}
其中 x.y.z 为 SDK 包的版本号。
- 打开 settingsTemplate.gradle 文件:Assets / Plugins / Android / settingsTemplate.gradle。 在 dependencyResolutionManagement repositories 部分添加以下行:
maven {
url "https://artifactory-external.vkpartner.ru/artifactory/maven"
}
dependencyResolutionManagement repositories 部分的配置示例:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
google()
mavenCentral()
def unityProjectPath = $/file:///**DIR_UNITYPROJECT**/$.replace("\\", "/")
maven {
url "https://artifactory-external.vkpartner.ru/artifactory/maven"
}
mavenLocal()
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
}
}
初始化
在调用库方法之前,必须初始化客户端单例。
InstallReferrerClient.Instance.Init();
获取 InstallReferrer 对象
调用 GetInstallReferrer() 以获取 InstallReferrer:
InstallReferrerClient.Instance.GetInstallReferrer(
onFailure: (error) => {
// Process error
},
onSuccess: (result) => {
// Process result
});
})
-
在收到
onSuccess响应时,如果您计划使用InstallReferrer,请将其值保存在您的应用程序中。 再次请求时,将返回null而非InstallReferrer的值。备注
在以下情况下,InstallReferrer 的值为 null:
-
应用程序在安装时未传递
referrer。 -
之前已请求过
InstallReferrer。 -
自 RuStore 收到
referrer以来已过去 10 天或更多。 ::: -
在收到
onFailure响应时,请根据您的应用程序逻辑处理错误。 所有可能的错误均在可能出现的错误章节中描述。
public class InstallReferrer {
public long installAppTimestamp { get; }
public string packageName { get; }
public long receivedTimestamp { get; }
public string referrerId { get; }
public long? versionCode { get; }
public string? utmCampaign { get; }
public string? utmGroup { get; }
public string? utmBanner { get; }
...
}
installAppTimestamp— 应用程序安装时间(时间戳形式)。packageName— 应用程序的包名。receivedTimestamp— 接收到 referrer 数据的时间(时间戳形式)。referrerId— referrer 标识符。versionCode— 应用程序的版本代码(如果可用)。utmCampaign— 广告活动名称。utmGroup— 广告组名称。utmBanner— 横幅广告标识符。
推荐链接的格式示例:
https://www.rustore.ru/catalog/app/ru.rustore.installreferrer?referrerId=test0&utm_campaign=test1&utm_group=test2&utm_banner=test3
将信息传输至 VK 广告 Full Stream Attribution
Full Stream Attribution 是一项能够确保将用户信号几乎实时地从广告主传输到 VK 广告优化系统的技术。 这使得模型能够真正地以实时模式调整投放策略,并高精度地匹配特定用户的兴趣。
RuStore Install referrer SDK 从 10.3.0 版本起,支持将已登录用户的电话号码(从 10.0.0 版本起)、授权令牌和事件类型传输到 Full Stream Attribution 系统。
如需在 SDK 中传输电话号码、授权令牌和事件类型,请使用以下方法:
var phoneNumber = new PhoneNumber("81234567890");
var authToken = "Token";
var fsaEventType = new FsaEventType.ViewOffer("product_id");
var fsaEvent = new FsaEvent(phoneNumber, authToken, fsaEventType);
InstallReferrerClient.Instance.SendFsaEvent(
fsaEvent: fsaEvent,
onFailure: (error) => {
// Process error
},
onSuccess: () => {
// Process success
}
);
fsaEvent—— Full Stream Attribution 的事件数据。
传输电话号码并非强制要求,且除非在 SDK 中明确启用该功能,否则该功能将不生效。 此外,为了将电话号码发送到 Full Stream Attribution 系统,必须向 SDK 传递授权令牌 (authToken)。
授权令牌 authToken 需要向 VK 广告经理申请。
SDK 将 FsaEvent 数据传输至 VK 广告服务器。
public class FsaEvent : BaseFields {
public PhoneNumber phoneNumber { get; }
public string authToken { get; }
public FsaEventType eventType { get; }
public FsaEvent(
PhoneNumber phoneNumber,
string authToken,
FsaEventType eventType
) { ... }
}
phoneNumber—— 电话号码。- 正确号码示例:
79991234567— 正好 11 位数字。+7 (999) 123-45-67— 标准化后为 11 位数字。8(999)1234567— 标准化后为 11 位数字。
- 错误号码示例:
123— 太短(3 位数字)。12345678901234567890— 太长(20 位数字)。abc-def— 标准化后为 0 位数字。
- 正确号码示例:
authToken— 授权令牌。eventType— 事件类型。
public abstract class FsaEventType {
public static string NameOf<T>() where T : FsaEventType => typeof(T).Name;
private FsaEventType() { }
public sealed class Install : FsaEventType {
public Install() { }
}
public sealed class ViewOffer : FsaEventType {
public string productId { get; }
public ViewOffer(string productId) {
this.productId = productId;
}
}
public sealed class AddToCart : FsaEventType {
public string productId { get; }
public AddToCart(string productId) {
this.productId = productId;
}
}
public sealed class Purchase : FsaEventType {
public string productId { get; }
public Purchase(string productId) {
this.productId = productId;
}
}
public sealed class AddToWishlist : FsaEventType {
public string productId { get; }
public AddToWishlist(string productId) {
this.productId = productId;
}
}
}
Install— 安装应用程序 / 首次授权。ViewOffer— 查看优惠。AddToCart— 添加到购物车。Purchase— 购买。AddToWishlist— 添加到愿望清单。
VKR 分析
VKR (VK Referrer Analytics) — 附加分析功能,在调用 getInstallReferrer() 时会自动发送推荐来源数据。
激活条件
仅当应用程序的 AndroidManifest.xml 中添加了元标签时,VKR 才会运行:
<meta-data
android:name="ru.rustore.sdk.install.referrer.ENABLE_VKR_ANALYTICS"
android:value="true" />
如果缺少元标签,则 VKR 将被完全禁用。
行为
- 如果在
getInstallReferrer()成功且获取到非空推荐来源时,它会自动启动。 - 它会传输
referrerId、UTM 字段、当前时间戳和 GAID (Google Advertising ID)。 - VKR 错误不会影响
getInstallReferrer()的结果 —— 它们在 SDK 内部被抑制。
可能的错误
-
RuStoreNotInstalledException— 用户设备上未安装 RuStore。 -
RuStoreOutdatedException— 用户设备上安装的 RuStore 版本不支持此 SDK。 -
RuStoreException— RuStore 基础错误,其他错误均继承自此类。 -
InstallReferrerException.ClientNotCreated— 创建 Install Referrer 客户端时出错。 -
InstallReferrerException.InvalidPhoneNumberException— 电话号码格式不正确。