接收邀请

使用本主题将游戏邀请添加到 Xbox 服务游戏。 为了让你的游戏收到多人游戏邀请,需要注册多人游戏协议和游戏邀请回调。 你的游戏接收本地用户的邀请,然后将该用户加入多人游戏会话。

先决条件

若要在 Windows 电脑上接收游戏邀请通知,请安装 Xbox 游戏栏。 默认情况下,Xbox 游戏栏应用安装在 Windows 10,操作系统版本 1903 或更高版本上。 选择Windows 徽标键+G启动 Xbox 游戏栏应用,以验证其是否正确安装。

注意

如果 Windows 电脑上未安装 Xbox Game Bar,则可以从 Microsoft Store安装。

注册多人游戏协议

注册多人游戏协议可告知系统在用户接受多人游戏邀请时如何启动游戏。 要注册多人游戏协议,需要将一个 MultiplayerProtocol 元素添加到 MicrosoftGame.config 文件,如以下代码所示。

    <MultiplayerProtocol>true</MultiplayerProtocol>

如果包中有多个可执行文件,则可以使用 Executable 属性指定哪个可执行文件应处理多人游戏协议,如以下代码所示。

    <MultiplayerProtocol Executable="MyExecutableForMultiplayer.exe">true</MultiplayerProtocol>

注册多人游戏邀请回调

要接收多人游戏邀请回调,需使用 XGameInviteRegisterForEvent API 注册游戏邀请回调,如以下代码所示。

有关注册和注销游戏邀请回调的详细信息,请参阅 XVentInistereRegisterForEventXVentInventeUnregisterForEvent

平面 C

#include <XTaskQueue.h>
#include <XGameInvite.h>  
  
XTaskQueueHandle g_taskQueue;  
XTaskQueueRegistrationToken g_gameInviteEventToken;  
  
void OnGameInvite(void* context, const char* inviteUri)  
{  
    if (inviteUri != nullptr)
    {
        std::string inviteString(inviteUri);
        auto pos = inviteString.find("handle=");
        auto handleId = inviteString.substr(pos + 7, 36);
        // Now call XblMultiplayerManagerJoinLobby
    }
}  
  
void InitializeGame()  
{  
    XGameInviteRegisterForEvent(g_taskQueue, nullptr, OnGameInvite, &g_gameInviteEventToken);  
}  
  
void ShutdownGame()  
{  
    XGameInviteUnregisterForEvent(g_gameInviteEventToken);  
}  

若要正确处理“从暂停状态接受邀请”情况,游戏必须存储inviteUriXGameInviteRegisterForEvent 回调传入上述示例代码中 OnGameInvite() 的处理方法。 然后,游戏必须等待通知,RegisterAppStateChangeNotification当其完全恢复时, 通过使用在 inviteUri 中提供的详细信息,游戏才继续在会话中操作。

有关 RegisterAppStateChangeNotification 的详细信息,请参阅 Xbox 游戏生命周期(NDA 主题)要求授权

Parsing inviteUrl from XGameInviteEventCallback

当你的游戏收到 XGameInviteEventCallback 事件时,你将访问 inviteUrl 字符串。 inviteUrl 是以下格式之一。

对于接受游戏邀请

当用户接受游戏邀请后,游戏通过 inviteUri 收到其邀请回调,如以下代码所示。

    "ms-xbl-multiplayer://inviteHandleAccept?handle=%s&invitedXuid=%s&senderXuid=%s&context=%s"
    
    // for example:
    // "ms-xbl-multiplayer://inviteHandleAccept?handle=00000000-0000-1234-5678-1234567890ab&invitedXuid=1234567890123456&senderXuid=6543210987654321&context="

URI 始终以"ms-xbl-startser/"开头,然后为以下句柄。

  • inviteHandleAccept 指示因为用户接受了游戏邀请,回调已启动。
  • handle 是你用来加入多人游戏会话的邀请句柄。
  • invitedXuid 是受邀参加多人游戏会话的 Xbox 服务用户的 ID。
  • senderXuid 是已发送游戏邀请的 Xbox 服务用户的 ID。
  • context 是发送者可能已包括的附加(可选)上下文。

对于加入进行中的游戏会话

当用户尝试加入多人游戏会话时,游戏将使用 inviteUri 接收游戏邀请回调,如下代码所示。

    "ms-xbl-multiplayer://activityHandleJoin?&handle=%s&joinerXuid=%s&joineeXuid=%s"

URI 始终以"ms-xbl-startser/"开头,然后为以下句柄。

  • activityHandleJoin 指示因为用户接受了游戏邀请,回调已启动。
  • handle 是你用于加入多人游戏会话的活动句柄。
  • joinerXuid 是尝试加入多人游戏会话的 Xbox 服务用户的 ID。
  • joineeXuid 是目前已在多人游戏会话中的 Xbox 服务用户的 ID。

加入使用句柄的多人游戏会话

使用多人游戏管理器

如果你正在使用多人游戏管理器,则可以使用 XblMultiplayerManagerJoinLobby API 传入从 inviteUrl 提取的 handleId,将用户加入多人游戏会话。 还可对invitedXuid 使用 xblUserHandle ,如以下代码所示。

平面 C

HRESULT hr = XblMultiplayerManagerJoinLobby(handleId, xblUserHandle);

直接使用多人游戏 API

如果你正在使用多人游戏API,请使用以下步骤来配置多人游戏会话和游戏邀请。

  1. 使用 XblMultiplayerGetSessionByHandleAsync API 提取多人游戏会话文档,然后传入 handleId
  2. 使用 XblMultiplayerSessionJoin API 将本地用户加入多人游戏会话文档。
  3. 使用 XblMultiplayerWriteSessionByHandleAsync API 将多人游戏会话文档写入服务,以提交此更改。

另请参阅

XGameInvite API
处理协议激活以启动游戏,使用多人游戏管理器