Modos de conexão
Modo conectado à nuvem
Quando a rede está disponível ePFGameSaveFilesAddUserWithUiAsync() é concluído com êxito, o sistema opera no modo conectado à nuvem. Nesse modo:
- Todas as APIs funcionam normalmente, com sincronização completa com a nuvem
- Os uploads de dados de salvamento funcionam conforme o esperado
- As informações de cota de armazenamento estão disponíveis
- O monitoramento do dispositivo ativo funciona corretamente
Modo offline (não conectado à nuvem)
Quando a rede não está disponível ou o usuário escolhe jogar offline, o sistema entra no modo offline com funcionalidade limitada. Você pode verificar o status atual da conexão usandoPFGameSaveFilesIsConnectedToCloud() para determinar em qual modo o sistema está operando.
Tratamento de falhas de rede durante a sincronização inicial
QuandoPFGameSaveFilesAddUserWithUiAsync() é chamado sem conectividade de rede, ele aciona um PFGameSaveFilesUiSyncFailedCallback. O retorno de chamada de XAsyncBlock não é acionado enquanto o sistema aguarda a resposta do usuário. A operação assíncrona fica pausada até que o usuário selecione uma ação final.
- Try Again (
Retry): tenta novamente a chamada de rede. Se a nova tentativa também falhar, este retorno de chamada é acionado novamente e o usuário precisa responder outra vez. O retorno de chamada deXAsyncBlockpermanece adiado durante cada ciclo de repetição. - Use Offline (
UseOffline): o retorno de chamada deXAsyncBlocké acionado comS_OK, mas o sistema entra no modo offline (detectável comPFGameSaveFilesIsConnectedToCloud()). - Cancel: o retorno de chamada de
XAsyncBlocké acionado comE_PF_GAMESAVE_USER_CANCELLED.
Comportamento das APIs no modo offline
No modo offline, as APIs se comportam de maneira diferente:APIs que funcionam normalmente
PFGameSaveFilesGetFolder()- Retorna o caminho da pasta de salvamento local
APIs com funcionalidade limitada
PFGameSaveFilesUploadWithUiAsync()- RetornaS_OKimediatamente, mas a conclusão assíncrona retornaE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesGetRemainingQuota()- RetornaE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUDPFGameSaveFilesSetActiveDeviceChangedCallback()- Pode ser definido, mas nunca será acionado
Voltando ao modo online
- Chame
PFGameSaveFilesAddUserWithUiAsync()novamente para tentar se reconectar - Não é necessário reinicializar totalmente o sistema Game Saves
- A interface de falha será exibida novamente se a rede ainda não estiver disponível
- Use
PFGameSaveFilesIsConnectedToCloud()para verificar o status da conexão após as tentativas de repetição
Quando o Game Saves entra no modo offline ou retorna um erro
Uma dúvida comum de integração é: quando a sincronização inicial (PFGameSaveFilesAddUserWithUiAsync) coloca o jogador no modo offline e quando ela falha com um código de erro? Há três resultados finais (conectado, offline ou cancelado), e um cancelamento pode vir do jogador ou do jogo:
Pontos principais:
- O modo offline é um resultado de êxito, não um erro. Ele só é ativado por uma escolha explícita de Use Offline, e a operação assíncrona é concluída com
S_OK. Detecte-o comPFGameSaveFilesIsConnectedToCloud(). - Falhas transitórias/técnicas são exibidas por meio da interface de falha de sincronização, e não retornadas diretamente de
PFGameSaveFilesAddUserWithUiAsync. Em seguida, o usuário (ou sua resposta automática) escolheRetry,UseOfflineouCancel, o que resulta em um dos três resultados acima. - O cancelamento é final e não produz uma pasta de salvamento. Trate “cancelado” (ou qualquer falha que não deixe uma pasta) como não permitir jogar.
- O cancelamento pelo jogador e pelo jogo retornam códigos diferentes. Somente o jogador escolhendo Cancel em um aviso produz
E_PF_GAMESAVE_USER_CANCELLED. Se o seu jogo cancelar a operação por conta própria comXAsyncCancel, ela será concluída comE_ABORT. Verifique ambos se quiser tratá-los da mesma forma.
Cancelar um aviso de conflito também é final. Ele é concluído com
E_PF_GAMESAVE_USER_CANCELLED e não passa automaticamente para um aviso “Use Offline” de falha de sincronização. Se você quiser uma experiência de “rejeitar o conflito, mas continuar jogando offline”, projete-a explicitamente (por exemplo, execute novamente PFGameSaveFilesAddUserWithUiAsync e selecione Use Offline na falha resultante). Consulte Conflitos do Game Saves.Códigos de erro do Game Saves
Os HRESULTs a seguir são definidos pelo SDK do Game Saves. Os códigos no intervalo0x8923xxxx são específicos do Game Saves; 0x800704C7 é HRESULT_FROM_WIN32(ERROR_CANCELLED).
Para saber como esses resultados são produzidos pela interface interna do sistema (fora do processo) em comparação com seus próprios retornos de chamada, consulte Retornos de chamada de interface do Game Saves.
Cenários adicionais de status de conexão
A APIPFGameSaveFilesIsConnectedToCloud() é particularmente útil porque a desconexão pode acontecer de várias maneiras:
- Rede indisponível durante a sincronização: o usuário escolhe explicitamente jogar offline
- Dispositivo ativo alterado: outro dispositivo assume como dispositivo ativo, colocando automaticamente este dispositivo no modo offline
Práticas recomendadas para suporte offline
- Sempre implemente retornos de chamada de falha de sincronização para lidar com problemas de rede de forma adequada
- Verifique o status da conexão regularmente usando
PFGameSaveFilesIsConnectedToCloud()antes de tentar operações na nuvem - Informe os jogadores quando estiver operando no modo offline, para que eles entendam que os salvamentos não serão sincronizados
- Forneça opções de repetição quando a conectividade de rede for restaurada
- Os salvamentos locais sempre funcionam - os jogadores podem continuar jogando independentemente do status da rede
- Monitore a desconexão - lembre-se de que os dispositivos podem ser desconectados quando outro dispositivo se torna ativo
Comportamento de upload no modo conectado
Mesmo no modo conectado, os uploads podem falhar devido a problemas de rede ou limites de taxa. Quando isso acontece, o retorno de chamada deXAsyncBlock não é acionado imediatamente. A operação assíncrona é pausada enquanto o sistema aguarda a resposta do usuário por meio da máquina de estados dos retornos de chamada de interface:
- O
PFGameSaveFilesUiSyncFailedCallbacké acionado com os detalhes do erro. - O retorno de chamada de
XAsyncBlockainda não é acionado. A operação fica pausada enquanto o sistema aguarda uma resposta. - Se o usuário selecionar
Retry, o upload será repetido. Se falhar novamente, o retorno de chamada será acionado outra vez e o usuário precisará responder novamente. - Se o usuário selecionar
Cancel, o retorno de chamada deXAsyncBlockserá acionado comE_PF_GAMESAVE_USER_CANCELLED. - Se uma nova tentativa tiver êxito, o retorno de chamada de
XAsyncBlockserá acionado comS_OK.
PFGameSaveFilesUploadWithUiAsync() novamente mais tarde, quando a rede for restaurada.
No processo, não ofereça
Use Offline no aviso de falha de sincronização enquanto um upload estiver em execução. O upload aciona o mesmo PFGameSaveFilesUiSyncFailedCallback que a sincronização inicial, portanto o SDK não restringe as opções. No entanto, se o seu jogo responder com UseOffline a uma falha de upload, o upload falhará com E_ABORT (e os builds de depuração disparam uma asserção). Ofereça apenas Retry e Cancel nesse caso.Quando um upload deixa a sessão offline
Normalmente, um upload não altera o modo de conexão, mas ele pode terminar com a sessão offline nos casos a seguir. Em cada um deles, o upload é concluído comE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD, e PFGameSaveFilesIsConnectedToCloud() retorna false depois.
- A sessão já estava offline. O upload não é executado e é concluído com
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD, mesmo que a rede tenha sido restaurada. - A nuvem tem um salvamento mais recente. Se o serviço informar que um salvamento mais recente foi confirmado a partir de outro dispositivo quando o upload for finalizado, o Game Saves coloca a sessão offline, aciona o retorno de chamada de alteração do dispositivo ativo e conclui o upload com
E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD. - O jogador escolhe
Use Offlineno aviso de novo bloqueio. Se um upload anterior confirmou seus dados, mas falhou depois, o próximo upload primeiro precisa readquirir o bloqueio de salvamento. Um aviso de falha de sincronização durante essa etapa pode ser respondido comUseOffline, o que deixa a sessão offline e conclui o upload comE_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD.
PFGameSaveFilesAddUserWithUiAsync() novamente.
Cancelando um upload
Um upload pode ser cancelado da mesma forma que a sincronização inicial: o usuário pode usarCancel na interface de progresso enquanto o upload está em andamento ou usar Cancel no aviso de falha de sincronização se o upload encontrar um erro. Em ambos os casos, PFGameSaveFilesUploadWithUiAsync() é concluído com E_PF_GAMESAVE_USER_CANCELLED (0x800704C7) e o salvamento não é enviado. Seus resultados finais são êxito, cancelado ou falha (em que E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD significa que a sessão agora está offline; consulte Quando um upload deixa a sessão offline). Trate E_PF_GAMESAVE_USER_CANCELLED separadamente de outras falhas para que você possa distinguir “o jogador desistiu” de “o upload apresentou erro”. Se o seu jogo cancelar o upload por conta própria com XAsyncCancel, ele será concluído com E_ABORT em vez de E_PF_GAMESAVE_USER_CANCELLED.