[iOS] 在App間分享資料 (Share Data Between Apps)
過去App的資料是被保護在沙盒(Sandbox)之中,因此無法讓其它App來存取。現在Apple設計一個共享區域,在此區域可以讓不同的App來存取,只是這些App必須是同一個開發者呢!
在專案中的Capabilities中打開App Groups,接著創立一個App Groups,我這裡是設定group.happy.share,程式碼中會用到喔~
過去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)。開發者便可以無視實際的尺寸,而是對這兩類和它們的組合進行適應。這樣不論在設計時還是程式碼上,我們都可以不再受限於實際的尺寸,而是變成遵循尺寸的視覺感官來進行適應。
iOS 8釋出已經三個月,我們來看一下現在iOS各版本的市佔率吧!真沒想到,比起Windows各版本市佔率,iOS可是非常快速地讓使用者安心更新!這種無痛升級且能享受更多的功能及服務,當然會讓多數人都能夠接受!
2014/12/08由Apple官方統計,iOS 8占有63%,iOS 7占有33%,最新的兩個iOS版本就占有96%,讓開發者們如我樂觀其成!因為我們只要優先著重在iOS 7以上開發即可,若客戶說想要支援iOS 6,那麼就拿出這一張圓餅圖給他看吧~為了支援不到4%的iOS版本,而多花費時間與金錢在上頭,可不是個明智的選擇呢~
iOS 7以後的扁平化設計,可說是個劃時代的分水嶺,無論是在使用者體驗上,或是在開發者工具上,甚至軟硬體新的功能與服務,都將讓你我引領期盼!期許自己能深入體會研究其中奧妙之處,進而設計出自己與他人都愛不釋手的應用軟體:)~
2020/6/17,iOS 13市佔92%、iOS 12市佔12%、iOS 11之前版本則市佔2%。

此外,參考我正在做的快樂印App,是透過Facebook SDK而來的統計,在開發者後台就能查詢。
2020/9/30最新版本iOS 14有6.72%。至於iOS 10以下版本,可以考慮不要支援,畢竟用戶數非常少,若維護成本過高,就割捨掉吧!
不過我想,還在使用iOS 10以前版本的手機,應該也跑不太動現在我們的快樂印App吧~

接到網友桑尼的委託,我重操舊業,在Dev C++上安裝OpenCV 2.0,之前寫的PSNR (Peak Signal to Noise Ratio)程式碼馬上可以編譯執行,真的是讓我感到欣慰,因為當時舉手之勞記錄研究細節,至今還能派上用場!
桑尼所說的工具ImageJ和Photoshop有計算SNR 與 PSNR的工具,可惜前者下載回來不會用,後者找不到功能,只好我自己來寫!好在因為先前的研究記錄,讓我省下許多時間。
已經開發iOS滿兩年,對於專案中Info.plist常用選項,還是有許多不明白的項目,平常也沒找到相關說明,好在偶然發現前人整理好的經驗談,描述得讓我輕易明白其用途,往後開發App就可以考慮嘗試看看~
原先以為想知道設備資訊 (Device Information),使用原生SDK應該就足夠了,但是很可惜沒有⋯⋯像是我想知道設備是iPhone 6或iPhone 6+,目前沒有API可以呼叫取得,僅可取得iPhone,沒有任何版本識別。
慶幸還有偉大的第三方套件,省去我研究撰寫的時間!
UIDeviceHardware – Determine iOS device being used
之所以想知道設備型號,是因為要傳回server,記錄使用者點擊任何功能的狀況,所以想必那些統計平台都用了類似的方法實作~
專案設定方向(Orientation)只能Portrait,可是在某個視圖(View)想要能夠Landscape,該怎麼做呢?
此view只能portrait,點擊圖片進去後,彼view也要能landscape。
有時候資料量太大,想要讓使用者體驗更好,使用搜尋控制器 (Search Controller)是個好方法!
平常我們會去呼叫其它的App來達到我們的目的,如想要開啟網頁就會叫出Safari App,是怎麼做到的呢?就是使用URL Scheme,格式:
schemename://
schemename可以是以下幾個例子:
| http, https, ftp | : Web links ((launches the Safari app) |
| mailto | : E-mail links (launches the Mail app) |
| tel | : Telephone Numbers (launches the Phone app) |
| sms | : Text Messages (launches the SMS app) |
—
那如果我們想要讓他人能夠開啟我們的App,又該如何做到呢?就來客製化 URL Scheme (Custom URL Scheme)吧!
HappyMan・迴響