[iOS] 發佈版本給使用者測試 (Crashlytics Distribution for User Test)
曾經陪我們測試過許多App的平台Testflight,即將在這個月底(2/26)結束營業XD~好啦,其實是被Apple買去,整合到iTunes Connect中,未來可以去嘗試看看。
在此,我要介紹另一個發佈版本給使用者測試平台Crashlytics,它有三大功能:
- 回報崩潰事件
- 追蹤使用者狀況
- 發布版本給使用者測試
過去我很常使用1和2,現在可以來嘗試3。
曾經陪我們測試過許多App的平台Testflight,即將在這個月底(2/26)結束營業XD~好啦,其實是被Apple買去,整合到iTunes Connect中,未來可以去嘗試看看。
在此,我要介紹另一個發佈版本給使用者測試平台Crashlytics,它有三大功能:
過去我很常使用1和2,現在可以來嘗試3。
承接深度了解專案:電話字 (Sample Project: Phoneword),再來學習多螢幕架構,同樣也是跟Xcode非常相似的做法,看到介面很快就能上手!
簡直就一模一樣嘛⋯⋯view controller的連結也是透過拉藍色線!
過去我鮮少使用Storyboard,多使用Xib,不過因Apple一直在推廣Storyboard(範例程式都以它為主),我們豈能守舊而唯Xib獨尊?想想過去技術高手只想用code,來處理App所有層面的事情,現在看起來是多麽不切實際呢!之所以會發明新的工具,就是想增進開發效率,所以讓我們來擁抱改變吧!
承接範例專案:電話字 (Sample Project: Phoneword),再來就是解釋它怎麼運作,包含Xamarin介面和C#程式碼,還有很重要的是Xamarin.iOS Application的剖析。
看起來和Xcode裡的檔案架構很類似呢!學習來格外輕鬆~
在瞭解Xamarin介紹與研究後,接著就去下載並且安裝Xamarin Studio,再來當然就是要來跑「飯粒」專案囉~如此可快速上手Xamarin!
官方提供的範例專案:工作清單 (Sample Project: Tasky),下載後開啟專案,即可直接編譯執行,除了在模擬器 (Simulator)上跑,也能在實機 (Device)上跑呢!而模擬器居然是開啟Xcode附帶的iOS模擬器,所以感覺相當親切:)~
有目標的學習是最快學會一套工具的最好方式!於是乎,Xamarin官方的快速開始教學範例專案:電話字 (Sample Project: Phoneword),引領我熟悉這有著神秘面紗的IDE (整合開發環境)。
這畫面看起來是不是很像Xcode的樣子呀?!
Launch Image (Launch Screen)顯示時間是由系統決定,不過我們可透過讓App睡覺的方式,來延長顯示啟動畫面的時間。
以垃圾管家App開啟畫面為例。
只要一行程式碼,即可做到延遲的效果喔!在AppDelegate.m中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
sleep(5);
}
每年iOS更新後,SDK中多少會有些API在最新的版本被棄用,此時就要去寫condition code分別跑在不同版本的iOS。Notification也在iOS 8有所變動,包含Remote Notification與Local Notification,我們就來看怎麼改比較容易吧~
如果沒有處理iOS 8的情況,是不會跳出請求允許傳送通知的提示喔!
過去App的資料是被保護在沙盒(Sandbox)之中,因此無法讓其它App來存取。現在Apple設計一個共享區域,在此區域可以讓不同的App來存取,只是這些App必須是同一個開發者呢!
在專案中的Capabilities中打開App Groups,接著創立一個App Groups,我這裡是設定group.happy.share,程式碼中會用到喔~
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。
大小類別 (Size Class)是iOS 8新釋出的類別,主要目的是想要解決設備歧異的問題,透過實作Size Class,我們可以減少許多客製設備類別 (iPhone、iPad)與螢幕大小 (iPhone:3.5吋、4吋、4.7吋、5.5吋,iPad:7.9吋、9.7吋)的程式碼!還有之所以推出,是為了因應未來有更多不一樣螢幕大小的產品(如Apple Watch),所以若能採用Size Class便可減輕開發負擔!
其分為普通(Regular)和緊密 (Compact)兩個種類(class)。開發者便可以無視實際的尺寸,而是對這兩類和它們的組合進行適應。這樣不論在設計時還是程式碼上,我們都可以不再受限於實際的尺寸,而是變成遵循尺寸的視覺感官來進行適應。
HappyMan・迴響