蘋果每發布一個系統,都夠開發人員忙活一陣的,更新xcode適配新系統:像iOS4支援Retina需要@2x的圖;像iOS5不支援udid;像現在的iOS6和iPhone5要面對的下面的一堆問題。
1.添加Retina 4 launch image,運行工程的時候會主動提示你。
這時候直接點Add就好了。會預設添加一張Default-568h@2x.png的黑圖:
不添加的話,程式運行起來會上下有黑邊兒。
添加完以後的效果
這個地方再囉嗦兩句:當透明第一次在群裡說要添加這麼一張圖的時候,我的第一反應是:那不是程式啟動的時候會有一張黑圖嗎?而我的程式是不需要啟動圖的。而當自已添加這張圖的時候才發現,這個擔心是多餘的。估計蘋果自已做了什麼最佳化,判斷出來是黑圖的時候就直接給跳過了。
2.Group Table View Background Color is Deprecated in iOS 6.0
在使用背景色的時候,我最喜歡用的一個系統內建的顏色就是:”Group Table View Background Color”。現在既然這個顏色消失了,換個別的顏色就好嘍。
3.關於多個Target
我們知道添加圖片的時候,會直接添加到工具裡,這時候如果有多個Target的時候,直接將Default-568h@2x.png檔案,拖拽到相應的”Copy Bundle Resources”裡就好了。
再有要注意的就是多個Target在模擬器啟動並執行時候,現在不像原來那麼方便,直接切換設定檔就可以運行了。需要在測試不同Target表示的時候,除了切換設定檔還需要清空模擬器,不然不好使喲~
4.xcode4.5不再支援armv6即:iOS4.3.3以下的系統.
不被支援的硬體裝置包括:iPod 2nd gen, iPhone 3G 或更老的iPhone
例如我打包時的錯誤提示就是:
1 2 |
warning: iOS deployment targets lower than 4.3 are not supported (current IPHONEOS_DEPLOYMENT_TARGET = "4.0", ARCHS = "armv7"). (null): iPhone/iPod Touch: application executable is missing a required architecture. At least one of the following architecture(s) must be present: armv6 (-19033) |
因為喜歡用Block,所以我開發的東東,一般最低都支援iOS4.0,看來是蘋果逼著開發人員和使用者升級啊。
5.奉上一段判斷iPhone的代碼
1 |
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO) |
用時候直接
就可以了。
另外,如果代碼寫介面的話,在iPhone5下View的高是568喲~
6.關於xib自適應的問題
預設的話,如果你的介面上包含scrollview/TableView的話,這個介面基本上是不用改的,因為中間部分會自動展開。如果不包含這兩個全屏的控制項的話,怕是要自已再添加一個專門針對iPhone5的xib了。辦法很簡單,建立一個xib檔案,將裡面view的size設定成Retina 4 Full Screen就可以了。上面已經提到怎麼判斷iPhone5了,怎樣讀取不同的xib檔案不用上代碼了吧?
7.關於旋轉螢幕
(iOS5的時候就出過一次狀況,這次又來)
要深入理解這個問題,還需要您自已親自做一些實驗,iOS6取消了一個api,增加了兩個api,但是這一去一加滿足不了我的情況:應用在所有的介面都是豎屏,只在一個螢幕是橫屏。就這一個情況要實現費了我半天的功夫。只說一下我最後怎麼實現的。
首先:這橫屏的xib裡面的view就是橫的
其次:螢幕適應只支援橫屏
1 2 3 |
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ return UIInterfaceOrientationIsLandscape(interfaceOrientation); } |
第三:在這個view是present出來的
第四:viewDidLoad裡隱藏狀態列
1 2 3 4 5 6 |
- (void)viewDidLoad{ if (IOSSystemVersion >= 5.0) { //5.0及以後,不整這個,介面錯位 整這個帶動畫的話,容易看到一個白頭 [[UIApplication sharedApplication] setStatusBarHidden:YES]; } } |
第五:viewWillAppear自已將view旋轉90度
1 2 3 4 5 6 7 8 9 10 11 12 13 |
- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [UIView animateWithDuration:0.0f animations:^{ [self.view setTransform: CGAffineTransformMakeRotation(M_PI / 2)]; if (iPhone5) { self.view.frame = CGRectMake(0, 0, 568, 320); } else{ self.view.frame = CGRectMake(0, 0, 480, 320); } }]; } |
8.第三方庫
如果工程裡用到第三方庫了,打包的時候還會提示下面的問題:
1 2 |
ld: file is universal (3 slices) but does not contain a(n) armv7s slice: /Users/rainbird/Desktop/myapp/iFileManager/iFileManager/ZBarSDK/libzbar.a for architecture armv7s clang: error: linker command failed with exit code 1 (use -v to see invocation) |
上面的提示就是我使用的libzbar這個庫不支援armv7s。
關於第三方庫,如果是閉源的,像一些廣告的SDK以及合作方提供的SDK就只能等了,人家啥時候更新啥時候算。像我遇到的ZBarSDK,這種第三方開源的SDK,就不要等了,還是自已動手豐衣足食吧。
首先關於閉源的庫,一個臨時的解決辦法就是,先取消對armv7s的支援,這樣就可以不用等第三方的庫就開始測試了,辦法是:在Xcode裡,點擊相應的Target,然後點Build Settings,找到VALID_ARCHS,然後刪除裡面的arvm7s,就可以了。
上面只是臨時解決辦法,說正事兒,以編譯ZBar為例:
- 1.去Zbar的首頁,下載源碼包。
- 2.解壓後,進入裡面的iPhone檔案夾,刪除裡面的Examples,雙擊zbar.xcodeproj運行工程。
- 3.Command+B編譯工程(當然了這一步會提醒更新Setting,建議更新完以後再運行)。
4.然後在lib上點右鍵去目錄裡找。
本來故事到這裡應該就結束了,但是上面找到的那個檔案,只能在真機用,模擬器用不了,怎麼辦呢?
進入到這個工具的Build目錄,會看到下面這些目錄
Debug-iphoneos/ Debug-iphonesimulator/ Release-iphoneos/ Release-iphonesimulator/
自已動手將模擬器的包和真機的包合并一下就好了。
1 2 3 |
[rainbird@localhost Products]$ pwd /Users/rainbird/Library/Developer/Xcode/DerivedData/zbar-athgobfbdtwgftgcogpuwegpawlj/Build/Products [rainbird@localhost Products]$ lipo -create Release-iphoneos/libzbar.a Release-iphonesimulator/libzbar.a -o libzbar.a |
解釋一下lipo合并兩個庫的命令:lipo -create第一個包 第二個包-o合并以後的包
這樣的話,得到的libzbar.a就可以同時在模擬器和真機用了。這裡有個小插曲,靜態庫編譯一次,會產生所有的包,而我一上來就用的真機上的包,然後模擬器上用不了,又在真機的位置找了半天,以為產生不了模擬器的包,哎,思維定勢了。
關於lipo還有一個常用的命令就是查看包的資訊-info參數
1 2 |
[rainbird@localhost Products]$ lipo -info libzbar.a Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386 |
轉載請註明:dApps開發人員 » 舊工程適配iOS 6和iPhone 5的一些故事