> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Como usar as APIs dos serviços do Xbox

> Inicialize o GRTS, crie um XTaskQueue, configure o rastreamento do HttpClient e chame XblInitialize para começar a usar as APIs C da XSAPI para o XBOX Live no seu título.

## Inicializar o Gaming Runtime Services

As XSAPIs dependem do Gaming Runtime Services (GRTS). Antes de chamar qualquer XSAPI, inicialize o GRTS, conforme mostrado a seguir.

```cpp theme={null}
#include <XGameRuntimeInit.h>
...
HRESULT hr = XGameRuntimeInitialize();
```

## Criar um XTaskQueue (opcional)

A maioria das XSAPIs são APIs assíncronas e exigem o uso de uma fila de tarefas. Trata-se de uma API para enfileirar trabalho e os callbacks de conclusão de tarefas. Para saber mais sobre o `XTaskQueue` e os diferentes modos de despacho, consulte [Design da fila de tarefas assíncronas](https://docs.xbox.com/pt-BR/build/core-features/common/async/async-task-queue-design.md).

Por exemplo, o código a seguir cria uma fila de tarefas usando um pool de threads do sistema.

```cpp theme={null}
#include <XTaskQueue.h>
...
XTaskQueueHandle queue = nullptr;

HRESULT hr = XTaskQueueCreate(
    XTaskQueueDispatchMode::ThreadPool,
    XTaskQueueDispatchMode::ThreadPool,
    &queue)
```

Certifique-se de liberar de volta ao sistema o identificador da fila de tarefas adquirido quando ele não for mais necessário.

```cpp theme={null}
XTaskQueueCloseHandle(queue);
queue = nullptr;
```

Se você optar por não criar sua própria fila de tarefas, certifique-se de passar `nullptr` quando um identificador de fila for necessário. Quando `nullptr` é usado, o sistema de tarefas usa `ThreadPool` por padrão. Isso pode ser substituído chamando [XTaskQueueSetCurrentProcessTaskQueue](https://docs.xbox.com/pt-BR/reference/system/xtaskqueue/functions/xtaskqueuesetcurrentprocesstaskqueue.md).

## Configurar o rastreamento do HttpClient (opcional)

Para ver informações adicionais de depuração em tempo de execução, configure a funcionalidade de rastreamento do `HttpClient`.

O código a seguir define o nível de rastreamento do `HttpClient` e habilita a saída de informações para o depurador.

```cpp theme={null}
HCSettingsSetTraceLevel(HCTraceLevel::Verbose);
HCTraceSetTraceToDebugger(true);
```

## Inicializar a XSAPI

*Inicialize a XSAPI* antes de chamar qualquer XSAPI.

```cpp theme={null}
#include <xsapi-c/services-c.h>
...
XblInitArgs xblArgs = {};
xblArgs.queue = queue; // TODO: Only include this line if you've chosen to create your own XTaskQueue. Otherwise, by default, this line isn't needed.
xblArgs.scid = "00000000-0000-0000-0000-000000000000"; // TODO: Add your scid here.

HRESULT hr = XblInitialize(&xblArgs);
if (FAILED(hr))
{
    // TODO: Handle failure.
}
```

## Conectar o usuário à rede XBOX

A maioria das XSAPIs exige que o usuário primeiro entre na rede XBOX.
Para conectar um usuário à rede XBOX, consulte o exemplo de código da [API XUserAddAsync](https://docs.xbox.com/pt-BR/build/core-features/common/user/xuser_howto_best_practice_signing_in.md).

## Criar um objeto XboxLiveContext

Um objeto `XboxLiveContext` representa o contexto de serviço associado a um usuário específico.

A maioria das XSAPIs exige que você passe um `XboxLiveContextHandle` que representa o contexto do usuário chamador.
Para criar um contexto do XBOX Live (rede), use a [API XblContextCreateHandle](https://docs.xbox.com/pt-BR/reference/live/xsapi-c/xbox_live_context_c/functions/xblcontextcreatehandle.md) e passe o objeto `XUserHandle` obtido na etapa anterior.

## Fazer uma chamada de serviço aos serviços do XBOX

Agora que você tem um objeto `XboxLiveContext` associado ao objeto `XUserHandle` do usuário que entrou, pode fazer chamadas de serviço aos serviços do XBOX.

Por exemplo, para recuperar a lista de amigos do usuário, você pode fazer o seguinte:

```cpp theme={null}
#include <xsapi-c/services-c.h>
...
auto asyncBlock = std::make_unique<XAsyncBlock>(); 
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.

    XblSocialRelationshipResultHandle relationshipResult{ nullptr };
    HRESULT hr = XblSocialGetSocialRelationshipsResult(asyncBlock, &state.socialResultHandle);

    // Use the result in the game.

    XblSocialRelationshipResultCloseHandle(relationshipResult);
};

HRESULT hr = XblSocialGetSocialRelationshipsAsync(
    xboxLiveContext,
    xboxUserId,
    socialRelationshipFilter,
    0,
    0,
    asyncBlock.get()
);

if (SUCCEEDED(hr))
{
    // The call succeeded. Release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
    // If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*.
    asyncBlock.release();
}
// End of code example.
```

## Limpando a XSAPI

Não é necessário chamar `XblCleanupAsync()` em nenhum cenário.

Em um cenário de encerramento do aplicativo, no momento não há uma API síncrona `XblCleanup()` que você possa chamar. O encerramento do aplicativo, pela natureza do seu ciclo de vida, precisa ser tratado de forma síncrona e imediata. Como resultado, conta-se com a limpeza normal no nível do SO — que ocorre com o encerramento do processo do aplicativo —, que é suficiente para essa situação.

Em um cenário em que o aplicativo é suspenso, a XSAPI trata da liberação e, em seguida, da restauração dos recursos do sistema necessários para a operação, a fim de manter a funcionalidade após a retomada.

`XblCleanupAsync()` ainda pode ser usada nos casos em que seu jogo opta por liberar deliberadamente os recursos alocados para a XSAPI.


## Related topics

- [API dos serviços do XBOX](https://docs.xbox.com/pt-BR/services/xbox-services/fundamentals/xbox-services-api/index.md)
- [Visão geral da API dos serviços do XBOX](https://docs.xbox.com/pt-BR/services/xbox-services/fundamentals/xbox-services-api/live-introduction-to-xbox-live-apis.md)
- [Autenticação dos serviços do XBOX (conteúdo)](https://docs.xbox.com/pt-BR/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/live-service-authentication-nav.md)
- [Visão geral dos privilégios de usuário dos serviços do XBOX](https://docs.xbox.com/pt-BR/services/xbox-services/fundamentals/identity/privileges/live-user-privileges-overview.md)
- [Autenticação dos serviços do XBOX para serviços de título](https://docs.xbox.com/pt-BR/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/live-title-service-authentication.md)
