WatchKit

更新

Xcode 6.2 beta 4 之後,就有「+ openParentApplication:reply:」可以呼叫,可以解決大部分的 Watch App Extension 與 Hosting App 之間的溝通問題。這篇大概是 code 6.2 beta 1 推出時寫的。

另外,Hosting App 要通知 Watch App Extension,大概還是得透過 CFNotificationCenter。

原文如下:

要開始嘗試使用 WatchKit 開發 Apple Watch 的相關應用,首先要安裝 Xcode 6.2 Beta 版本與 iOS 8.2 SDK,然後從 File 選單中,選擇 New Target,再從 Apple Watch 分頁中選擇 Watch App。

Xcode 6.2 Beta 版本有個 Bug,如果你原本的專案檔案中,Build Phases 裡頭包含了 Run Script Phase,那麼再加入了 Watch App 之後,Xcode Beta 就會一直當一直當一直當。

所以,在目前 Apple Watch 還沒有上市,蘋果也只提供 Beta 版本的開發工具,只能夠用模擬器模擬運作,一切都還不穩定的狀況下,我們想要先了解 WatchKit 的架構,必須把 Watch App 加到一個沒有 Run Script Phase 的專案中,或是可以把原本專案的 Run Script Phase 砍了,或是開一個新的測試專案。

Continue reading

iOS 8 一些跟 Audio 相關的改變

iOS 8 裡頭 Audio API 的底層有一些改變,但是蘋果改了這些地方,也沒有在文件裡頭說清楚,一開始也不會注意到這麼微小的改動。所以你原本寫的程式在升到 iOS 8 之後,就會出現一些奇怪的行為。

蘋果改動了 Audio Session 的行為。Audio Session 是一套在 iOS 裝置上用來描述、管理你的 App 使用的是哪一種 Audio 的方式,以及因為使用某種類型(Audio Session Category)的 Audio 所產生的對應行為。

Continue reading

捷運轉乘

前陣子花了點時間寫了一個簡單的免費 iOS App,叫「捷運轉乘」,現在可以直接在 App Store 下載,也可以在 Github 上取得程式碼

這個 App 做的事情很簡單,就是幫你計算兩個台北捷運站之間經過車站最少、或是轉乘次數最少的路徑。由於裡頭包含了松山線的資料,在捷運松山線通車、台北捷運路網變得複雜之後,如果你也開始有不知道應該怎麼轉搭捷運的困擾,希望這個 App 可以有些幫助。

Continue reading

你為什麼不該在你的 iOS 軟體專案中使用 Storyboard

Storyboard 是蘋果從 iOS 5 起在 Xcode 開發工具中增加的新功能。

一直以來,無論是 Mac OS X 或是 iOS,都可以將應用程式所需要的介面呈現放在 nib 或是 xib 檔案中。我們可以用介面設計工具 Interface Builder(Xcode 4 整合到 Xcode 中),使用視覺化方式編輯 nib 或 xib 檔案,在程式執行時讓 runtime 將檔案中的 UI 定義轉換成對應的 Objective-C 物件。

因為之前有人問我為什麼有些 UIView subclass 在建立時會呼叫 initWithCoder:,而不是 initWithFrame:,其實並不難懂,這邊簡單解釋一下:nib 檔案是將 Objective-C 物件 serialize 成 binary data 的格式,所以用 nib 建立 UI,其實可以想成就是把 serialize 過的 data 再轉回物件;Objective-C 中負責處理物件/serialized data 相互轉換的物件叫做 NSCoder,所以你定義在 nib 裡頭的 view 在被建立時,呼叫到的就是 initWithCoder: 了,這套物件與資料轉換的機制,同時也是 Mac OS X 與 iOS 上實作 copy/paste 的基礎。而 xib 檔則是用 XML 格式表示 nib 檔的內容,在現在的開發流程中,平時我們會編輯 xib 檔案,但 xib 檔案會在 compile time 時被編譯成 nib 檔。

Storyboard 是這種視覺化開發方式的進一步發展。

在 iOS 5 之前,如果應用程式中有許多畫面,負責每個畫面的是各自的 view controller,在每個 view controller 中除了可以用程式碼撰寫建立 UI 物件外(實作 loadView: 這個 method),另一種方式則是讓每個 view controller 有各自對應的 nib 或 xib 檔案;Storyboard 則是將應用程式中原本有多個 nib 或 xib 檔案,合併成一個巨大的 XML,不但可以一次看到所有的畫面設計,也可以看到每個畫面之間透過線條串連起來的關係。或許可以這麼說:Storyboard 除了是一套畫面的設計工具外,也是一套說明在時間中畫面如何變化的敘述工具。

不過,在你的軟體開發專案中,建議不要使用 Storyboard。

Continue reading

在 Mac OS X/iOS 上指定中文排序

前一陣子遇到一個需求:我們現在有一個 array,裡頭是一堆中文字串,現在我們想要讓這些中文字串按照一些個定的中文索引方式排序,像是使用筆劃、拼音…等等。搞了半天,發現只要在 compare 的時候,選擇特定的 NSLocale 就好了,但是蘋果自己的文件中,居然對於有這些 Locale 可以設沒什麼著墨,顯然很多時候光看蘋果的文件是不夠的。

我們先來看段使用筆畫排序的程式碼:

NSArray *a = @[
	@"落魄江湖載酒行",
	@"楚腰纖細掌中輕",
	@"十年一覺揚州夢",
	@"贏得青樓薄倖名"];
NSLocale *strokeSortingLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh@collation=stroke"];
a = [a sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
	return [obj1 compare:obj2 options:0 range:NSMakeRange(0, [obj1 length]) locale:strokeSortingLocale];
}];
for (NSString *s in a) {
	NSLog(@"%@", s);
}

Continue reading

在桌面應用程式中使用 WebKit (5) - Mobile Safari 的 Plug-in

這一篇的內容對很多人來說大概沒什麼用,因為就算照著這篇提到的東西,寫了點程式出來,實際上也沒多少機會可以在使用者的裝置上應用,可是呢,只要討論 Cocoa,好像大部分人都興趣缺缺,談到 iPhone 卻又興致盎然。

※ iOS 的 WebKit Plug-in 基本上是一樣的

前一篇提到,我們可以直接在 Xcode 當中,透過 Xcode 本身所提供的專案範本,產生 WebKit Plug-In 專案,我們現在來做點好玩的事情。-我們把原本專案裡頭所有跟 Cocoa 相關的東西都拿掉,像是 Import Cocoa Framework 的地方,改成 Import UIKit,NSView 改成 UIView,NSRect 改成 CGRect,把 Base SDK 從 Mac OS X 改成 iPhone Simulator,在 iPhone 上面沒有定義 WebPlugInViewFactory,我們先拿掉,或是自己定義一個,裡頭只要宣告 + plugInViewWithArguments: 即可。

Continue reading