创建自定义应用促销市场活动

除了为将在 Windows 应用中运行的应用创建广告市场活动外,还可以使用其他渠道推广你的应用。 例如,可以使用第三方应用营销提供商推广应用,或者可以在社交媒体网站上发布指向应用的链接。 这些活动称为 自定义市场活动

如果为应用运行自定义市场活动,可以通过为每个自定义市场活动创建不同的 URL 来跟踪每个市场活动的相对性能,其中每个 URL 包含不同的 市场活动 ID。 当运行 Windows 10 的客户单击包含市场活动 ID 的 URL 时,Microsoft 会将该单击操作与相应的自定义市场活动相关联,并在合作伙伴中心中向你提供此数据。

重要

仅针对 Windows 10 上的客户跟踪此数据。 使用其他操作系统的客户仍可以遵循应用列表的链接,但不会包含有关这些客户活动的数据。

有两种与自定义市场活动关联的主要数据类型: 应用的应用商店一览的页面视图转换。 转换是从客户从包含自定义市场活动 ID 的 URL 查看应用的应用商店一览页面得出的应用获取。 有关转换的更多详细信息,请参阅 了解应用购置如何限定为本主题中的转换

可以通过以下方式检索应用的自定义市场活动性能数据:

  • 通过购置报表中的“按市场活动 ID 的应用页面查看和转换”和“市场活动总转换”图表,可以查看应用或加载项的页面查看和转换的相关数据
  • 如果你的应用是通用 Windows 平台(UWP)应用,则可以使用 Windows SDK 中的 API 以编程方式检索导致转换的自定义市场活动 ID。

自定义市场活动方案示例

考虑一个游戏开发人员,谁已经完成了一个新的游戏,并希望将其推广到她的现有游戏的玩家。 她在 Facebook 页面上发布了新游戏发布的公告,包括游戏应用商店一览的链接。 她的许多玩家也在Twitter上关注她,因此她还在推特上发布了一个公告,其中包含游戏商店一览的链接。

为了跟踪每个促销渠道的成功,开发人员会创建游戏应用商店一览的 URL 的两个变体:

  • 她将发布到其 Facebook 页面的 URL 包含自定义市场活动 ID my-facebook-campaign

  • 她将发布到 Twitter 的 URL 包含自定义市场活动 ID my-twitter-campaign

当她的 Facebook 和 Twitter 关注者单击 URL 时,Microsoft跟踪每个点击并将其与相应的自定义市场活动相关联。 随后对游戏的合格收购和任何加载项购买都与自定义市场活动相关联,并报告为转换。

了解购置如何限定为转换

自定义市场活动转换是从客户单击通过自定义市场活动推广的 URL 获得的。 对于购置报表中“按市场活动 ID 的应用页面查看和转换”和“市场活动总转换”图表中的转换和以编程方式检索市场活动 ID 中的转换,其判定所依据的方案有所不同

在购置报告中限定转换

以下方案限定为“购置”报表“市场活动 ID”和“市场活动转换总数”图表的应用页面视图和转换的转换:

  • 具有或未识别Microsoft帐户的客户单击包含自定义市场活动 ID 的应用 URL,并重定向到应用的应用商店一览。 然后,同一客户在首次单击具有自定义市场活动 ID 的Microsoft应用商店 URL 后 24 小时内获取该应用。

  • 如果客户在与单击具有自定义市场活动 ID 的 URL 不同的设备上获取应用,则仅当客户使用与单击 URL 时相同的Microsoft帐户登录时,才会计算转换。

注意

对于被视为自定义市场活动转换的应用购置,该应用中的任何加载项购买也计为同一自定义市场活动的转换。

以编程方式检索市场活动 ID 时限定转换

若要在以编程方式检索与应用关联的市场活动 ID 时限定为转换,必须满足以下条件:

  • 在运行 Windows 10 版本 1607 或更高版本的设备上:客户(是否登录到已识别的Microsoft帐户)单击包含自定义市场活动 ID 的 URL,并重定向到应用的应用商店一览页。 客户在单击 URL 时查看应用商店一览时获取应用。

  • 在运行 Windows 10 版本 1511 或更早版本的设备上:客户(必须使用已识别的Microsoft帐户登录)单击包含自定义市场活动 ID 的 URL,并重定向到应用的应用商店一览页。 客户在单击 URL 时查看应用商店一览时获取应用。 在这些版本的 Windows 10 或 Windows 11 上,用户必须使用已识别的Microsoft帐户登录,以便获取在以编程方式检索市场活动 ID 时限定为转换。

注意

如果客户离开 Microsoft Store 一览页面,但会返回包含 24 小时的页面(在同一台设备上,或者在使用同一Microsoft帐户登录时位于其他设备上)并获取应用,则这将有资格在“购置”报表中的“应用”页面视图和转换中按市场活动 ID“市场活动转换总数”图表进行转换。 但是,如果以编程方式检索市场活动 ID,则这 不符合 转换条件。

将自定义市场活动 ID 嵌入应用的Microsoft应用商店页面 URL

若要使用自定义市场活动 ID 为应用创建Microsoft应用商店页面 URL,请执行以下操作:

  1. 为自定义市场活动创建 ID 字符串。 此字符串最多可以包含 100 个字符,不过我们建议你定义易于识别的简短市场活动 ID。

注意

查看 应用购置报告 时,其他开发人员可能会看到市场活动 ID 字符串。 当客户单击自定义市场活动 ID 以在同一会话中输入应用商店并购买另一个开发人员的应用,从而将转换归因于你的市场活动 ID 时,可能会发生这种情况。 该开发人员将看到最初单击市场活动 ID(包括市场活动 ID 的名称)生成的自己的应用转换数,但在单击市场活动 ID 后,他们不会看到有关有多少用户购买了自己的应用(或来自任何其他开发人员的应用)的任何数据。

  1. 获取 HTML 或协议格式的应用应用商店一览的链接。

    • 如果希望客户在任何操作系统的浏览器中导航到应用的基于 Web 的应用商店一览,请使用 HTML URL。 在 Windows 设备上,应用商店应用还将启动并显示应用一览。 此 URL 的格式 https://www.microsoft.com/store/apps/*your app ID*为 . 例如,Skype的 HTML URL 为 https://www.microsoft.com/store/apps/9wzdncrfj364. 可以在应用标识页上找到此 URL

    • 如果你正在从安装了 UWP 应用的设备或计算机上运行的其他 Windows 应用内推广你的应用,或者当你知道你的客户位于支持 Microsoft 应用商店的设备上时,请使用协议格式。 此链接将直接转到应用的应用商店一览,而无需打开浏览器。 此 URL 的格式 ms-windows-store://pdp/?PRODUCTID=*your app id*为 . 例如,Skype的协议 URL 为 ms-windows-store://pdp/?PRODUCTID=9wzdncrfj364.

  2. 将以下字符串追加到应用的 URL 末尾:

    • 对于 HTML 格式 URL,请追加 ?cid=*my custom campaign ID*。 例如,如果 Skype 引入一个带有值 custom_campaign 的市场活动 ID,则包含该市场活动 ID 的新 URL 将是:https://www.microsoft.com/store/apps/skype/9wzdncrfj364?cid=custom\_campaign

    • 对于协议格式 URL,请追加 &cid=*my custom campaign ID*。 例如,如果 Skype 引入一个带有值 custom_campaign 的市场活动 ID,则包含该市场活动 ID 的新协议 URL 将是:ms-windows-store://pdp/?PRODUCTID=9wzdncrfj364&cid=custom\_campaign

以编程方式检索应用的自定义市场活动 ID

如果你的应用是 UWP 应用,则可以使用 Windows SDK 中的 API 以编程方式检索与应用获取关联的自定义市场活动 ID。 这些 API 使许多分析和盈利方案成为可能。 例如,你可以了解当前用户是否在通过 Facebook 市场活动发现应用后获取了你的应用,然后相应地自定义应用体验。 或者,如果你使用的是第三方应用营销提供商,则可以将数据发送回提供商。

仅当客户单击带有嵌入市场活动 ID 的 URL,查看应用的Microsoft应用商店页面,然后获取应用而不离开应用商店一览页时,这些 API 才会返回市场活动 ID 字符串。 如果用户离开页面,然后返回并获取应用,则在使用这些 API 时,这不符合 转换 的条件。

根据你的应用所针对的 Windows 版本,你可以使用不同的 API:

  • Windows 10 版本 1607 或更高版本:在 Windows.Services.Store 命名空间中使用 StoreContext 类。 使用此 API 时,无论用户是否使用已识别的Microsoft帐户登录,都可以检索任何 合格购置的自定义市场活动 ID。

  • Windows 10 版本 1511 或更早版本:在 Windows.ApplicationModel.Store 命名空间中使用 CurrentApp 类。 使用此 API 时,只能检索使用已识别Microsoft帐户登录的合格购置的自定义市场活动 ID

注意

尽管 Windows.ApplicationModel.Store 命名空间在所有版本的 Windows 10 或 Windows 11 中都可用,但如果应用面向 Windows 10 版本 1607 或更高版本,我们建议在 Windows.Services.Store 命名空间中使用 API。 有关这些命名空间之间的差异的详细信息,请参阅应用内购买和试用。 下面的代码示例演示如何构建代码以在同一项目中使用这两个 API。

代码示例

下面的代码示例演示如何检索自定义市场活动 ID。 此示例使用版本自适应代码Windows.Services.StoreWindows.ApplicationModel.Store 命名空间中同时使用这两组 API。 按照此过程,代码可以在任何版本的 Windows 10 或 Windows 11 上运行。 若要使用此代码,项目的目标 OS 版本必须是 Windows 10 周年版(10.0;内部版本 14394 或更高版本 ,尽管最低 OS 版本可以是早期版本。

// This example assumes the code file has using statements for
// System.Linq, System.Threading.Tasks, Windows.Data.Json,
// and Windows.Services.Store.
public async Task<string> GetCampaignId()
{
    // Use APIs in the Windows.Services.Store namespace if they are available
    // (the app is running on a device with Windows 10, version 1607, or later).
    if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent(
         "Windows.Services.Store.StoreContext"))
    {
        StoreContext context = StoreContext.GetDefault();

        // Try to get the campaign ID for users with a recognized Microsoft account.
        StoreProductResult result = await context.GetStoreProductForCurrentAppAsync();
        if (result.Product != null)
        {
            StoreSku sku = result.Product.Skus.FirstOrDefault(s => s.IsInUserCollection);

            if (sku != null)
            {
                return sku.CollectionData.CampaignId;
            }
        }

        // Try to get the campaign ID from the license data for users without a
        // recognized Microsoft account.
        StoreAppLicense license = await context.GetAppLicenseAsync();
        JsonObject json = JsonObject.Parse(license.ExtendedJsonData);
        if (json.ContainsKey("customPolicyField1"))
        {
            return json["customPolicyField1"].GetString();
        }

        // No campaign ID was found.
        return String.Empty;
    }
    // Fall back to using APIs in the Windows.ApplicationModel.Store namespace instead
    // (the app is running on a device with Windows 10, version 1577, or earlier).
    else
    {
#if DEBUG
        return await Windows.ApplicationModel.Store.CurrentAppSimulator.GetAppPurchaseCampaignIdAsync();
#else
        return await Windows.ApplicationModel.Store.CurrentApp.GetAppPurchaseCampaignIdAsync() ;
#endif
    }
}

此代码执行以下操作:

  1. 首先,它会检查当前设备上是否提供了 Windows.Services.Store 命名空间中的 StoreContext 类(这意味着设备正在运行 Windows 10 版本 1607 或更高版本)。 如果是这样,代码将继续使用此类。

  2. 接下来,它会尝试获取当前用户已识别Microsoft帐户的情况的自定义市场活动 ID。 为此,代码获取一个 StoreSku 对象,该对象表示当前应用 SKU,然后它访问 CampaignId 属性以检索市场活动 ID(如果有)。

  3. 然后,该代码会尝试检索当前用户没有识别Microsoft帐户的情况的活动 ID。 在这种情况下,市场活动 ID 嵌入到应用许可证中。 代码使用 GetAppLicenseAsync 方法检索许可证,然后分析许可证的 JSON 内容,以获取名为 customPolicyField1 的密钥的值。 此值包含市场活动 ID。

  4. 如果 Windows.Services.Store 命名空间中的 StoreContext 类不可用,则代码会回退到使用 Windows.ApplicationModel.Store 命名空间中的 GetAppPurchaseCampaignIdAsync 方法检索自定义市场活动 ID(此命名空间在所有版本的 Windows 10 或 Windows 11 中均可用)。 请注意,使用此方法时,只能检索用户已识别Microsoft帐户的合格购置的自定义市场活动 ID

在代理文件中为 Windows.ApplicationModel.Store 命名空间指定活动 ID

Windows.ApplicationModel.Store 命名空间包括 CurrentAppSimulator,这是一个特殊类,用于模拟应用商店操作,以便在将应用提交到应用商店之前测试代码。 此类从 名为Windows.StoreProxy.xml文件的本地文件检索数据。 前面的代码示例演示如何在项目的调试和非调试代码中使用 CurrentApp 和 CurrentAppSimulator。 若要在调试环境中测试此代码,请将 AppPurchaseCampaignId 元素添加到开发计算机上的WindowsStoreProxy.xml文件,如以下示例所示。 运行应用时, GetAppPurchaseCampaignIdAsync 方法将始终返回此值。

<CurrentApp>
    ...
    <AppPurchaseCampaignId>your custom campaign ID</AppPurchaseCampaignId>
</CurrentApp>

Windows.Services.Store 命名空间不提供可用于在测试期间模拟许可证信息的类。 相反,必须将应用发布到应用商店,并将该应用下载到开发设备,以使用其许可证进行测试。 有关详细信息,请参阅应用内购买和试用

测试自定义市场活动

在推广自定义市场活动 URL 之前,建议执行以下操作来测试自定义市场活动:

  1. 登录到用于测试的设备上的Microsoft帐户。

  2. 单击自定义市场活动 URL。 请确保已转到应用页面,然后关闭 UWP 应用或浏览器页面。

  3. 多次单击该 URL,每次访问应用页面后关闭 UWP 应用或浏览器页面。 在访问应用页面之一期间,获取应用以生成转换。 计算单击 URL 的总次数。

  4. 确认购置报表中的“按市场活动 ID 的应用页面查看和转换”与“市场活动总转换”图表中显示了预期的页面查看和转换,并测试应用的代码以确认其是否可以使用上述 API 成功检索市场活动 ID