小试Flash CS5开发iPhone应用程序

flash&itunes

Adobe 在他们的 Flash CS5 中加入了将Flash发布为 iPhone/iPod Touch 应用程序的功能。这对广大移动平台的开发者来说本是一件大好事,不过一意孤行的苹果早早地就更新了开发者协议,严禁第三方跨平台编译器,仅允许自家Mac OS上使用Objective-C原生编写的程序在App Store上架。这也基本上给Flash等其他开发和编译工具判了死刑。虽说这规定在CS5系列正式发布前几天出台,Adobe猝不及防。不过在广大的越狱机器上,我们可以轻松地安装非官方授权的应用程序。所以这新功能还是有点用武之地的,今天就让我们来看看Flash在iPhone/iPod Touch上的表现。

在Flash CS5新建文档时,直接选择iPhone OS即可建立320x480尺寸的发布为iPhone应用程序的文件了。除了舞台小一点,和平时使用Flash没什么区别。而专属的iPhone应用程序发布设置,也和AIR平台的发布设置非常类似,有三个选项卡。

设置选项中可以指定应用程序的名称、屏幕方向等,还可以指定图标。值得一提的是,想要真正发布ipa文件,你需要拥有Apple给开发者的数字证书和Provision Profiles。这个东东要在Apple的开发者网站上注册并且付费$99后才会获得(Adobe这不是热脸贴了Apple的冷屁股嘛~)。好在我们有专供测试用的文件,大家可以点击这里下载,证书密码是1234。这里还有一个iPhone部署类型的选项,前两个是用来进行终端测试的,执行的效率可能会比后面两种低一些。

Demo

为了测试,我做了一个两帧的Demo程序。大家可以在这里下载到fla源文件。Flash生成ipa文件时花费的事件很长,有兴趣的可以点击这里下载ipa文件实机测试。

Frame 1

第一帧上有个简单的动画和三个交互的按钮,按了按钮后会在上方显示该按钮实例的名称并播放一个音效,当然还有一个前往下一个画面的按钮。这一页大约算一个Hello World吧,因为都是用的非常基本的功能,例如动画的显示,简单的按钮交互等等。ActionScript 3 代码自然不长,如下:

import flash.events.Event;
import flash.media.Sound;

stop();

btn1.addEventListener(MouseEvent.CLICK,btnClick);
btn2.addEventListener(MouseEvent.CLICK,btnClick);
btn3.addEventListener(MouseEvent.CLICK,btnClick);
nextBtn.addEventListener(MouseEvent.CLICK,testPage);

function btnClick(e:Event):void {
	var s:Sound = new MouseClickSound;
	s.play();
	text.text = e.target.name + " Clicked!";
}

function testPage(e:Event):void {
	nextFrame();
}

Frame 2

第二帧其实是一个简单的Benchmark,我主要是想看看iPhone平台上的Flash能跑多快。据我观察,这其实可以看做是iPhone平台的AIR移动设备应用程序,也就是和J2ME类似的,是运行在虚拟机中的。Flash很可能是做了一个iPhone平台的Flash Player然后让swf在里面播放。这样效率如何真的就拿捏不准了。Benchmark有三项作业,第一是在舞台随机位置上绘制10000个静态的MovieClip,第二是将它们从舞台上去除,第三是计算1000000个0-10000之间整数的和。我在电脑上的测试环境中的结果详见左边的截图。该帧的AS如下:

import flash.events.Event;
import flash.text.TextField;
import flash.utils.getTimer;

startBtn.addEventListener(MouseEvent.CLICK,startTest);

function startTest(e:Event):void {
	var i:int;
	var time1 = getTimer();
	results.appendText("Test Started!\n");

	var c:Array = new Array(10000);
	for (i=0; i<10000; i++) {
		c[i] = new ico();
		c[i].x = Math.random() * 320;
		c[i].y = Math.random() * 480;
		addChild(c[i]);
	}
	var time2 = getTimer();
	results.appendText("Add 10000 MovieClip: "+ (time2-time1)+"ms\n");

	for (i=0; i<10000; i++) {
		removeChild(c[i]);
	}
	c = null;
	var time3 = getTimer();
	results.appendText("Remove 10000 MovieClip: "+ (time3-time2)+"ms\n");

	var sum:Number = 0;
	for (i=0; i<1000000; i++) {
		sum +=  Math.ceil(Math.random() * 10000);
	}
	results.appendText("1000000 random integers' sum: \n");
	var time4 = getTimer();
	results.appendText(sum+", time: "+(time4-time3)+"ms\n\n");
}

部署应用

生成ipa文件后,你可以用各种方法将其安装到iPhone/iPod Touch中,比如可以用iTunes同步(要打过同步破解补丁的机器才行),也可以用无线或者蓝牙把文件传到机器上用Install0us安装。这时它就和普通的iPhone应用程序没什么区别了,可以看到它的图标,点击打开。下面两张图就是在我的iPod Touch上实际运行的截图,这里可以看到那个Benchmark的时间——果然和PC平台的处理器差的不是一点两点啊!

通过截图可以看到,Flash的渲染质量还是不错的。不错这个效率实在是不敢恭维,在第一帧上,按下那三个按钮后会播放一个音效,这时上面的动画就会卡一下。至于第二帧的Benchmark,不提了……

更多资源

至此,Flash CS5开发iPhone应用程序的小小尝试就差不多了。大家知道,iPhone/iPod Touch最吸引人的交互方式是重力感应和多点触控。当然,在ActionScript 3中也有对它们的支持。在flash.sensors包中,有用于重力感应的Accelerometer类和用于GPS位置识别的Geolocation类。而利用flash.ui.Multiouch也可以轻松地让Flash程序支持多点触控。

乐铺活动验证

延伸阅读:

  1. iPod Touch / iPhone 越狱后必装的 10 款软件