开发

Meta Store 应用权利检查

更新时间: 2026年4月28日
在 Meta Horizon 商店中销售的应用,如果想要通过 VRC.Quest.Security.1 的安全认证,或者想要实施反盗版措施,可以执行一个平台级别的检查,以验证用户是否合法购买了或获得了您的应用。这个检查被称为“权利检查”。您应该在用户启动应用后的 10 秒内完成权利检查。
用户在进行权利检查时不需要连接到互联网。此外,您必须在应用代码中处理权利检查失败的情况。权利检查失败本身不会导致任何自动操作。例如,如果权利检查失败,您可以向用户显示一个错误消息并退出应用,或者让应用进入一个功能受限的试玩版模式。

执行权利检查

实施初始化函数是集成平台功能的第一步。您可以使用您的应用编号调用两个初始化函数。一个是同步的,在您初始化的线程上运行;另一个是异步的,可让您在 SDK 初始化时执行其他函数,包括调用平台 SDK。您应该使用异步方法来改善应用性能并减少状态管理。
例如:
Platform.Core.AsyncInitialize(appID)
使用异步调用时,SDK 会在完全初始化之前进入一个中间的初始化状态。在这个状态下,您可以运行其他进程,包括调用异步的平台 SDK 方法。在初始化状态下向平台 SDK 发出的请求将被排队,并在 SDK 完成初始化后运行。
在您发出此调用来初始化 SDK 后,验证用户是否有权使用您的应用。该检查必须在用户启动应用后的 10 秒内完成。
Platform.Entitlements.IsUserEntitledToApplication().OnComplete(callbackMethod);
检索对检查的响应后,您需要处理结果。如果用户无权使用您的应用,之前的示例只会记录日志。您可能希望通过向用户显示一条消息来处理这种情况,该消息说明您无法验证他们的凭证,建议他们检查网络连接,然后退出应用。
权利检查失败后,您不能让用户继续使用您的应用。
void callbackMethod (Message msg)
{
  if (!msg.IsError)
     {
       // Entitlement check passed
     }
        else
     {
       // Entitlement check failed. Quit app
     }
 }

权利检查最佳实践

为了权利检查顺利进行,请遵循以下建议:
  • 对于 Android 应用,使用 AsyncInitialize() 而非 Initialize()。这很重要,因为 AsyncInitialize() 不会阻止初始化代码,从而使您的应用程序加载速度更快。此外,如果初始化失败,AsyncInitialize() 在 Android 上不会抛出异常。
  • 用 try/catch 语句块包裹平台 API 初始化代码,并将捕获的任何异常视为权利检查失败来处理。
  • 在 Unity 编辑器的 OculusPlatformSettings(Meta > Platform > Edit Settings)中设置应用编号,或在调用AsyncInitialize() 时传入明确 AppId 参数。对于移动开发者:如果您需要在 Unity 编辑器中运行移动应用,必须在 OculusPlatformSettings 中提供 Meta 登录凭证(用户名/密码)。仅设置应用编号是不够的。

权利检查示例代码

以下是一个 Unity 应用程序的权利检查类的示例代码:
using UnityEngine;
using Oculus.Platform;

public class AppEntitlementCheck : MonoBehaviour
{
    void Awake()
    {
        try
        {
            Core.AsyncInitialize().OnComplete(InitializeCallback);
        }
        catch (UnityException e)
        {
            Debug.LogErrorFormat("Platform failed to initialize due to exception: %s.", e.Message);
            UnityEngine.Application.Quit();
        }
    }

    void InitializeCallback(Message msg)
    {
        if (msg.IsError)
        {
            var err = msg.GetError();
            Debug.LogErrorFormat("Platform failed to initialize due to exception: %s.", err.ToString());
            UnityEngine.Application.Quit();
        }
        else
        {
            Entitlements.IsUserEntitledToApplication().OnComplete(EntitlementCallback);
        }
    }

    void EntitlementCallback(Message msg)
    {
        if (msg.IsError)
        {
            // Implements a default behavior for an entitlement check failure -- log the failure and exit the app.
            // Going into a limited demo mode, or displaying an error, is also valid.
            var err = msg.GetError();
            Debug.LogErrorFormat("Entitlement check failed: %s.", err.ToString());
            UnityEngine.Application.Quit();
        }
        else
        {
            Debug.Log("You are entitled to use this app.");
        }
    }
}
相应流程如下所示:
Entitlement check process
详情请参考权利检查示例应用中的详细示例。
如果您想要验证用户的身份到您的后端服务器,您可以执行额外的用户验证。用户验证会提供一个加密的随机数,您可以将其传递给后端以验证用户的身份。但请注意,这个方法并不代替权利检查。有关如何验证用户的更多信息,请参阅用户验证

权利检查服务器 API

权利检查也可以通过 S2S REST API 来执行。这可以防止在客户端进行任何篡改,还可以提供有关用户权利的更多信息。使用 S2S API 并非强制要求。
如需了解与我们服务器 API 互动的信息,请参阅服务器到服务器 API 基础知识页面。
请求方法/URI:
POST https://graph.oculus.com/$APP_ID/verify_entitlement
参数
参数必要或非必要描述类型示例
access_token
必要
包含 OC|$APP_ID |$APP_SECRET 或用户访问口令的 Bearer 口令
字符串
“OC|1234|456789”
user_id
必要
您想看到购买的用户的用户编号
字符串
“123456789”
请求示例
curl -d "access_token=OC|$APP_ID|$APP_SECRET" -d "user_id=$USER_ID" https://graph.oculus.com/$APP_ID/verify_entitlement
响应示例
{"success":true,"grant_time":1744148687}
字段定义类型
success
定义用户是否拥有商品的所有权。
布尔值
grant_time
用户获得该商品权利的时间 (Unix 时间戳)。
数字

在 Meta Quest 设备上测试权利检查

在将应用上传到 Meta Horizon 商店之前,请测试权利检查,以确保应用符合 VRC 标准

启用开发者模式

每个设备只需执行一次。
注意:如要设置用于开发的 Link PC-VR 设备,请参阅 PC SDK 文档。
完成这些步骤后,您可能需要重启头戴设备。完成上述操作后,头戴设备的资源库会显示一个名为“未知来源”的新选项。

测试权利检查

  1. 在编辑器中,依次点击 Meta > 平台 > 编辑设置,然后将应用编号替换为一串随机数字组成的字符串。
    The Platform Settings dialog box with a random string of numbers
  2. 尝试在编辑器中检查权利,或构建为 APK 并在头戴设备中测试。
  3. 应该无法通过权利检查。

疑难解答

如何在编辑器中测试需要用户通过权利检查的应用功能?
您可以使用 Meta XR 模拟工具进行测试和调试。如要在项目中设置测试用户,请在编辑器菜单中前往 Meta > Platform(平台)> Edit Settings(编辑设置),将 Use Standalone Platform(使用独立平台)设置为 true,并提供具有应用权利的测试用户的凭证。之后,在 Meta XR 模拟工具中运行游戏,权利检查和其他平台调用应能正常运作。
导致一些用户无法通过权利检查的可能原因有哪些?
  • 仅来自受测应用团队的测试用户才能通过权利检查:如果测试用户与应用所属团队不同的团队关联,他们可能没有访问该应用所需的权利,从而导致权利检查失败。
  • 推送应用的新版本:推送应用新版本时,可能会对权利产生影响。请务必确保所有用户处于正确的通道,并且新版本的版本号高于旧版本,以促使用户正确触发更新流程进行权利验证。
  • 需要将 APK 推送至通道以创建初始包名与应用编号映射:对于新应用,包名与应用编号之间的初始映射是在 APK 首次被推送到某个通道时创建的。如果您未完成此步骤,用户将无法通过权利检查,因为系统缺乏验证权利所需的映射关系。如需了解如何查找包名,请参考后续问题解答。
  • 应用编号与包名不匹配:通过上述步骤将应用编号与包名关联后,如果进行权利检查的应用所报告的应用编号和包名与系统记录的该应用编号对应的包名不匹配,系统将无法正确识别和验证与应用相关的权利。请确保用于检查权利的应用编号与应用清单中的包名匹配。如需了解如何查找包名,请参考后续问题解答。
  • 需要将用户或测试用户分配到正确的通道:您需要将用户或测试用户分配到正确的通道,他们才能访问特定应用。这确保他们有权使用该应用并可访问其功能与内容。
如何在 Meta Horizon 开发者面板中查找应用包名?
  1. 选择您的应用程序。
  2. 在左侧导航中,点击发布 > 编译版本
  3. 编译版本页面的编译版本列中,点击想要查看的编译版本的超链接。
  4. “编译版本”>“版本号”页面的详情选项卡下,即可找到包名
Screenshot of finding package name of an App in the developer dashboard