Facebook aplikationer og Flash - navigateToUrl drilleri

Vi er i øjeblikket i fuld gang med at lave en Facebook aplikation der i høj grad benytter sig af Flash (mere om den senere), og i den forbindelse er jeg stødt på et par mindre besværligheder.

Den første og største var, at Facebook når man bruger FBML (fb:swf) automatisk sætter alle Flash-objekter til at kører med allowScriptAccess=never.

Det er en sikkerhedsbegrænsning de har sat på, for at alle vi udviklere ikke uhæmmet skal kunne kalde en masse javascript-funktioner og dermed få adgang til data som vi ikke skal have adgang til.
Problemet med det er så, at det også sætter en række begrænsninger for funktioner som man ikke nødvendigvis ved bruger javascript, eksempelvis navigateToUrl, som pludselig er begrænset til kun at kunne bruge _blank, og det er jo helt umuligt at lave en lækker aplikation i Flash, hvis alle sider åbner i nye vinduer.

Det ved Facebook også godt og derfor er der en metode til at komme uden om problemet, nemlig ved at bruge en Flash-fil som Facebook har lavet som en bro.
Lyder det indviklet? Det er det også lidt og det tog mig noget tid at lure, så derfor kommer opskriften her.

Før skal man indsætte den Facebook-bro som man senere skal tilgå via LocalConnection:

<fb:fbjs-bridge/>
<fb:swf swfbgcolor="FFFFFF"
	swfsrc='http://www.dinurl.dk/din.swf'
	width='760'
	height='600'
	/>
<script> <!-- --></script>

Dernæst, så skal man bruge en funktion som tilgår broen og som kan bruges som erstatning for navigateToUrl, selv lavede jeg denne lille klasse, men det kan gøres på mange måder:

import flash.net.LocalConnection;
import flash.display.LoaderInfo;

public class FacebookUtil {
	private var connection:LocalConnection;
	private var connectionName:String;
	private var baseUrl:String = "http://apps.facebook.com/dinaplikation/";

	public function init(_loaderInfo:LoaderInfo):void {
		connection = new LocalConnection();
		connectionName = _loaderInfo.parameters.fb_local_connection;
	}

	function go(_url:String):void {
		if (connectionName) {
			connection.send(connectionName,
			"callFBJS",
			"document.setLocation",
			[baseUrl + _url]
			);
		} else {
			trace("FacebookUtil.go: No connection");
		}
	}
}

Som du kan se, så har den en init funktion, og det er fordi at Facebook som standard sender nogle værdier med til alle fb:swf objekter, og nogle af dem har vi brug for, så derfor skal klassen klargøres inden man kan kalde funktionen go, som det hele drejer sig om:

var Facebook:FacebookUtil = new FacebookUtil();

Facebook.init(LoaderInfo(this.root.loaderInfo));

Facebook.go("minside.php");

I den klasse jeg lige har lavet er der ikke mulighed for at sætte target, da jeg kun havde brug for _self, men det kan den sagtens udvides med.

Håber det kan gøre vejen til din første Facebook aplikation i Flash lidt nemmere :-)



Del:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • del.icio.us
  • digg

2 kommentarer

  1. Ronni Persson siger: (29. januar 2009 kl. 21:20 )

    Er der en specifik grund til at du har valgt ikke at lægge init functionen som en contructor?

  2. Mads Buch Stage siger: (30. januar 2009 kl. 10:17 )

    Nej, det er der ikke :-)

Skriv en kommentar