Aqueles que convivem comigo nas redes sociais foram, há pouco tempo, testemunhas de uma breve inundação de postagens de conteúdo "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, responsável 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, á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 protótipo 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 relâmpago sobre a linguagem e sua integração com a Unity.
Eis a situação: criar um aplicativo para iPad onde múltiplos usuários poderiam interagir com uma realidade aumentada e postar sobre no Facebook.
Eis o problema: grande parte dos aplicativos e sistemas construídos para iOS são desenvolvidos levando em consideração que o aparelho terá apenas um proprietário. Sendo assim, apesar da função logout() estar disponível 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 fórum 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 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"{
void SignOut(){
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *each in cookieStorage.cookies) {
[cookieStorage deleteCookie:each];
}
}
}
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. :)
Viva,
ResponderExcluirEstou com o mesmo problema, mas não tenho muita experiência com Objective-C e plugins do Unity. Podes esclarecer o processo de criação deste plugin?
Obrigado!
Olá Filipe!
ResponderExcluirMande-me um email em moraleidahgo@gmail.com e ficarei feliz em fornecer mais detalhes sobre o processo de desenvolvimento do plugin.
Obrigado por acessar o blog e desculpe a demora a responder.
Um abraço.