標籤:android des style blog http java
來源:http://www.myexception.cn/operating-system/1451490.html
開發QQ互聯ios版Ane擴充 辛酸史
開發QQ互聯ios版Ane擴充辛酸史:
1、安裝mac系統非常痛苦,找了好幾個版本都裝不上,同時對mac的基本操作和xcode的基本操作不熟悉。
2、用xcode建立ane項目(使用xcode-template-ane-master模板),引入第三方object-cframework,產生.a檔案,供windows下產生ane檔案。
發現windows下 調用第三方sdk後編譯的ane,air調用打包時卡住(原因有兩種,一是object-C項目代碼有錯誤,但可正常產生.a庫檔案;二是引用了第三方framework,但未配置platform.xml打包進ane中,讀取不到第三方sdk)。
解決辦法:先排除引用第三方類庫問題,再排查代碼(只好對懷疑的地方注釋掉在編譯.a,產生ane再打包)
排查完錯誤後,編譯不卡住了,但仍舊打包時報錯:
打包應用程式時出錯: Undefined symbols for architecture armv7: "_qqSDKExtFinalizer", referenced from: _g_com_adobe_air_fre_fmap in extensionglue.o (maybe you meant: _qqSDKExtFinalizer_name) "_qqSDKExtInitializer", referenced from: _g_com_adobe_air_fre_fmap in extensionglue.o (maybe you meant: _qqSDKExtInitializer_name) "_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from: objc-class-ref in TencentOpenAPI(MTA4QCHelper.o) ld: symbol(s) not found for architecture armv7 Compilation |
|
3、通過配置platform.xml解決上面這個錯誤(在linkerOptions屬性中添加引用的第三方類庫)。
windows下重新打包產生ane,air項目運行打包報錯:
原因是打包時adt會去讀取該第三方類庫,讀取不到。需要在fb中本機擴充處配置Apple iOS sdk(因為iossdk沒有windows版,因此需要把fb項目放入mac上運行,進入第4點)
注意<linkerOptions> 標籤需要 AIR 3.3 或更高版本
4、在mac上安裝fb,配置好air項目,在本機擴充中配置Apple iOS sdk:
/Applications/Xcode2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/
並且把第三方類庫TencentOpenAPI.framework 放入上面路徑中System/Library/Frameworks/下,在xcode中匯入相關需要的ios類庫
再運行提示
ld: librarynot found for -libiconv
Compilationfailed while executing : ld64
原因是linkerOptions ios的類庫名字錯誤,命名-libiconv 要寫成 -liconv(必須去掉ib兩個字元)
配置完成後重新在windows中打包ane,air項目運行終於ok,調用第三方程式運行正常。Platformoptions.xml配置如下:
5、因為不想把項目放在mac上編譯,因此需要在ane上想辦法,把第三方framework打包進ane中(這就要求ane打包過程必須在mac上完成)
藉助 platformoptions.xml裡面配置packagedDependencies節點屬性把第三方類庫配置進去
使用命令列打包ane提示錯誤:Missing dependency TencentOpenAPI.frameworkfor platform iPhone-ARM
platformoptions.xml裡面配置了packagedDependencies節點屬性---引用了第三方類庫,需要把這個類庫放到打包的檔案夾下
注意<packagedDependencies> 標籤需要 AIR 3.5或更高版本。
再使用 adt 打包ane,報錯:Unable to build a valid certificate chain for the signer.
可能是mac上使用windows 產生 .p12檔案不支援導致的。
網上有個方法說在mac上使用firefox怎樣重建.p12(http://forums.adobe.com/message/1975832#1975832)未完全明白怎麼操作,還是老老實實用mac來產生.p12檔案用於ane產生和ipa發布。
這樣為第三方framework產生的ane檔案 就可供widows上的 air項目使用了,並不需要在mac上開發建項目引入ios sdk。
6、為QQ互聯sdk寫ane,發送訊息無法回調,因為 object-c部分要重寫handleOpenURL方法,而air app自動建立的視窗無法重寫這個方法。
解決辦法:a s上偵聽 InvokeEvent.INVOKE事件,收到事件後再通過ane調用 object-c方法,裡面再調用sdk的handleOpenURL方法。
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);private function onInvoke( event : InvokeEvent ) : void{if (Capabilities.manufacturer.indexOf("iOS") != -1)//只在ios下採用這種方式{if (event.arguments != null && event.arguments.length > 0){var url:String = event.arguments[0] as String;if ( url != null && url.indexOf("tencent") == 0){contex.call("handleOpenURL", url);}}}}
7、qq互聯登入成功後用戶端把openid、access_token傳遞給服務端訪問開放平台api提示100030 錯誤:使用者沒有對該api進行授權
一開始以為是openid和access_token錯誤,實際原因是 authorize傳遞的參數問題,沒有填寫該api的許可權字串,可加上或者傳 @"all"。每個許可權的字串就是調用的哪條cgi的fun 譬如:https://graph.qq.com/user/get_app_friends許可權字串就是:get_app_friends。
8、其他小插曲,一開始安裝了flash builder4.7,配置最新的air3.9,項目編譯報錯:提示: “在源路徑中找到的檔案必須擁有一個外部可見定義。如果檔案中的某個定義應當是外部可見的,請將該定義放入包。”
“AIR 應用程式識別碼“net.flash8.game.guess.debug”與在配置概要檔案中指定的模式“net.flash8.game.guess”不匹配。請更改應用程式識別碼,或使用與現有ID 相匹配的配置概要檔案。”
沒找到原因,於是又安裝flashbuilder4.6,配置最新的air3.9,後正常。
Mac下升級airsdk的方法:(和windows下升級方法相同,mac中fb4.7比較複雜)
http://www.vimer.cn/2013/07/mac下flash-builder-4-64-7-升級-airsdk的版本至3-8的方法.html
xcode出現錯誤Unsupported compiler ‘GCC 4.2‘selected for architecture ‘i386‘
解決方案 在Buildingsetting 找到Compiler for C/C++/Objective-C 這項 選擇LLVM GCC 4.2就OK
xcode出現錯誤:
Undefined symbolsfor architecture armv7:
“_OBJC_CLASS_$_XXX”,referenced from:
objc-class-ref inXXX
ld: symbol(s) notfound for architecture i386
clang: error:linker command failed with exit code 1 (use -v to see invocation)
如果真機調試就是undefined symbols for architecture i386錯誤!
發生這種錯誤通常是project.pbxproj這個檔案引起的,尤其在多人合作開發的時候,svn提交不規範可能導致project.pbxproj發生錯誤,導致檔案的引用不在project.pbxproj檔案中。
xcode項目import檔案會根據project.pbxproj來尋找,尋找不到檔案的引用則會有上述的錯誤。
解決方案點擊工程,在主介面中點擊BuildPhases,根據提示資訊“XXX”來判斷缺少什麼檔案,一般如果缺少自訂的檔案,XXX會是缺少的類名,那麼就在Complie Sources中加入該檔案。如果缺少類庫,則在Link Binary With Libraries中加入該類庫。
xcode 有時編譯不出.a檔案,但仍提示buildsuccess,這種情況大多是代碼有誤,重新建立一個工程,把代碼拷過去。(只在xcode 4.6上遇到,後面果斷安裝最新xcode5.0)
命令列打包ane提示錯誤:Namespace of platformoptions.xml should match extension namespace.
platformoptions.xml裡面的air版本號碼配置必須和extension.xml裡面一致,同時,打包ane用到的air sdk版本必須大於或等於改版本號碼。
遇到上面這些問題,並解決後,終於把QQ互聯的iso版ane開發完成、並調通調用。期間中途受阻,還研究了下別人寫的一個QQ互聯的ane看能不能直接拿來用,最終發現不支援,還得自己開發。
歸納步驟:
1、配置開發環境(mac、xcode,熟悉他們的用法)
2、建立xcode工程(建議使用xcode-template-ane-master),匯出.a庫檔案
3、建立As commonAneLib工程,編寫ane命令並打包
4、配置-app.xml許可權(很重要)
5、air項目工程調用
參考的相關網站:
構建本機庫:
http://help.adobe.com/zh_CN/air/extensions/WSf268776665d7970d-2e74ffb4130044f3619-7fff.html#WSdb11516da818ea8d49ce0fe713341ed67cf-7ffe
應用程式啟動和退出選項
http://help.adobe.com/zh_CN/AIR/1.1/devappsflex/WS5b3ccc516d4fbf351e63e3d118676a5d46-8000.html
構建針對 iOS 和 Android 的原生擴充 – 第三部分: 構建 iOS 庫
http://www.adobe.com/cn/devnet/air/articles/building-ane-ios-android-pt3.html
iOS5support for AIR/Using external SDKs to package apps:
http://blogs.adobe.com/rajorshi/2011/11/16/ios5-support-for-airusing-external-sdks-to-package-apps/
使用ANE整合Facebook http://zengrong.net/post/1831.htm
Adobe AIR打包用到外部sdk的ANE時報錯
http://www.flashj.cn/wp/error-when-adt-package-ipa-with-ane-includes-ios-external-sdk.html
IOS ANE的坑爹之路(一)http://rolfzhang.com/articles/1108.html
ANE-Facebook:https://github.com/freshplanet/ANE-Facebook
ANEList-master:https://github.com/zmLiu/ANEList