来源:http://bbs.9ria.com/thread-102037-1-1.html

最近看到本版块的很多关于NativeExtension的应用。但是都是在Android下面的应用。也有很多朋友在线上问我这个问题,今天晚上特写了一篇NativeExtension在IOS的应用,首先,我们做准备工作,下载AIR3.0及其SDK,当然我们也可以下载Flash Builder 4.6的Prelease版本,4.6可以直接添加ANE文件,进行最后的打包Ipa工作。省了最后的命令行工作,对新手来说,建议采用Flash Builder 4.6.,下载地址论坛里的兄弟贡献出来了,http://bbs.9ria.com/thread-100284-1-1.html

下面开始制作ANE文件,

1,启动Xcode,在IOS-》Frameworkd&Library下面,创建一个Cocoa Touch Static Library的项目(我们暂时将项目取名为:CoolExpLibANEIOS)。
2,OK,创建好之后,从你下载的SDK目录下,找到Include文件夹,找到里面的FlashRuntimeExtensions.h,通过项目添加FlashRuntimeExtensions.h文件
3,新建一个Object-C Class文件,此时会产生一个.h一个.m的文件,此时可以把.h文件删除,留一个.m的文件就行了。在这里我们暂定这个M的文件叫CoolExpLibANE.m文件。
4,下面是该文件的内容:我这里定义了两个方法供测试用,一个叫ShowIconBadageNumber,另外一个叫InitNativeCode。其他的代码都是必需的。

  1. #import "FlashRuntimeExtensions.h"
  2. #import <AudioToolbox/AudioServices.h>
  3. #import <UIKit/UIKit.h>
  4. FREObject ShowIconBadageNumber(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
  5. int32_t t;
  6. FREGetObjectAsInt32(argv[0], &t);
  7. [[UIApplication sharedApplication] setApplicationIconBadgeNumber:t];
  8. return argv[0];
  9. }
  10. // InitNativeCode()
  11. //
  12. // An InitNativeCode function is necessary in the Android implementation of this extension.
  13. // Therefore, an analogous function is necessary in the iOS implementation to make
  14. // the ActionScript interface identical for all implementations.
  15. // However, the iOS implementation has nothing to do.
  16. //此方法参考Adobe的官方例子,Vibration的。具体不明白的可以看注释。
  17. FREObject InitNativeCode(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
  18. NSLog(@"Entering InitNativeCode()");
  19. // Nothing to do.
  20. NSLog(@"Exiting InitNativeCode()");
  21. return NULL;
  22. }
  23. // ContextInitializer()
  24. //
  25. // The context initializer is called when the runtime creates the extension context instance.
  26. void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
  27. uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) {
  28. NSLog(@"Entering ContextInitializer()");
  29. *numFunctionsToTest = 2;
  30. //这地方 ,如果是两个方法有两个2,如果是三个方法就是3了。当然你可以自己看着定义了。
  31. FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 2);
  32. //这地方定义方法名
  33. //Just for consistency with Android
  34. func[0].name = (const uint8_t*) "initNativeCode";
  35. func[0].functionData = NULL;
  36. func[0].function = &InitNativeCode;
  37. //这地方定义方法名
  38. func[1].name = (const uint8_t*) "ShowIconBadageNumber";
  39. func[1].functionData = NULL;
  40. func[1].function = &ShowIconBadageNumber;
  41. *functionsToSet = func;
  42. NSLog(@"Exiting ContextInitializer()");
  43. }
  44. // ContextFinalizer()
  45. //
  46. // The context finalizer is called when the extension's ActionScript code
  47. // calls the ExtensionContext instance's dispose() method.
  48. // If the AIR runtime garbage collector disposes of the ExtensionContext instance, the runtime also calls
  49. // ContextFinalizer().
  50. void ContextFinalizer(FREContext ctx) {
  51. NSLog(@"Entering ContextFinalizer()");
  52. // Nothing to clean up.
  53. NSLog(@"Exiting ContextFinalizer()");
  54. return;
  55. }
  56. // ExtInitializer()
  57. //
  58. // The extension initializer is called the first time the ActionScript side of the extension
  59. // calls ExtensionContext.createExtensionContext() for any context.
  60. void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
  61. FREContextFinalizer* ctxFinalizerToSet) {
  62. NSLog(@"Entering ExtInitializer()");
  63. *extDataToSet = NULL;
  64. *ctxInitializerToSet = &ContextInitializer;
  65. *ctxFinalizerToSet = &ContextFinalizer;
  66. NSLog(@"Exiting ExtInitializer()");
  67. }
  68. // ExtFinalizer()
  69. //
  70. // The extension finalizer is called when the runtime unloads the extension. However, it is not always called.
  71. void ExtFinalizer(void* extData) {
  72. NSLog(@"Entering ExtFinalizer()");
  73. // Nothing to clean up.
  74. NSLog(@"Exiting ExtFinalizer()");
  75. return;
  76. }

复制代码

5,Build项目,会在项目文件夹Products生成一个.a 的文件,复制出来,我们在打包ANE的时候要用。

好了。IOS项目创建完毕。下一篇介绍如果创建ActionScript Library。

项目源文件下载在第四篇

[AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)的更多相关文章

  1. [AIR] NativeExtension在IOS下的开发实例 --- 新建项目测试ANE(四)

    来源:http://bbs.9ria.com/thread-102043-1-1.html 通过前面的努力,好了,我们终于得到了一个ANE文件了.下面我们开始新建一个Flex Mobile项目做一下测 ...

  2. [AIR] NativeExtension在IOS下的开发实例 --- Flex库项目的创建(二)

    来源:http://bbs.9ria.com/thread-102038-1-1.html 上一章,我已经介绍了如果创建IOS库文件,并定义了两个方法ShowIconBadageNumber和Init ...

  3. [AIR] NativeExtension在IOS下的开发实例 --- ANE文件的打包(三)

    来源:http://bbs.9ria.com/thread-102041-1-1.html 好了,前面的准备工作做的差不多了.此时我们应用有下面几个文件:extension.xml    CoolEx ...

  4. iOS下OpenCV开发用OC还是Swift

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 其实标题中这个问题并不准确,准确的说法应该是iOS下的OpenCV开发是使用OC还是Swift ...

  5. iOS下OpenCV开发配置的两个常见问题(sign和link)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 先上可以运行官方推荐的<OpenCV for iOS samples>的demo链 ...

  6. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  7. AJ学IOS 之ipad开发qq空间项目横竖屏幕适配

    AJ分享,必须精品 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应 ...

  8. iOS下的WiFi开发

    iOS下Wi-Fi开发需要添加依赖库SystemConfiguration.framework,在需要使用Wi-Fi信息的控制器下引入头文件#import <SystemConfiguratio ...

  9. 移动端底部fixed固定定位输入框ios下不兼容

    简短记录下最近开发移动端项目碰到的小坑,产品需求做一个售后对话页面,底部固定输入框,和微信对话差不多,但是在ios下,fixed失效,输入框被虚拟键盘挡住,在安卓下是正常的. 尝试过网上说的很多方法, ...

随机推荐

  1. 子查询优化 - Hyper

    Unnesting Arbitrary Queries - T Neumann, A KemperThe Complete Story of Joins (in HyPer) - Thomas Neu ...

  2. SQL中左连接on and条件和where条件执行先后顺序

    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...

  3. nginx-rtmp

    最近使用ffmpeg推流为rtmp,进行直播.记录一下nginx-rtmp的配置.因为我们要添加ngin-rtmp模块,所以不能直接apt安装. 下载niginx和nginx-rtmp-module的 ...

  4. javascript数组遍历的几种常用方法性能分析对比

    前言: 数组遍历有很多种方法,虽然不同方法有不同的特性及适用环境,除了普通飞for循环之外,for...in能直接输出数组元素的索引,for...of能直接输出数组元素的值,map则可以直接生成新的数 ...

  5. 【非lodop的】JS和html相关博文索引

    JS: eval()方法:JS-JAVASCRIPT的eval()方法. Date()对象.getFullYear() 方法.getDate()方法.console.dir()方法:LODOP打印用J ...

  6. [LeetCode] 355. Design Twitter 设计推特

    Design a simplified version of Twitter where users can post tweets, follow/unfollow another user and ...

  7. [LeetCode] 359. Logger Rate Limiter 记录速率限制器

    Design a logger system that receive stream of messages along with its timestamps, each message shoul ...

  8. Kubernetes & Docker 容器网络终极之战(十四)

    目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 ...

  9. mysql查询之上升的温度,有趣的电影,超过5名学生的课,大国,反转性别, 换座位

    最近发现一个网站 力扣 查看 上面有很多算法和数据库的题目,做了一下,发现自己平时都疏忽了,因此边做边记录下来 1.上升的温度 给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天 ...

  10. 根据本地/服务器时间获取指定时区时间 new Date指定时区时间

    1.代码 function getTimeByTimeZone(timeZone){ var d=new Date(); localTime = d.getTime(), localOffset=d. ...