quinta-feira, 24 de janeiro de 2013

Facebook, iPad e o problema dos biscoitos


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. :)

2 comentários:

  1. Viva,


    Estou 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!

    ResponderExcluir
  2. Olá Filipe!

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

    ResponderExcluir