Adobe Air Native Extension 开发笔记

这次 mission 的主要内容是将 Facebook 相关的库,Firebase 和 Google 登录的 SDK集成到 Adobe Air Native Extension (ANE)中去。

由于写这个笔记前后时间相差 1周多,中间经历了换电脑,换新开发环境,既有繁体文字又有简体文字。

開發環境

macOS Mojave 10.14.6
Xcode 11.2
IntelliJ IDEA 2019.2.4 Ultimate Edition
Adobe AIR SDK 32
Oracle JDK 8 Update 231

IntelliJ IDEA

如果要使用 IntelliJ IDEA 来开发 Adobe Air/Flex app 的话,需要 Ultimate 版本才能使用。

我已经订阅了很久 JetBrains Toolbox 了,不过使用频率高的只有 Rider,拿来开发正在制作的 Unity 游戏。

在和 Adobe Air 游戏开发者讨论过程中,谈到 Adobe Air 2020 年之后的 SDK 更新的时候,说是被三星的一个开发工作室接手了后续的开发工作,于是我就也去了后续新的官网上查了下,看到 Adobe Air SDK 33 的使用说明,里面有说使用 IDEA 开发 Adobe Air 应用的说明,搜索了一下,按照 IDEA 的文档进行了环境配置之后,就开始进行开发了。

目前 Air SDK 33 不支持 iOS,只支持 Android 打包,最终还是使用 Air SDK 32 进行开发了。

KeyRemap

个人习惯调成了 IntelliJ IDEA Classic

添加外部庫

Shift Shift 打開 Search Everywhere

輸入 Project Structure 打開項目配置

切換到 Modules 裏的 Dependencies

點擊 New 來進

更改最低 iOS linker 版本

更改 linker 中的 minimum ios 版本爲 9.0 之後打包顯示下列錯誤。

Undefined symbols for architecture arm64:

猜測是因爲第三方 Framework 還是沒有打包進去。

Facebook SDK Undefined symbols

Undefined symbols for architecture arm64:
  "___isOSVersionAtLeast", referenced from:
      -[FBSDKApplicationDelegate application:openURL:options:] in FBSDKCoreKit(FBSDKApplicationDelegate.o)
      -[FBSDKApplicationDelegate application:openURL:sourceApplication:annotation:] in FBSDKCoreKit(FBSDKApplicationDelegate.o)
      

看 Adobe 論壇裏討論,是這個樣子

AIR-4198557 @available keyword in ANE causes IPA build to fail

To do this without using a custom DEFINE ( and to use closed source Frameworks which use @available such as latest Firebase )

1. Copy this file /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/cl ang/9.1.0/lib/darwin/libclang_rt.ios.a
to
[AIRSDK_PATH]/lib/aot/lib/libclang_rt.ios.a

2. Add this to your linkerOptions in platform.xml
<linkerOptions>  
  <option>-lclang_rt.ios</option>  
</linkerOptions>  


Hopefully Adobe can add libclang_rt.ios.a to AIR SDK dist

*Credit to Eugene Petrenko @JetBrains
https://jonnyzzz.com/blog/2018/06/05/link-error-2/

Comment by Eoin L.

更換完 clang 編譯器之後可以自動編譯成功了。

ANE 使用 ThirdPartyLibrary 的總結

解決 Facebook 和 Firebase 最新版 SDK 集成的時候出現的編譯問題

  1. 在 Iphone-ARM 文件夾下新建 Frameworks 文件夾,將第三方庫都拷貝到裏面。
  2. 在 iOS 的 platformoptions.xml 里添加對應的 packagedDependency 定義。
<packagedDependencies>
    <!-- Facebook -->
    <packagedDependency>Frameworks/FBSDKLoginKit.framework</packagedDependency>
    <!-- ...示例中省略其它的必须的库配置 -->
</packagedDependencies>

3. 根據 AIR-4198557 @available keyword in ANE causes IPA build to fail 里的解決方法,將 Xcode 里的 clang 編譯器拷貝到 AIRSDK 文件夾對應的位置。

4. 在 linkerOptions 添加 clang 編譯器的 option

<linkerOptions>
    <option>-ios_version_min 9.0</option>
    <option>-lclang_rt.ios</option>
    <option>-rpath @executable_path/Frameworks</option>
</linkerOptions>

5. 打包 ANE,在項目中引用,啓動 app,應該就可以編譯通過了。(第三方庫已經在 packagedDependencies 里定義好了,編譯器會自動查找到 ANE 里面引用的庫進行 auto link,無須手動在 linkerOptions 里定義。)

6. 也可以尝试将第三方库拷贝到 AIRSDK 文件夹里(clang 编译器同级的位置),再尝试进行 ANE 打包。

参考链接:

  1. Adobe AIR SDK from HARMAN FAQ
  2. IntelliJ IDEA ActionScript and Flex
  3. Building a native extension for iOS and Android – Part 3: Building the iOS library | Adobe Developer Connection
  4. Adobe Flash Platform * Building the native library

Konachan 收圖工具

解析從 Konachan 收到的 JSON 數據,提取出圖片的下載地址,核心代碼不到 30 行,重要的是思路 >_Q
/

思路:

  • Konachan API Documentation 中得知 JSON 地址
  • 目測出原文件下載地址的 Key 是 file_url(題圖的 poi)
  • 將返回的 JSON 數據放入到一個 NSArray 中
  • 從 NSArray 中提取出每一個 picture 的 NSDictionary 對象
  • 從 NSDictionary 中根據 Key(file_url) 取出 Value(http://xxx.jpg)
  • 將 取出的 Value(http://xxx.jpg) 放入到一個 NSArray 中
  • 遍歷包含網址的 NSArray ,將每一個元素轉換成 NSURL 對象,之後下載到本地 Downloads 文件夾下

源碼