> ## 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.

# Introdução ao iOS e ao macOS

> Requisitos de integração do PlayFab Party para iOS e macOS, incluindo vinculação de frameworks do Xcode, direitos de acesso ao microfone e configuração de áudio em segundo plano.

Este documento lista os pré-requisitos e requisitos básicos necessários para integrar o PlayFab Party aos seus aplicativos iOS ou macOS. Depois de concluir as etapas específicas da plataforma, confira o [Início rápido do PlayFab Party](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/quickstart.md) para concluir a introdução ao PlayFab Party.

## Pré-requisitos

Antes de iniciar este tutorial, verifique se os seguintes pré-requisitos foram atendidos:

1. Você criou uma [conta de desenvolvedor do PlayFab](https://developer.playfab.com)
2. Você criou um título do PlayFab e seu título foi incluído na lista de permissões do PlayFab Party
3. Você tem o Xcode versão 10.2.1 ou superior instalado
4. Você tem acesso ao [repositório de plataformas do PlayFab Party](https://github.com/PlayFab/PlayFabParty)
5. Você criou uma conta de desenvolvedor da Apple que pode ser usada para assinar seu aplicativo para implantação.

OBSERVAÇÃO: Se você planeja usar o simulador do Xcode para testes, precisará direcionar seu aplicativo para a arquitetura de 64 bits (\$(ARCHS\_STANDARD\_64\_BIT)). Atualmente, não há suporte para simuladores de 32 bits.

## Incluindo as bibliotecas e os arquivos de cabeçalho necessários

### Cabeçalhos

* Você precisará incluir os seguintes arquivos de cabeçalho do [repositório de distribuição do PlayFab Party](https://github.com/PlayFab/PlayFabParty/releases).

### Frameworks

* Você precisará vincular seu aplicativo aos seguintes frameworks, que também se encontram nos pacotes de distribuição do PlayFab Party.
  * iOS: PlayFabParty
  * macOS: PlayFabPartyMac

> [!NOTE]
>
> As bibliotecas SSL são compiladas a partir do [Open SSL versão XXX](https://github.com/openssl/openssl/tree/OpenSSL_1_1_1-stable). Use uma versão do OpenSSL XXX ou superior

Inclusões de cabeçalho

[Cabeçalhos do Party](https://github.com/PlayFab/PlayFabParty/tree/master/include)

Além dos arquivos de biblioteca e cabeçalhos acima, você também precisará das bibliotecas e cabeçalhos do PlayFab SDK e de quaisquer outras dependências específicas da plataforma de que seu aplicativo precise. Confira a organização dos arquivos de projeto do exemplo para iOS para obter mais informações.

## Etapas para fazer o PlayFab Party funcionar no iOS ou no macOS

Como a biblioteca principal do Party é escrita em C++, ela pode ser acessada diretamente a partir de código Objective-C++. Por conveniência, criamos uma classe wrapper simples em Objective-C++ para acessar a funcionalidade da biblioteca do Party. Em linhas gerais, você vai querer uma classe que tenha acesso aos métodos da API do Party para criar uma rede, conectar-se a uma rede e enviar mensagens por uma rede. A [SimpleClientClass](https://github.com/PlayFab/PlayFabParty/blob/docs/iOS/PartySample/app/inc/SimpleClient.h) é mostrada como exemplo no nosso aplicativo de demonstração para iOS.

```obj-c theme={null}
//
//  SimpleClient.h
//  chatdemo_ios

#import <Foundation/Foundation.h>
#import "ChatEventHandler.h"

@interface SimpleClient : NSObject

@property (nonatomic) id<ChatEventHandler> chatEventHandler;

-(void) initialize;
-(void) setHandler:(id<ChatEventHandler>) messageHandler;
-(void) signInLocalUser;

-(void) createNetwork:(NSString*) networkId;
-(void) joinNetwork:(NSString*) networkId;
-(void) leaveNetwork;

-(void) sendTextAsVoice:(NSString*) text;
-(void) sendTextMessage:(NSString*) text;
-(void) setLanguageCode:(int) languageIndex;
-(NSArray *) getLanguageOptions;
-(int) getDefaultLanguageIndex;

-(NSString*) getSelectedUserName;

-(void) tick;

+(void) globalInitialize;
+(void) globalShutdown;

@end

```

A ponte de objetos acima é apoiada por um arquivo de implementação em C++ puro que chama o [NetworkManager.cpp](https://github.com/PlayFab/PlayFabParty/blob/docs/android/PartySampleNetworkCommon/lib/NetworkManager.cpp), que, por sua vez, chama as APIs do Party.

Veja um trecho de exemplo que mostra as várias camadas:

A interface Objective-C SimpleClient expõe um método para inicializar o PlayFab Party.

```obj-c theme={null}
// In SimpleClient.h
-(void) createNetwork:(NSString*) networkId;
```

A implementação do SimpleClient também inclui uma referência ao objeto C++ que chama as APIs do Party por meio do gerenciador de rede.

```obj-c theme={null}
// In SimpleClient.mm

@interface SimpleClient ()

@end

@implementation SimpleClient

SimpleClientImpl* m_impl;
```

O SimpleClientImpl é uma classe C++ que faz o trabalho pesado de criar a rede do Party, conforme mostrado no trecho de código abaixo:

```cpp theme={null}
void
SimpleClientImpl::CreateNetwork(
    std::string &networkId
    )
{
    if (g_isRunning && g_initializeCompleted)
    {
        Managers::Get<NetworkManager>()->Initialize(c_pfTitleId);
        m_messageHandler->OnStartLoading();
        Managers::Get<NetworkManager>()->CreateAndConnectToNetwork(
            networkId.c_str(),
            [this, networkId](std::string message)
            {
                this->SendSysLogToUI("create network: %s", message.c_str());
                Managers::Get<PlayFabManager>()->SetDescriptor(
                    networkId,
                    message, 
                    [this, message](void)
                    {
                        m_messageHandler->OnEndLoading();
                        this->SendSysLogToUI("set network descriptor %s", "successed");
                        std::string l_message = message;
                        m_messageHandler->OnNetworkCreated(l_message);
                    });
            },
            [this](PartyError error)
            {
                m_messageHandler->OnEndLoading();
                this->SendSysLogToUI("create network failed: %s", GetErrorMessage(error));
            });
    }
}
```

No trecho de código acima, o SimpleClient chama NetworkManager::CreateAndConnectToNetwork(), que, por sua vez, chama a API bruta do Party exposta em [Party.h](https://github.com/PlayFab/PlayFabParty/blob/docs/include/Party.h)

```cpp theme={null}
void 
NetworkManager::CreateAndConnectToNetwork(
    const char *networkId, 
    std::function<void(std::string)> callback, 
    std::function<void(PartyError)> errorCallback
    )
{
    DEBUGLOG("NetworkManager::CreateAndConnectToNetwork()\n");

    // Set the maximum number of devices allowed in a network to 16 devices
    constexpr uint8_t c_maxSampleNetworkDeviceCount = 16;
    static_assert(c_maxSampleNetworkDeviceCount <= c_maxNetworkConfigurationMaxDeviceCount, "Must be less than or equal to c_maxNetworkConfigurationMaxDeviceCount.");

    // Initialize network configuration for Party Network.
    PartyNetworkConfiguration cfg = {};
    cfg.maxDeviceCount = c_maxSampleNetworkDeviceCount;
    cfg.maxDevicesPerUserCount = 1;
    cfg.maxEndpointsPerDeviceCount = 1;
    cfg.maxUserCount = c_maxSampleNetworkDeviceCount;
    cfg.maxUsersPerDeviceCount = 1;

    //Get the uid from the local chat control
    PartyString uid = nullptr;
    PartyError err = m_localUser->GetEntityId(&uid);

    if (PARTY_FAILED(err))
    {
        DEBUGLOG("GetUserIdentifier failed: %s\n", GetErrorMessage(err));
        errorCallback(err);
        return;
    }

    // Setup the network invitation configuration to use the network id as an invitation id and allow anyone to join.
    PartyInvitationConfiguration invitationConfiguration{
        networkId,                                  // invitation identifier
        PartyInvitationRevocability::Anyone,        // revokability
        0,                                          // authorized user count
        nullptr                                     // authorized user list
    };

    // Initialize an empty network descriptor to hold the result of the following call.
    PartyNetworkDescriptor networkDescriptor = {};

    // Create a new network descriptor
    err = PartyManager::GetSingleton().CreateNewNetwork(
        m_localUser,                                // Local User
        &cfg,                                       // Network Config
        0,                                          // Region List Count
        nullptr,                                    // Region List
        &invitationConfiguration,                   // Invitation configuration
        nullptr,                                    // Async Identifier
        &networkDescriptor,                         // OUT network descriptor
        nullptr                                     // applied initialinvitationidentifier.
    );

    if (PARTY_FAILED(err))
    {
        DEBUGLOG("CreateNewNetwork failed: %s\n", GetErrorMessage(err));
        errorCallback(err);
        return;
    }

    // Connect to the new network
    if (InternalConnectToNetwork(networkDescriptor, networkId, errorCallback))
    {
        m_state = NetworkManagerState::WaitingForNetwork;
        m_onnetworkcreated = callback;
        m_onnetworkcreatederror = errorCallback;
        m_onnetworkconnectedError = errorCallback;
    }
}
```

De forma semelhante, cada método da interface Objective-C SimpleClient é mapeado para a API do Party por meio do `SimpleClientImpl` e do `NetworkManager`.

## Comentários

Se o PlayFab Party for usado para chat de voz, o aplicativo precisará receber acesso ao microfone. Para isso, verifique se a seguinte propriedade foi adicionada ao arquivo Info.plist do aplicativo.

```
<key>NSMicrophoneUsageDescription</key>
<string>The application requires access to the microphone for voice chat.</string>
```

## Próximas etapas

Depois de concluir as etapas específicas da plataforma para integrar a biblioteca do Party ao seu aplicativo iOS ou macOS, consulte o [Início rápido do PlayFab Party](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/quickstart.md) para concluir a introdução ao PlayFab Party.


## Related topics

- [SDK do PlayFab Services](https://docs.xbox.com/pt-BR/services/playfab/sdks/c/index.md)
- [Início rápido macOS](https://docs.xbox.com/pt-BR/services/playfab/sdks/c/quickstart-macos.md)
- [Introdução ao toque](https://docs.xbox.com/pt-BR/build/core-features/common/game-streaming/game-streaming-getting-started-with-touch.md)
- [Introdução ao Linux](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/linux-specific-requirements.md)
- [Introdução ao Android](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/android-specific-requirements.md)
