[iOS] APP啟動時間測量
現在做產品跟以往做代工不太一樣,代工只要將功能完成就能交差了事,而產品則除了完成功能外,還要進一步優化性能,包含使用者體驗 (User Experience)。
在此我們先來測量APP啟動時間,如上圖啟動時間中的pre-main time。我發現以不同的裝置來使用同一個App,啟動時間都不一樣呢!當然這跟裝置規格有關係,等等就來測量差異多少~
現在做產品跟以往做代工不太一樣,代工只要將功能完成就能交差了事,而產品則除了完成功能外,還要進一步優化性能,包含使用者體驗 (User Experience)。
在此我們先來測量APP啟動時間,如上圖啟動時間中的pre-main time。我發現以不同的裝置來使用同一個App,啟動時間都不一樣呢!當然這跟裝置規格有關係,等等就來測量差異多少~
我所使用的整合開發環境是Xcode,每年更新都會釋出新的功能,來幫助開發人如我者更有效率地工作!2018年Xcode即將邁入第10版,這裡我想要來介紹主線程檢查器 (Main Thread Checker)。
回想2012年我還是個初學者的時候,還不知道主線程的重要性,以致於有時候發生不預期的反應,實在摸不著頭緒!基本上要記住,改變畫面的動作要在主線程實現,不然會發生什麼事?有時候有反應,有時候沒反應,這種狀況debug超級困難呢!
好在Xcode已經能從語法分析來得知,哪些程式碼會跑到非主線程,若改變畫面的元件在非主線程操作,Xcode就會有紫色的提示。上圖表示Label一定要在主線程使用 ([UILabel text] must be used from main thread only)。
在Swift剛釋出沒多久,我就研究過如何在同專案整合Objective C和Swift。文章:
儘管還是傾向以Objective C來開發產品,然而Swift的發展日趨重要,不過我大膽推測,就算Apple再怎麼強推Swift,十年內Objective C領導地位依然屹立不搖!為什麼呢?實際接觸4年Swift後,發現Swift變化多端,若猶豫要學Swift還是Objective C可以參考:要學Objective-C還是Swift?。
現在想要混編Objective C、Swift、C/C++,應也不是問題~
最近又「逼不得已」要更新Xcode 9.3(原9.2),原本沒有很想趕上潮流,不過因為老闆把自己的iPhone升級到11.3,我要幫他灌App測試,Xcode就跳出不支援該版本⋯⋯使得我被迫要升級Xcode!更沒想到的是,要安裝Xcode 9.3,還要先升級Mac OS 10.13(原10.12.6),這過程要花我整個下午的時間啊⋯⋯
本篇議題是關於 Swift 4.1,Xcode 9.3就能以Swift編程,以為只是小更新並不大礙,沒想到我所使用的Libray/Framework出現問題!!!
Swift第4版本提到Charts套件超好用,它要以Swift 4.0來編譯,所以要到某處選擇設定。今日更新到Swift 4.1。
想說編譯執行會很順利,誰知出現⋯⋯
這不符合Swift版本問題很神奇啊~
error: The following binaries use incompatible versions of Swift: /Users/happyboy/Library/Developer/Xcode/DerivedData/TestDeviceSDK-deuhrepxfcygzyguaogwmklmzddz/Build/Products/Debug-iphoneos/TestDeviceSDK.app/Frameworks/Charts.framework/Charts /Users/happyboy/Library/Developer/Xcode/DerivedData/TestDeviceSDK-deuhrepxfcygzyguaogwmklmzddz/Build/Products/Debug-iphoneos/TestDeviceSDK.app/Frameworks/Zip.framework/Zip
目前還在找解法ORZ,依然有經驗地翻舊文章下載舊版Xcode,先成功編譯後推Git。
想問熟悉寫Swift的高人,到底有多少時間在改Swift語法和設定呀⋯⋯
在Xcode中使用Breakpoint來debug是非常平常的事情,優秀的我們都能從Breakpoint來得知上下文狀態,如各個變數值。有時候崩潰(Crash)來得突然,Xcode沒有提供詳細的Crash訊息,像是我這個例子是:存取Empty Array。
此時例外中斷點 (Exception Breakpoint)就非常好用!
Swift已經升級到第4版本,我還是沒認真在寫Swift 4,主要是因為它還不太穩定,這幾年必須多花時間去改寫語法到最新版本,於是在有限的開發時間下,我依然對相對穩定的Objective C情有獨鍾XD~
舉一個例子,當我要使用Open Source Charts,Xcode會偵測是否相容,否則就無法編譯成功,如圖:
好在只要選擇到Swift 4,就能成功編譯!也感謝超好用的圖表開源Charts作者,願意每次Swift升級就改寫語法,造福我們成千上萬的iOS開發者!
怎麼在Objective C中使用Swift Open Source?可參考文章:在Objective C專案使用Swift第三方套件。
最近要研究1992年程式高人寫的原始碼,看到Xcode上黃色驚嘆號標示說是非常早期的語法,好在還能編譯運作,不然要以目前C語法再刻一次,我真的會想去撞牆啊XD~
話說,我學生時代習慣用C++寫程式,現在想以C++來引用C標頭檔,雖然在Xcode中可以將.c改成.cpp,就能成功「騙」過編譯器,但那樣根本是多此一舉,明明是C語言還要宣示為C++語言。
查詢後原來很簡單如何引用C標頭檔,使用extern保留字標記C,大括號中就是引用C標頭檔。
高人解釋:
For a list of C standard C headers (stdio, stdlib, assert, …), prepend a c and remove the .h. For example stdio.h becomes cstdio.
For other headers, use
extern “C"
{
#include “happy_header.h"
}
過去六年以來一直寫iOS App,讀檔方面路徑沒什麼問題。
然而在Xcode寫C++ code時候,碰到讀取本目錄下txt文件的內容,不想使用絕對路徑,那麼就是使用相對路徑。可以做如下設置,就可以打開文件並讀取!
三年前(2015年)幫公司製作比特幣查詢用的Watch App,已有開發經驗遇過一些坑,照理說能馬上迎刃而解才是,不過大腦卻沒能及時反應,只好上網打關鍵字求解!
問題:
error: WatchKit Extension doesn’t contain any WatchKit apps whose bundle identifiers match “com.happy.watch.watchkit". Verify that the value of WKAppBundleIdentifier in your WatchKit Extension’s Info.plist matches the value of CFBundleIdentifier in your WatchKit App’s Info.plist.
想開發Watch App,需要申請三個ID:
這三個ID逐一依賴,怎麼說?3依賴2,2依賴1,缺一不可哪~
Info.plist中有些設定令人搞不清楚,項目Bundle name 和 Bundle display name看起來差不多,可是實際功用卻不相同!
Key的名稱分別如下:
“CFBundleName" = “HappyHeart";
“CFBundleDisplayName" = “HappyHeart";
那麼兩者差別為何?
Bundle name會出現在像詢問權限:
若我沒有填寫,則預設為Target名稱「TestDeviceSDK」。
Bundle display name則會顯示在桌面上App的名稱。
此兩者我目前都設定一樣的字串。
HappyMan・迴響