[iOS] 從Fabric Crashlytics遷移Firebase Crashlytics
由於時代不停的變遷,使得必須從Fabric Crashlytics遷移Firebase Crashlytics。
自從2017年Google收購Fabric,我之前所整合的Answers和Crashlytics就逐漸被整合到Firebase。遙想2017年我還在看Fabric後台,很有成就感地看著我開發的HiLife和Nissan。文章:Fabric Crashlytics 崩潰紀錄。
由於時代不停的變遷,使得必須從Fabric Crashlytics遷移Firebase Crashlytics。
自從2017年Google收購Fabric,我之前所整合的Answers和Crashlytics就逐漸被整合到Firebase。遙想2017年我還在看Fabric後台,很有成就感地看著我開發的HiLife和Nissan。文章:Fabric Crashlytics 崩潰紀錄。
早在2013年,我就把玩過iOS的人臉偵測 (Face Detection),當時覺得非常酷!因為已經能在手機上玩人臉偵測,回想2011年,我還在研究電腦上OpenCV,那時可是我研究所樂趣之一呢~
時光飛逝來到2017年,Apple在WWDC上發佈Vision Framework,裡頭實現更強大的人臉偵測。
原本想透過智慧運動裝置來獲取步數與距離,可惜遲遲等不到韌體開發完成,只好暫且透過HealthKit獲取步數與距離!因為iPhone本身就有運動感測器,會自動算出步數與距離,然後寫入HealthKit,想做運動健康相關App,於是有數據來源可使用。
iOS 10開始之後要在info.plist設定Privacy。
自從iOS10開始,Apple整合並重構原本復雜的SDK,特別是本地推播 (Local Notification)和遠程推播 (Remote Notification),已經統合為專門處理的User Notifications Framework。
五年前(不小心透露年齡⋯⋯)我已介紹過Local Notification,文章可見:Remote/Local Notification。
整合過後,推播變得更好管理,於是我們要逐漸捨既舊有的實作習慣囉~
最近又「逼不得已」要更新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語法和設定呀⋯⋯
在研究所時代有旁聽機器學習課程,當時有親自操作SVM來產生model,可參考最近七年度以來一直很夯的文章:支持向量機器 (Support Vector Machine)。此時想要在iOS上使用SVM model要怎麼做呢?好在Apple釋出轉換model工具,再配合2017年釋出的Core ML,就能輕易在iOS上使用該model。
.
在此跳過轉換model的部分,直接進入套用已轉好的Core ML Models。不管你是阿貓還是阿狗做出來的model,都能透過Apple的轉換工具變身為飛天阿貓阿狗給App使用XD~
持續使用Cocoapods來管理第三方套件,主要還是以Objective C來開發專案的我,有時候需要使用Swift的Open Source,才發現靜態庫、動態庫、Framework的區別要好好了解一下:P~
現代人使用智慧手機已經脫離不了「相機」,於是許多應用需要取得本機相片 (Fetch Photos from Photo Library),我們開發者要怎麼做,才能輕易取得使用者珍貴的相片呢?
App和Web雙向溝通:
一直是我們想要達成的目標,而先前的兩篇文章:
也就分別實現雙向溝通,只是過程不夠直接,且會衍生一些毛問題。以至於有開源WebViewJavascriptBridge已有6000多顆星,儘管我沒用過XD~
這套件自我介紹:
An iOS/OSX bridge for sending messages between Obj-C and JavaScript in UIWebViews/WebViews
iOS 7以後,SDK發展出JavaScriptCore Framework,Objective C與Javascript的溝通變得更便利!
Apple Watch即將上市,對iOS開發者而言,無疑是個一定要了解的全新裝置,特別是在使用者體驗上,如何設計適合小螢幕的界面。這種改變從電腦轉移到手機已經歷過一次,如今要從手機移轉到手錶,螢幕可是越變越小呢~
在手機上所呈現的界面是透過UIKit framework,而手錶所呈現的界面則是透過WatchKit framework,這兩者有相似的地方,也有許多不一樣的地方
基本上,WatchKit是UIKit的簡化版,之後Apple應該會根據需求新增修改些property或method。一般而言,手錶的功用是瀏覽重於互動,所以framework少有互動的設計。
WKInterfaceObject繼承於NSObject。WKInterfaceImage繼承於WKInterfaceObject、WKInterfaceLabel繼承於WKInterfaceObject,其餘依此類推,都是繼承於WKInterfaceObject。
其property與method也很陽春,只有一些基本的設定。
#import <Foundation/Foundation.h> #import <CoreGraphics/CoreGraphics.h> #import <WatchKit/WKDefines.h> WK_CLASS_AVAILABLE_IOS(8_2) @interface WKInterfaceObject : NSObject - (instancetype)init NS_UNAVAILABLE; - (void)setHidden:(BOOL)hidden; - (void)setAlpha:(CGFloat)alpha; - (void)setWidth:(CGFloat)width; // setting to 0 means use natural size. ignored for table - (void)setHeight:(CGFloat)height; @property(nonatomic,readonly,copy) NSString *interfaceProperty; // same as controller's property name @end @interface WKInterfaceObject (WKAccessibility) - (void)setAccessibilityLabel:(NSString *)accessibilityLabel; - (void)setAccessibilityHint:(NSString *)accessibilityHint; - (void)setAccessibilityValue:(NSString *)accessibilityValue; @end
#import <Foundation/Foundation.h> #import <WatchKit/WKDefines.h> #import <WatchKit/WKInterfaceObject.h> @class UIImage; WK_CLASS_AVAILABLE_IOS(8_2) @interface WKInterfaceImage : WKInterfaceObject - (void)setImage:(UIImage *)image; - (void)setImageData:(NSData *)imageData; - (void)setImageNamed:(NSString *)imageName; - (void)startAnimating; // play all images repeatedly using duration specified in interface description - (void)startAnimatingWithImagesInRange:(NSRange)imageRange duration:(NSTimeInterval)duration repeatCount:(NSInteger)repeatCount; // play subset of images for a certain number of times. 0 means repeat until stop - (void)stopAnimating; @end
我們很驚訝地發現,居然沒有frame這個特性!也就是我們無法設定其座標(但可設定長與高),也無法使用Auto Layout。實際上,WatchKit界面元件只能在格子中透過邊界和相對位置來放置。
還有許多特性需要好好了解,因為本來就不該把手錶當作手機來設計,而簡化自然有其好處!持續去研究吧~
參考:WatchKit – NSHipster。
HappyMan・迴響