[iOS] iOS 14 IDFA
IDFA 全稱為Identity for Advertisers,即廣告標識符。用來標記用戶,目前最廣泛的用途是用於投放廣告、個性化推薦等。
關於IDFA在iOS的重要性,可以見我先前文章:IDFA、IDFV、UUID。
(繼續閱讀…)IDFA 全稱為Identity for Advertisers,即廣告標識符。用來標記用戶,目前最廣泛的用途是用於投放廣告、個性化推薦等。
關於IDFA在iOS的重要性,可以見我先前文章:IDFA、IDFV、UUID。
(繼續閱讀…)為了避免上架時把開發的東西誤上傳,那麼一開始最好就定義好Debug和Release,其實Debug和Release在Xcode中已有定義,包版本釋出預設就是Release,而開發的時候透過Xcode編譯到手機,預設則是Debug,不過其實可以改成Release來測試,如此方便!
透過Xcode可以讓專案自定義變數 (Project User Defined Variable),這樣一來就算忘了有什麼是測試還是正式,都不用擔心會上錯啦~
最近又「逼不得已」要更新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語法和設定呀⋯⋯
過去六年以來一直寫iOS App,讀檔方面路徑沒什麼問題。
然而在Xcode寫C++ code時候,碰到讀取本目錄下txt文件的內容,不想使用絕對路徑,那麼就是使用相對路徑。可以做如下設置,就可以打開文件並讀取!
有時候我們需要開啟藍芽來連結裝置,像是Beacon、Apple Watch或小米手環。那麼如果使用者沒有打開權限怎麼辦?請他/她到設定藍芽 (Setting Bluetooth)去打開囉~
目前iOS SDK尚未有API可以直接改藍芽設定,要是未來Apple有開放的話請再跟我說唷!不過我想應該要等到天荒地老,非常重視用戶隱私的Apple,是不會輕易讓開發者悄悄開啟Bluetooth來進行任何動作。
剛好我們偉大的技術長有無私分享:
/** Theme: iOS 10 Setting Bluetooth IDE: Xcode 8 Language: Objective C Date: 106/03/07 Author: HappyMan Blog: https://cg2010studio.wordpress.com/ */ -(void)openBLESetting { NSURL *bluetoothURLOS8 = [NSURL URLWithString:@"prefs:root=General&path=Bluetooth"]; NSURL *bluetoothURLOS9 = [NSURL URLWithString:@"prefs:root=Bluetooth"]; NSURL *bluetoothURLOS10 = [NSURL URLWithString:@"App-Prefs:root=Bluetooth"]; if ([[[UIDevice currentDevice] systemVersion] intValue] >= 10) { [[UIApplication sharedApplication] openURL:bluetoothURLOS10]; } else if ([[[UIDevice currentDevice] systemVersion] intValue] >= 9) { [[UIApplication sharedApplication] openURL:bluetoothURLOS9]; } else { [[UIApplication sharedApplication] openURL:bluetoothURLOS8]; } }
這種沒啥邏輯純粹定義的玩意兒,抄,就對了XD~
有些功能只能從系統設定App,那麼我們就必須知會使用者,若可以的話就導向系統設定App吧~
/** Theme: Open Setting App IDE: Xcode 8 Language: Objective C Date: 105/12/28 Author: HappyMan Blog: https://cg2010studio.wordpress.com/ */ -(void)pushSettingAction:(id)sender { if (/* DISABLES CODE */ (&UIApplicationOpenSettingsURLString) != nil) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; } else { DxLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version"); } }
這樣我就能導向原本App(以垃圾管家為例)的系統設定囉~
參考:How to open Settings programmatically like in Facebook app?。
iOS不像Android,當APP進入背景模式的時候,Android還能暢所欲行,而iOS則會被強制中止,為什麼要這麼做?因為Apple就是要讓裝置省電來做更人性化的事情。那麼iOS是不是就不能在背景模式繼續運行?像是我們下載容量超大的檔案(如100MB),我們一定不會想要枯等看著它下載完,而是會切換到其它APP或其它功能繼續把玩,於是Apple還是會給需要的程式設計師一扇窗!
注意:經資深工程師提點,始知在Info.plist設定background modes是在iOS 7才有,功能上比較像是隨時都有可能需要背景模式時執行,所以若只是想延長背景執行時間來下載大型檔案,就不用設定Info.plist喔!但一定要在AppDelegate.h/.m處理~呵,我參考的部落格文章沒有寫清楚,看來還是要自己實際去驗證,不然就會像我送審的APP被reject~
由於我所設計的計步器需要在背景狀態持續更新地理坐標,所以必須特別去設定些屬性。Apple在APP品質的控管上表現得相當嚴謹,因為它期望手機不能太耗電,以加長手機電池的使用時間,於是審核APP時會特別去檢查是否有無謂耗電的現象,當然耗電的因素很多。而在此記錄一下要如何去開啟背景狀態持續更新地理坐標這個機制,要說一下蘋果的審委也是有不通人情的一面⋯⋯因為我明明有用到啊!其它APP能通過審核,我的怎不能?
一些專案設定要慢慢開始瞭解,特別是Build Settings有許多細節,跟APP運行的環境相關。
此截圖為某HappyLife專案Build Settings中Architectures的部分,開發界面是Xcode 5 beta。
HappyMan・迴響