Facebook, iPad e o problema dos biscoitos
Autor: Hugo Moraleida | Publicado: 2013-01-24T19:30:00-08:00




Aqueles que convivem comigo nas redes sociais foram, há pouco tempo, testemunhas de uma breve inundação de postagens de&nbsp;conteúdo&nbsp;"incomum" (temo inclusive ter sido bloqueado pelos menos pacientes :P).

Uma de minhas atividades mais recentes foi o estudo de um plugin da Prime 31 (empresa especializada em desenvolver plugins para a Unity), o iOS Social Networking Plugin,&nbsp;responsável&nbsp;por realizar a conexão de aplicativos Unity iOS com o Facebook, prevenindo o desenvolvedor de ter que lidar com Objective-C para tal. O plugin permite publicar imagens, status, links,&nbsp;álbuns e recuperar informações do usuário como email, nome e idade.

A dita inundação de postagens foi uma série de testes acerca da configuração e funcionamento do plugin, resultando na publicação de diversas "Awesome iPad + Unity integration test!" e imagens da interface do&nbsp;protótipo&nbsp;na minha timeline (todas sumariamente apagadas pouco tempo depois).

Ironicamente, o plugin, que foi adquirido com a intenção de evitar o uso direto do Objective-C, foi exatamente a causa de um estudo&nbsp;relâmpago&nbsp;sobre a linguagem e sua integração com a Unity.


Eis a situação: criar um aplicativo para iPad onde &nbsp;múltiplos usuários poderiam interagir com uma realidade aumentada e postar sobre no Facebook.
Eis o problema: grande parte dos aplicativos e sistemas&nbsp;construídos&nbsp;para iOS são desenvolvidos levando em consideração que o aparelho terá apenas um&nbsp;proprietário. Sendo assim, apesar da função logout() estar&nbsp;disponível&nbsp;na biblioteca do Social Networking Plugin, ela meramente invalida a sessão e o token de acesso, mantendo os cookies do usuário.
Eis o resultado: é impossível utilizar uma conta diferente após o login inicial no aplicativo.

Informado pelo usuário da Prime 31 no&nbsp;fórum&nbsp;da Unity de que não havia maneira fácil para a correção do "problema", iniciei o processo de pesquisa de como resolver o impasse da maneira&nbsp;difícil: Escrever uma função em Objective-C para limpar os cookies do aplicativo entre sessões.

Depois de encarar alguns tutoriais sobre uma das sintaxes mais bizarras que já vi e aprender sobre o funcionamento de scripts escritos em linguagens baseadas em C na Unity, encontrei um tópico no qual um desenvolvedor que compartilhava do meu problema (porém não especificamente com um aplicativo feito na engine) propôs uma solução relativamente simples:



#import "CleanCookies.h"

@implementation CleanCookies

@end

extern "C"{

&nbsp; &nbsp;void SignOut(){

&nbsp; &nbsp; &nbsp; &nbsp; NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

&nbsp; &nbsp; &nbsp; &nbsp; for (NSHTTPCookie *each in cookieStorage.cookies) {

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [cookieStorage deleteCookie:each];

&nbsp; &nbsp; &nbsp; &nbsp; } &nbsp;

&nbsp; &nbsp; }

}

O trecho acima, escrito em Obj-C, percorre e remove todas as instancias de cookies armazenadas pelo aplicativo utilizando a classe NSHTTPCookieStorage, nativa da linguagem e responsável pelo gerenciamento dos ditos cookies.

Há duas principais maneiras de se integrar um script de linguagem diferente de C#, Javascript ou Boo com a Unity: Adicionar os arquivos em uma pasta com o nome"Plugins" e integrar com o C# utilizando o comando [DllImport()]ou, no caso de linguagens não baseadas em C, converter os scripts para uma dll e interagir com as classes normalmente.

Apesar de relativamente simples, foi um problema incômodo que atrasou a integração com o aplicativo, o que me faz questionar a razão da Prime 31 não ter implementado esse recurso ela mesma. Especialmente considerando-se que eu não sou o primeiro a ter esse problema.

Se estiver passando pela mesma situação e tiver alguma dúvida, não hesite em perguntar. :)