About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Feb

    23

    很多时候我们需要用到设备的唯一识别码。安卓系统获取设备唯一识别码的资料网上比较多,但它们也并不通用,因为现在市场上的很多安卓机实际上它们的系统都是经过设备厂商修改过的,比如小米的系统,阿里云OS手机系统等等,所以实际上并不存在一个真正通用的方法。以下这个方法仅适用于 iPhone / iPad 设备或桌面设备,并不适用于 Android 系统(原因在后面)。

    苹果设备的 “IDFA、IDFV、UDID、OpenUDID 等等”这些标识区别可以在百度上找到,这些标识除了真正的 UDID 和 MAC 物理地址之外,其它的标识在很多情况下是会发生变化的:最常见的情况就是还原出厂设置后,会生成一个新的标识符。网络上一些第三方能够获得 UDID 的 SDK,实际上都是 OpenUDID,并不是真正的 UDID。

    苹果公司政策规定开发者是不能够获取用户设备的物理信息的(在 iOS 4.x 时代是获取 UDID 和 MAC 物理地址的,后来的新系统中都开始禁止了访问这些信息)。如果利用核客技术访问私有 API 被审核人员发现,那么一定会遭到苹果公司拒审;既便上架了被发现也会被下架。

    重要的事情说三边

    1、苹果公司政策规定不允许第三方开发者获取设备真正的唯一识别码!苹果公司政策规定不允许第三方开发者获取设备真正的唯一识别码!苹果公司政策规定不允许第三方开发者获取设备真正的唯一识别码!

    2、利用核客技术或系统漏洞调用苹果私有 API 会拒和下架!利用核客技术或系统漏洞调用苹果私有 API 会拒和下架!利用核客技术或系统漏洞调用苹果私有 API 会拒和下架!

    3、利用任何标识符统计用户数据必须接受苹果公司审核!利用任何标识符统计用户数据必须接受苹果公司审核!利用任何标识符统计用户数据必须接受苹果公司审核!

    4、开发者不要仅研究技术,也要知晓各平台的政策!开发者不要仅研究技术,也要知晓各平台的政策!开发者不要仅研究技术,也要知晓各平台的政策!

    技巧

    同一时间是指精确到毫秒级的时间!目录与创建时间!!硬件磁盘根目录即文件目录!!!

    从理论上来说,我们可以在同一时间创建两个目录,但那仅仅是理论上的,所以标题中“唯一”两个字加了引号。两块闪存盘同时间被格式化完成?这个概率可能比两个目录的创建时间完全相同的机率还要低。

    代码

    import flash.filesystem.File;
    import flash.globalization.DateTimeFormatter;

    trace("硬件信息:");

    var rootDirArr:Array = File.getRootDirectories();

    for (var i:uint = 0; i < rootDirArr.length; i++) 
    {
        var file:File = rootDirArr[i];

        var date:Date = file.creationDate;

        var dtf:DateTimeFormatter = new DateTimeFormatter(LocaleID.DEFAULT);
            dtf.setDateTimePattern("yyyy/MM/dd HH:mm:ss");

        var creationTime:String = dtf.format(date);

        //看到最后的这个 milliseconds 值了吗
        trace(file.nativePath + ":" + creationTime + "," + date.milliseconds);
    }

    如果是在我的 Windows 7 中调试运行,它会显示(它并不需要系统管理员的权限就能读取):

    硬件信息:
    C:\:2009/07/14 10:38:56,526
    D:\:2010/08/23 23:59:31,18
    E:\:2010/08/23 23:59:46,99

    如果是在我的 iOS 9.2 (iPhone6 Plus)中运行,它会显示(不需要越狱):

    硬件信息:
    /:2015/06/25 17:47:25,10

    使用这个方法最大好处就是不需要 ANE 文件。既便用户在系统设置中还原位置与隐私、还原广告标示符、抹掉所有内容与设置、升级系统等,磁盘的创建时间都不会发生变化,既便用户完全重置系统,还原所有设置到出厂状态,磁盘的创建时间都不会发生变化。经过测试,只有在使用线刷 / 强制刷机的情况下,磁盘才会被重新创建并且格式化,磁盘的创建时间才会发生变化 

    额外的话题:关于 Android 系统

    然后,以上这个方法并不适用于 Android 系统,在 Adobe 官方的 API  手册中 getRootDirectories() 方法下面已经有说明:“在根不可读的文件系统上,例如 Android 文件系统,返回的 File 对象的属性并不总是反映真实值。例如,在 Android 上,spaceAvailable 属性报告 0。” 安卓系统可以使用原生的方式获取设备id,制作成 ANE 文件给 AS3 调用。但正如前面第一段所述的,既便是 Google 提供的 getDeviceId() 这个 API 并不通用,因为国内很多手机厂商对安卓系统进行了修改,很多权限都发生了改变。

    比如,在不使用 ANE 的情况下,在未经修改的安卓系统中,可以用如下方法读取 MAC 网卡地址。我在 HTC 手机中进行了测试,-app.xml 中的权限:

    <!--删除 android.permission.INTERNET 权限将导致无法调试设备上的应用程序-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--应同时切换 ACCESS_NETWORK_STATE 和 ACCESS_WIFI_STATE 权限,才能使用 AIR 的 NetworkInfo API-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    AS3:

    var netWorkVec:Vector.<NetworkInterface > = NetworkInfo.networkInfo.findInterfaces();

    for (var i:* in netWorkVec)
    {
        if(netWorkVec[i].hardwareAddress)
            trace("MAC 物理地址:",netWorkVec[i].hardwareAddress);
    }

    结果输出了:

    MAC 物理地址: D8:B3:77:7F:00:47

    但是,同样的代码,在国内厂商经过修改后的系统里,它并不能正常输出 MAC 网卡地址,比如使用阿里云OS的联想手机经过测试就不能。所以如果 AS3 的安卓开发者们想要一个通用的获取设备硬件信息的方法,几乎是不可能。

    Feb

    21

    Adobe AIR Gaming SDK ANE 64位版本

    • 1 Comments
    • Flash Platform

    官方博客里下载到的是 32 位的版本。在官方的论坛里找到了 64 位版本。里面的链接是指向 dropbox.com 域名的,国内用户需要链接 VPN 才能下载,不知道什么原因 Adobe 的工作人员为什么要把文件放在 dropbox 网站去~

    没有 VPN 的话也可以在这里下载:Adobe Gaming SDK 64bit ANE.zip

    在 Adobe 开发者中心还找到了另一个个人升级过的版本,但当点击他的 Game Center Demo 中点击 Score 按钮时闪退了,替换为 dropbox 上下载的 ANE 文件并不会闪退,估计有 Bug……

    Feb

    20

    全局函数 navigateToURL() 功能很强大,仔细看它在 API 手册中的介绍,可以打开很多协议方案,可以用它启动拔号程序,短信程序等,也可以用它来打开 APP Store 程序。

    打开某个 APP 对应的中国市场页面:

    navigateToURL(new URLRequest("itms-apps://itunes.apple.com/cn/app/ANY_APP/idXXXXXXXXXX?mt=8"));

    用下面这种,可以自动识别多语言:

    navigateToURL(new URLRequest("itms-apps://itunes.apple.com/app/idXXXXXXXXXX"));

    跳转到用户评论页面,一般用的最多的估计就是这个:

    navigateToURL(new URLRequest("itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=XXXXXXXXXX"));

    Feb

    20

    强大的JSFL,开发Flash拓展插件

    • 0 Comments
    • Flash Platform

    1、Creating Flash Extensions — Pt. 1: Introduction

    介绍jsfl,如何从history中查看jsfl,对jsfl有基础的认识。

    2、Creating Flash Extensions — Pt. 2: The DOM

    dom结构,就是fla在jsfl语言中结构:

    fl.documents[0].timelines[0].layers[0].frames[0].elements[0];

    3、Creating Flash Extensions — Pt. 3: Manipulating the Library

    如何操作资源库,作者通过对不同类型的资源进行文件夹管理,很实用.

    创建一些交互界面,alert弹窗,确认弹窗等。 

    5、Creating Flash Extensions — Pt. 5: SWF Panels :

    用swf发布来做自定义面板,是不是很库呢?作者也推荐了几款相应的swf面板组件。 

    6、Creating Flash Extensions — Pt. 6: Custom Tools 

    自定义工具,这里可以让你自己做个画图工具了。 

     

    7、Creating Flash Extensions — Pt. 7: Distributing to Others :

    打包你开发的拓展,可以发给设计人员,也可以分享给其他人了。

     

    原文地址链接

    http://blog.fireyang.com/2011/03/29/2011-03-29-%E5%BC%BA%E5%A4%A7%E7%9A%84jsfl/

    其它相关链接

    http://kevincao.com/tag/jsfl/

    http://kevincao.com/2011/03/introduce-kafecomponent-part-2/

    Feb

    19

    第一个(在桌面上正常,在移动设备上有破音的 Bug):

    http://blog.andre-michelle.com/upload/mp3pitch/MP3Pitch.as

    第二个(这个无论是在桌面上还是移动设备上都正常,而且还有倒着播放音乐的功能):

    https://gist.githubusercontent.com/soyyo5159/4424117/raw/4765f856133538e29fec2729b03b577ef58d37ca/FrequencyChangeSound.as

    More...

    Jan

    24

    桌面  AIR 开发使用 openWithDefaultApplication 报以下错误:

    Error: Error #3000: Illegal path name.

    1、确认路径是否正确。

    2、-app.xml 文件添加配置

    <supportedProfiles>extendedDesktop</supportedProfiles>

    如果不是 extendedDesktop 项目,仅仅只是在 supportedProfiles 填写了 desktop ,在 debug 模式下同样会报错,正式发布后就好了。或者同时将两个都写上:

    <supportedProfiles>extendedDesktop desktop</supportedProfiles>

    extendedDesktop 要放在前面,desktop 放在后面,这样在调试模式下也不会报错。

    Jan

    21

    在一个简单的 Alert 警告框后,如果想将程序化的设置某个文本输入框的焦点,可以在 Alert 的 CloseEvent 事件侦听器里设置,但那样会多写不少代码。一个小技巧是直接在 Alert 之前对想要设置的文本框调用 setFocus() 方法,就可以在关闭 Alert 后显示聚焦了(不要写在 Alert.show 的后面)。

    someTextInput.setFocus();//一定记得写在Alert前面
    Alert.show("someTextInput 不能为空。");
    //someTextInput.setFocus();//不要写在Alert后面 

    Jan

    16

    许多中低端安卓设备的性能普遍比较低,在安卓配置的节点中加入 colorDepth 参数,强制 16 位颜色,可以提供应用的性能(会牺牲颜色保真度,颜色过渡可能会不自然),尤其是在使用 Stage2D 原生显示对象开发时它会特别有用。

    <android>
        <colorDepth>16bit</colorDepth>
        <manifestAdditions><![CDATA[
            <manifest android:installLocation="auto">
                <!--删除 android.permission.INTERNET 权限将导致无法调试设备上的应用程序-->
                <uses-permission android:name="android.permission.INTERNET"/>
                <!--其它的已省略-->
            </manifest>
        ]]></manifestAdditions>
    </android>

    特别注意的是,当应用中包含视频并使用了 StageVideo 时,就必须使用 32 位,否则就会无法播放。

    Jan

    14

    AIR SDK 19+ for iOS 加载远程资源

    • 0 Comments
    • Flash Platform

    一段普通常见的加载代码:

    var loader:Loader = new Loader();

    loader.load(new URLRequest("http://www.zinewow.com/images/logo.gif"));

    this.stage.addChild(loader);

    桌面 AIR (包括模拟器)加载服务器远程资源时一般只要路径正确就不会出问题, 真机调试时除了路径必须正确之外,还要求符合苹果的安全限制。否则在 AIR SDK 19+ 以上的版本就会报以下的错误: 

    Error #2044: Unhandled IOErrorEvent:. text=Error #2036: Load Never Completed

    真机调试必须在 -app.xml 里针对 iPhone 节点添加以下配置,以便允许 APP 可以访问所有域名和 IP 地址:

    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    </dict>

    也可以是单个的域名和 IP 地址:

    <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSExceptionDomains</key>
            <dict>
                <key>你的域名.com或你的IP地址</key>
                <dict>
                    <key>NSIncludesSubdomains</key>
                    <true/>
                    <key>NSExceptionAllowsInsecureHTTPLoads</key>
                    <true/>
                </dict>
            </dict>
        </dict>

    这些配置要求是 Apple 出于 iOS 系统中对 APP 的网络安全相关的内容《Information Property List Key Reference》,并不是属于 Adobe 公司 AIR 的安全限制,所以在 Adobe 上是找不到这些资料的。只要 Adobe 的程序员使用的 XCODE 版本升级后保持最新,那么他们所编译出来的 AIR SDK 版本也一定会符合 Apple 的新规定。AIR SDK 旧版本比如16、17等版本并不会报这个错误,因为这个配置要求是苹果公司 2015 年中时提出的,所以新的 19 + 以上的 SDK 版本才会报这个错误。

    Dec

    18

    starling 库 Sprite3D 翻转动画

    • 0 Comments
    • Flash Platform

    用starling做 3D 翻转/旋转效果就是这么简单:

    //样例主代码,以Y轴旋转为例(其它代码都省了)
    var sprite3d: Sprite3D = new Sprite3D();
    sprite3d.addChild(frontImage)//frontImage是一个starling Image对象
    sprite3d.addChild(backImage)//backImage是一个starling Image对象

    sprite3d.x = 300;
    sprite3d.y = 300;
    sprite3d.pivotY = sprite3d.height / 2//让它沿着容器的中间旋转
    sprite3d.pivotX = sprite3d.width / 2;

    addChild(sprite3d);

    //为了偷懒直接用了TweenLite类,否则要添加侦听器,再加Juggler神马神马的很烦人
    TweenLite.to(sprite3d, 2
    {
        rotationY: Math.PI,
        onUpdate: onUpdateHandler,
        onUpdateParams: [sprite3d]
    });

    var vector3D: Vector3D = new Vector3D();

    function onUpdateHandler(_sprite3d: Sprite3D): void 
    {
        vector3D = stage.getCameraPosition(_sprite3d);
        //设置平面图片在旋转时的可见性
        frontImage.visible = vector3D.z > 0;
        backImage.visible = !frontImage.visible;
    }