最近在实现一个微课项目的iOS端ANE的调用,由于这个技术断层好久了,所以着实研究了一段时间,今天大功告成,遂共享之。
首先,针对网上许久没有更新的相关资料,我先说下我的编译环境:Flash builder 4.7(这个真没招);Apache Flex 4.14.0(3月份新鲜出炉);Xcode6.2+iOS8.2(时间截止到2015年3月31日,全是最新的版本)。
东西准备完了,开始进入正题吧。
首先先说明一下我的需求:Flex端编写了微课的客户端,对于iOS原生的需求,需要根据Flex端传入的视频路径,调用iOS原生的播放器进行视频的播放,同时,如果用户视频库(也就是系统视频库)中有视频,要调用iOS上的图库(iOS上用摄像头拍摄的MOV视频文件都在这里面)浏览器,浏览视频,并在选取视频后,返回给Flex端选取的视频的路径。
需求虽然很简单,但是基本上要用到的ANE上的难点都基本上涉及到了,例如打包ANE的时候拓展功能库、Flex层与iOS层的事件以及参数传递、调用原生view以及viewcontroller之后,移除组件出现的各种问题等。
直接进入正题吧。
首先,我们要先针对我们的需求,编写一个SWC库文件,为什么要编写这个呢?打个比方来说,这个SWC文件就相当于一个桥梁,用来连接Flex程序与iOS,让它们形成一个整体。
(一)打开Flash builder,文件——新建——Flex 库项目,这里有要注意的地方:在新建立的过程中,一定要把“包括Adobe AIR库”这个选项选中,不然在后面的代码过程中,会找不到一些关键的库文件。
(二)建立完SWC库项目,接着在src文件夹下建立AS类,并根据需求进行代码编写。
1 package com.Dsideal.MicroANEforiOS 2 { 3 import com.Dsideal.Event.ANELibUtilsEvent; 4 5 import flash.events.EventDispatcher; 6 import flash.events.StatusEvent; 7 import flash.external.ExtensionContext; 8 9 /** 10 * 【功能】:微课项目iOS端的ANE外壳。 11 * @author zhanghc 2015-03-23 12 */ 13 public class ANELibUtils extends EventDispatcher 14 { 15 //唯一实例 16 public var m_extContext:ExtensionContext = null; 17 18 /** 19 * 【功能】:微课ANEforiOS 20 * @author zhanghc 2015-03-23 21 */ 22 public function ANELibUtils() 23 { 24 super(); 25 initExtension(); 26 } 27 28 /** 29 * 【功能】:实例化组件 30 * @author zhanghc 2015-03-23 31 */ 32 private function initExtension():void 33 { 34 // TODO Auto Generated method stub 35 m_extContext = ExtensionContext.createExtensionContext("com.Dsideal.iosANE.DsMicroClassANE", null);//ID必须要与OBC端的ID一致 36 m_extContext.addEventListener(StatusEvent.STATUS, onFinishOpenVideo); 37 } 38 39 /** 40 * 【功能】:添加事件传递的连接 41 * @author zhanghc 2015-03-31 42 */ 43 protected function onFinishOpenVideo(event:StatusEvent):void 44 { 45 // TODO Auto-generated method stub 46 dispatchEvent(new ANELibUtilsEvent(event.code, event.level)); 47 } 48 49 /** 50 * 【功能】:调用系统播放器,播放视频 51 * @param path 传入的视频路径 52 * @author zhanghc 2015-03-23 53 */ 54 public function PlayVideo(path:String):void 55 { 56 m_extContext.call("PlayVideo", path);//将视频路径传入ios本机视频进行播放 57 } 58 59 /** 60 * 【功能】:打开系统视频库 61 * @author zhanghc 2015-03-30 62 */ 63 public function OpenVideoGel():void 64 { 65 m_extContext.call("OpenVideoGel"); 66 } 67 } 68 }
这是最简单的框架了,首先声明一个ExtensionContext类型的变量m_extContext,然后在构建的时候为给定的扩展标识符和上下文类型创建 ExtensionContext 实例,其中需要注意的是"com.Dsideal.iosANE.DsMicroClassANE"这个ID是要与之后我们在Xcode中用Object-c建立项目的之后命名的包名ID要保持完全的一致。
至于m_extContext.addEventListener(StatusEvent.STATUS, onFinishOpenVideo);这行代码,是关于iOS层与Flex层之间事件传递的代码,现在不用管,以后会介绍,因为这个得细说。
至于PlayVideo(path:String)与OpenVideoGel()这两个函数,看注释就明白了,这两个是Flex调用ANE的入口,ANE在使用的过程中,就像一个库文件似得,实例化ANE,然后调用实例的函数就可以了,为了让大家更直观,先把成品ANE的使用代码展示一部分,好理解入口这个概念。
var _ane:ANELibUtils = new ANELibUtils(); _ane.OpenVideoGel();
肿么样?很简单吧~写完代码后,清理下项目,在项目的bin文件夹下面就有我们编译好的SWC库文件了,保存好这个文件,后面会用到。