搜尋此網誌

工商服務

2013年9月26日 星期四

[改版秘技]隨著 iOS 版本更迭,如何呼叫正確版本的 API 函式?

↑警告訊息指出所使用的特定 API 從 iOS 6 版本開始就已經不再建議使用了。

隨著 iOS 版本更迭,基於更能夠符合開發者所需以及追求更好的效率等理由,有些 API 也會跟著與時俱進,於是官方文件甚至是 Xcode 開發工具都會提醒你,有些 API 已經不宜也不建議再使用了(英文會用「 deprecated 」這個字眼),而就算使用了也不會立即導致 App 發生錯誤,但是並不能保證在未來那些 deprecated API 不會被取消並移除,所以官方文件和 Xcode 開發工具一方面想要提醒開發者已經有改良版的替代性 API 可供使用了,另一方面也是想要鼓勵開發者趕緊加快採用新版 API 的腳步。至於正確的替代性 API 是哪些,則可以在官方文件和 deprecated API 的表頭檔註解中看到。

舉例而言,喚起另一個 ViewController 到前景,然後把本來正在檢視的 ViewController 蓋住的 API ,原本是 presentModalViewController ,但是在 iOS 6 之後就被 presentViewController 給取代了。於是當我們在 Xcode 4.6.3 中開發適用於 iOS 6.1 的 App 時,便會在 Xcode 的編輯區中看到黃色三角形驚嘆號的警告提示,指出「 'presentModalViewController:animated:' is deprecated: first deprecated in iOS 6.0 」。

至於哪個新版 API 才是替代品呢?按住 command 鍵然後以滑鼠游標點擊 Xcode 編輯區中出現底線超連結模樣的 presentModalViewController 字眼,這樣就可以在表頭檔中看到替代品是 presentViewController 。下列是擷取自 UIKit.framework 的 UIViewController.h 表頭檔的內容:

// Display another view controller as a modal child. Uses a vertical sheet transition if animated.This method has been replaced by presentViewController:animated:completion:

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

但是如果在開發 iOS 6 App 的時候,也想要同時回溯支援前一代的 iOS 5 ,那麼就必須想辦法讓新舊 API 能夠和平共處,並且在每次都呼叫到正確的 API 版本。解決方法就是在呼叫這些 API 之前,先透過 respondsToSelector 來測試是否存在新版的 API ,也就是說如果不存在的話,就改成呼叫原先舊版的 iOS SDK 能夠支援的那個 API 。示範如下:

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)])
  [self presentViewController:theViewController animated:YES completion:nil];
else
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  [self presentModalViewController:theViewController animated:YES];
#pragma clang diagnostic pop

在上面的程式碼中,使用的 #pragma 是為了抑制 Xcode 的編輯器,不要讓它在看到 deprecated API 的時候又跑出黃色三角形驚嘆號的警告提示來了。

PS:在官方 2010 年出版的《 SDK Compatibility Guide 》線上文件裡面,就有一個小節叫做〈 Finding Instances of Deprecated API Usage 〉(找出使用了舊版 API 的實體)是在講這件事。

【奇步學習分級:中級】

───
奇步應用的臉書粉絲專頁經常分享新知趣聞,歡迎加入追蹤。

2013年9月14日 星期六

[上架秘技] Bundle ID 必須是唯一的,就算開發者帳號不同也一樣!

↑圖 1 :同名的 Bundle ID 會遭遇錯誤。

↑圖 2 : App ID 名稱可以重複。

↑圖 3 : App ID 在建立完畢之後是可以修改的。

因為工作上的需要,我們手邊有好幾組 Apple Developer 帳號,每個帳號底下有好幾支 App 。當然每支 App 都擁有各自的 App ID 和 Provisioning Profile ,以便進行開發( Development )與散佈( Distribution )。

突然有一次,我們必須將開發好的 App 改用合作廠商的帳號來上架,於是首先登入到廠商的帳號裡面,接著試圖建立對應的 App ID 和 Provisioning Profile ,原本圖個方便想要沿用在開發時所採用的同一組 App ID 和 Bundle ID 名稱,卻遭遇了「 An App ID with Identifier 'XXX' is not available. Please enter a different string. 」錯誤訊息,這才意識到儘管 App ID 可以是相同的(如圖 2 所示),但是 Bundle ID 卻不可以(如圖 1 所示)。

Bundle ID 欄位上方的說明裡面所稱的「 enter a unique string in the Bundle ID field 」可不是在開玩笑的, Bundle ID (由 com.domainname.appname 格式所組成)基於識別的用途,在整個 App Store 中必須是唯一的。基於這個理由,就算是不同的開發者帳號底下的 Bundle ID ,也都必須是唯一的。

另一方面, App ID 在建立完畢之後,其名稱是可以修改的(如圖 3 所示),而與 App ID 關聯的 Bundle ID 則是不可以再修改的,這項事實同樣反映了「在整個 App Store 中 Bundle ID 必須是唯一的」。

【奇步學習分級:中級】

───
奇步應用的臉書粉絲專頁經常分享新知趣聞,歡迎加入追蹤。

2013年9月12日 星期四

[工具秘技]在 Xcode 專案中,如何加入程式庫以避免編譯錯誤?

↑在 Xcode 中新增框架的範例畫面截圖。

↑遭遇「 Apple Mach-O Linker Error」連結器錯誤。

Objective-C 的程式庫( Library )叫做框架( Framework )。

在建置專案( Xcode 上方主選單: Product → Build )時,如果找不到原始檔或程式庫,就會遭遇連結器錯誤。這時候只需要將適當的 Framework 新增到專案中,問題便可迎刃而解。

舉例而言,假設是一支使用到 MPMoviePlayerController 的多媒體影音 App ,光只有在 .h 中加入「 MPMoviePlayerController *moviePlayer; 」之類的變數宣告,將會遭遇「 Unknown type name 'MPMoviePlayerController' 」錯誤,於是接著嘗試加入了「 #import "MediaPlayer/MediaPlayer.h" 」之類的表頭檔匯入動作,但是一旦在 .m 中加入「 moviePlayer = [[MPMoviePlayerController alloc] init]; 」之類的初始化動作時,卻會遭遇「 Apple Mach-O Linker Error 」連結器錯誤。終究你將會恍然大悟,原來一切都是因為忘記匯入程式庫所引起的。

至於需要加入哪些程式庫呢?在 Apple 官方的 iOS Developer Library 的相對應
 Class Reference 中會有詳細的說明。以 MPMoviePlayerController 這個類別為例,這份〈 MPMoviePlayerController Class Reference 〉文件在開頭處便指出了需要被額外加入的程式庫是 MediaPlayer.framework 。

以 MPMoviePlayerController 為例,在 Xcode 中加入所需 Framework 的方法如下:
  1. 開啟 Xcode (本例中使用的是 4.6.3 版本,搭配 iOS 6 Simulator )。
  2. 切換到 Project Navigator 分頁,點選最上方的根節點(即專案名稱本身)。
  3. 點選 TARGETS 項目,然後切換到 Build Phases 分頁。
  4. 展開 Link Binary With Libraries ,點選「 + 」。
  5. 在彈出的視窗中,於 Choose frameworks and libraries to add: 欄位中輸入 mediaplayer 充當關鍵字進行篩選。
  6. 選取 MediaPlayer.framework 並按下 Add 以新增程式庫。


───
奇步應用的臉書粉絲專頁經常分享新知趣聞,歡迎加入追蹤。

Related Posts Plugin for WordPress, Blogger...