DeePlinging usando o token de história do GWT em uma tela iframe do Facebook
Pergunta
Gostaria de links profundos diretamente para uma página do aplicativo GWT em uma tela iframe do Facebook.
A primeira parte é simples usando o token de história da GWT com URLs como:
http://www.example.com/MyApp/#page1
que abriria a página1 no meu aplicativo.
Os aplicativos do Facebook usam um URL de aplicativo como:
http://apps.facebook.com/myAppName
que enquadra meu URL de retorno de chamada de tela
http://www.example.com/MyApp/
Existe uma maneira de especificar um URL de retorno de chamada de tela (ou URL de marcador) que levará o usuário a uma página específica em vez da página de índice?
Por quê? você pode perguntar. Além de todos os benefícios dos links profundos ...
Quero que o URL "vá para o aplicativo" leve os usuários a uma página de índice com material de marketing (o URL de retorno de chamada de tela)
Quero que o "Bookmark URL" leve os usuários (provavelmente retornando) para uma página de login e ignorando o download do conteúdo de marketing (e esse enorme arquivo SWF).
Solução
Isso pode parecer um hack, mas aqui vai.
O Facebook permite que o aplicativo entre nos parâmetros ao URL? X = 123
Portanto, estou verificando o local da janela para ver se ele contém meu parâmetro 'página' especial e carregando essa página. Abaixo está minha solução, pois estou usando a classe Placemanager da GWT + GWT-Presentador.
O aplicativo URL profundo acaba sendo http://apps.facebook.com/myappname?page=page1
EventBus eventBus = injector.getEventBus();
// Load PlaceManager so it can start listening
PlaceManager placeManager = injector.getPlaceManager();
String currentPlace = History.getToken();
String place = Window.Location.getParameter( "page" );
if (place != null && !place.isEmpty()) {
// send user to the place on the URL line
eventBus.fireEvent( new PlaceRequestEvent( new PlaceRequest( new Place (place) ) ));
} else if ("".equals(currentPlace)) {
// Nothing in URL, load default GWTpage
eventBus.fireEvent( new PlaceRequestEvent(new PlaceRequest( IndexPresenter.PLACE)));
} else {
// fire a body to the Place Manager to activate the requsted Place
placeManager.fireCurrentPlace();
}