iPhone所開發的iOS是否也是同樣架構?
啟稿: 2014/12/27
完稿: 2014/12/31
QT CueTai線索台
QT跨平台實作04-跨平台實作進階:採用外部資源檔,iOS下之實例
研究過Mac OS X下app封裝結構後,接下來我們來看同樣是Apple公司為iPhone所開發的iOS是否也是同樣架構?
l iOS 下app封裝結構
各位可以找到原來我們在"跨平台實作01"為iOS所建置的程式來研究看看;以我的例子建置的程式放在以下的目錄;
/Users/apple/Documents/QtWork/build-analogclock-iphonesimulator_clang_Qt_5_3_0_for_iOS-Release/Release-iphonesimulator
程式與Mac OS X下命名一樣,都叫analogclock.app,兩指點選在出現隱藏式選單下選取“顯示套件內容”就會出現封裝的路徑結構如下圖,驚訝的是它根本沒有Mac OS X下Resources/及MacOS/兩目錄,所有的檔案都放在封裝後的根目錄.
l 在QT下建置iOS封裝結構
我們可以將所有需要的資源檔放在在封裝後的根目錄,或是仿造Mac OS X下app封裝結構,建立一個Resources/目錄來放置;在此我們選擇了後者,因為iOS 封裝後結構與Mac OS 較為一致,也比較有結構化分類管理!只是改為小寫無s的resource/目錄而已!
我們在QT說明畫面的搜尋欄位曾經找過"Mac deployment",找到相當有用的訊息,是否QT說明畫面也有同樣的"iOS deployment"呢?試著在QT說明畫面的搜尋欄位輸入keyword "iOS deployment" ,很可惜,沒有太多有用訊息;網路上Google得到說法則類似Mac做法,所以我們在此就保留原來在analogclock.pro的巨集方法如下:
ResourcesFiles.files=\
../analogclock/audio/alarm.wav\
../analogclock/audio/bird.wav\
../analogclock/audio/cricketnight.wav\
../analogclock/audio/dolphin.wav\
../analogclock/audio/hour.wav\
../analogclock/audio/laser.wav\
../analogclock/audio/water.wav
ResourcesFiles.path=resource
QMAKE_BUNDLE_DATA+=ResourcesFiles
l 修改程式
現在資源檔就會在建置時打包到resource目錄下,所以我們在程式中取用的時候就該寫成以下的形式:
soundQuarter=newQSound("resource/alarm.wav");
同樣的問題!程式在執行時所在目錄位置到底在哪兒?ㄧ樣也可以寫個小程式來dump出來current path,你就會發現當切為iOS模式,QT開發平台debug/release執行時與建置後正式執行app所在目錄位置是完全一樣的在封裝後的根目錄!因此使用上就變得很容易,不需要在原始碼中判斷目前的狀態就可以用相對與路徑取用:
clock.D_Current=QDir::current();
clock.S_CurrentPath=clock.D_Current.path()+"/";
clock.S_ResPath="resource/";
clock.S_AbsPath=clock.S_CurrentPath;
QDir::setCurrent(clock.S_AbsPath);
若要取資源檔,都是往resource/目錄下取檔案即可!所以用法與之前一樣:
soundQuarter=newQSound(S_ResPath+"alarm.wav");
l 建置與執行
雖然在QT開發平台不用在意是debug/release狀態下還是正式執行,不過我們還是在最前端加入以下一行程式:
clock.OpNow=clock.DEBUG_; //APP_,DEBUG_,RELEASE_
要建置正式執行app則改為:
clock.OpNow=clock.APP_; //APP_,DEBUG_,RELEASE_
如此就大功告成,檢查一下建置的,真的在resource/目錄下放置所有的檔案
Note: 若執行是沒有聲音,就表示路徑不對了!
l 延伸問題
是否其他平台也一樣呢?
