那些開發人員應該知道但又略顯模糊的iOS 8 API(1)

來源:互聯網
上載者:User

那些開發人員應該知道但又略顯模糊的iOS 8 API(1)

無論你問任何人,他們都會告訴你:WWDC2014是他們近些時日最令人興奮的一件事,沒有硬體發布資訊,完全是關於軟體和開發人員工具的。

2014年iOS 8和OS X Yosemite的公布將會讓蘋果平台成為今年最具領導力的平台, iOS的擴充性,連續性,SpriteKit增強以及SceneKit,還有Metal,Game HealthKit,HomeKit,Local Authentication和全新的拍照架構。更不用說令人信服的Xcode和Interface Builder,改進後的iTunes Connect、TestFlight、Crash Reports以及CloudKit,當然還有Swift!

還要抱怨嗎? 蘋果已經慷慨地放寬了對新技術的保密措施,這意味著我們現在就可以討論那些閃亮的新東西。

本周,我們將探討下以下列出的功能,分享一些iOS 8中每個人都應該知道的但比較模糊的API。

從現在起,NSHipster將主要使用Swift編寫範例程式碼,當然偶爾會用Objective-C編寫。夏天結束的時候,我們希望所有的現有代碼樣本都能移植到Swift上,從而在語言間進行迅速切換。

## NSProcessInfo -isOperatingSystemAtLeastVersion ##

忘了[[UIDevice currentDevice] systemVersion] 和NSFoundationVersionNumber吧,這裡有一個新的方法可在代碼中確定當前的作業系統:NSProcessInfo -isOperatingSystemAtLeastVersion

 
  1. import Foundation 
  2.  
  3. let yosemite = NSOperatingSystemVersion(majorVersion: 10, minorVersion: 10, patchVersion: 0) 
  4. NSProcessInfo().isOperatingSystemAtLeastVersion(yosemite) // false 

不過請記住,為了測試進行相容性測試的時候),SomeClass.class或respondsToSelector:是檢查作業系統版本的一個更不錯的選擇。C和Swift編譯器的宏可以

用來有條件地編譯基於目標配置的源。基於target的構建配置,C或者Swift編譯的宏可以有條件地編譯原始碼)

## 新 NSFormatter 子類 ##

Foundation架構中最為嚴重缺乏就是對數量單位例如品質和長度的處理能力。iOS中8和OS X Yosemite引入了三個新的類--NSEnergyFormatter、NSMassFormatter以及NSLengthFormatter,填 補了這一缺失。這有效地使Foundation架構中NSFormatter子類的數目加倍,以前僅限於NSNumberFormatter、NSDateFormatter以及NSByteCountFormatter。

雖然這些新的格式化類是Foundation架構中的一部分,但是它們主要在HealthKit中使用。

## NSEnergyFormatter ##

NSEnergyFormatter以焦耳和卡路裡作為格式化能量單位,焦耳是運動鍛煉時用到的單位,卡路裡營養學上熱量單位。

 
  1. let energyFormatter = NSEnergyFormatter() 
  2. energyFormatter.forFoodEnergyUse = true 
  3.  
  4. let joules = 10_000.0 
  5. println(energyFormatter.stringFromJoules(joules)) // "2.39 Cal"

## NSMassFormatter ##

雖然是物質存在的基本單位,但mass在HealthKit中主要指使用者的重量。但還有一句忘記翻譯:是的,Mass和weight是不一樣的,但是在程式中,這裡不是科學課程,所以不要那麼迂腐了!)

 
  1. let massFormatter = NSMassFormatter() 
  2. let kilograms = 60.0 
  3. println(massFormatter.stringFromKilograms(kilograms)) // "132 lb" 

## NSLengthFormatter ##

為完善新NSFormatter,還有一個子類是NSLengthFormatter。把它看成是一個MKDistanceFormatter的更有用版本,它擁有更多的單位選項和格式設定選項。

 
  1. let lengthFormatter = NSLengthFormatter() 
  2. let meters = 5_000.0 
  3. println(lengthFormatter.stringFromMeters(meters)) // "3.107 mi" 

## CMPedometer ##

iOS 8繼續了之前的健康路線,在最近一次發布中,CMStepCounter比之前做了嚴格的改進,可及時從離散資料點進行查詢,跟蹤使用者的步數和距離,甚至計算使用者爬了多少級樓梯。

令人驚訝的是M7的晶片可以勝任這項任務。

 
  1. import CoreMotion 
  2.  
  3. let lengthFormatter = NSLengthFormatter() 
  4. let pedometer = CMPedometer() 
  5. pedometer.startPedometerUpdatesFromDate(NSDate(), withHandler: { data, error in 
  6.     if !error { 
  7.         println("Steps Taken: \(data.numberOfSteps)") 
  8.  
  9.         let distance = data.distance.doubleValue 
  10.         println("Distance: \(lengthFormatter.stringFromMeters(distance))") 
  11.  
  12.         let time = data.endDate.timeIntervalSinceDate(data.startDate) 
  13.         let speed = distance / time 
  14.         println("Speed: \(lengthFormatter.stringFromMeters(speed)) / s") 
  15.     } 
  16. })

## CMAltimeter ##

在支援的裝置上,CMPedometer對floorsAscended/ floorsDescended的統計可使用CMAltimeter進行擴充,以獲得更精細的垂直距離:

 
  1. import CoreMotion 
  2.  
  3. let altimeter = CMAltimeter() 
  4. if CMAltimeter.isRelativeAltitudeAvailable() { 
  5.     altimeter.startRelativeAltitudeUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: { data, error in 
  6.         if !error { 
  7.             println("Relative Altitude: \(data.relativeAltitude)") 
  8.         } 
  9.     }) 

## CLFloor ##

CLFloor是iOS 8中的新API,CoreMotion中的新功能體現了蘋果公司的雄心勃勃的室內導航計劃。這些資訊將會在本地化導航應用中扮演重要的角色。

 
  1. import CoreLocation 
  2.  
  3. class LocationManagerDelegate: NSObject, CLLocationManagerDelegate { 
  4.     func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) { 
  5.         let location: CLLocation? = locations[0] as? CLLocation 
  6.         if let floor: CLFloor? = location?.floor { 
  7.             println("Current Floor: \(floor?.level)") 
  8.         } 
  9.     } 
  10.  
  11. let manager = CLLocationManager() 
  12. manager.delegate = LocationManagerDelegate() 
  13. manager.startUpdatingLocation() 

## HKStatistics ##

作為一個架構,HealthKit涉及了很廣泛的範圍,包括許多個新的類和常量。理解HKStatistics存在的可能性給了開發人員一個良好的開端。

HealthKit在一個統一的API中管理著來自使用者所有裝置中的生物資料,可以用強大的方式跟蹤並匯總使用者的多項生物資料,比如心率、熱量攝入以及有氧輸出等資料。

下面樣本展示了如何對持續一天的資料進行分組和逐個解讀:

 
  1. import HealthKit 
  2.  
  3. let collection: HKStatisticsCollection? = ... 
  4. let statistics: HKStatistics? = collection!.statisticsForDate(NSDate()) 
  5. for item: AnyObject in statistics!.sources { 
  6.     if let source = item as? HKSource { 
  7.         if let quantity: HKQuantity = statistics!.sumQuantityForSource(source) { 
  8.             if quantity.isCompatibleWithUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo)) { 
  9.                 let massFormatter = NSMassFormatter() 
  10.                 let kilograms = quantity.doubleValueForUnit(HKUnit.gramUnitWithMetricPrefix(.Kilo)) 
  11.                 println(massFormatter.stringFromKilograms(kilograms)) 
  12.             } 
  13.  
  14.             if quantity.isCompatibleWithUnit(HKUnit.meterUnit()) { 
  15.                 let lengthFormatter = NSLengthFormatter() 
  16.                 let meters = quantity.doubleValueForUnit(HKUnit.meterUnit()) 
  17.                 println(lengthFormatter.stringFromMeters(meters)) 
  18.             } 
  19.  
  20.             if quantity.isCompatibleWithUnit(HKUnit.jouleUnit()) { 
  21.                 let energyFormatter = NSEnergyFormatter() 
  22.                 let joules = quantity.doubleValueForUnit(HKUnit.jouleUnit()) 
  23.                 println(energyFormatter.stringFromJoules(joules)) 
  24.             } 
  25.         } 
  26.     } 

NSHipster後期將涵蓋更多有關HealthKit的功能,敬請期待!

## NSStream +getStreamsToHostWithName ##

從很多方面看,WWDC 2014上蘋果修補了此前存在的諸多不足之處。一些很小的事情,比如添加缺失的NSStream initializer,而不是依賴笨拙橋接CFStreamCreatePairWithSocketToHost的調用。這就是+[NSStream getStreamsToHostWithName:port:inputStream:outputStream:]

 
  1. var inputStream: NSInputStream? 
  2. var outputStream: NSOutputStream? 
  3.  
  4. NSStream.getStreamsToHostWithName(hostname: "nshipster.com", 
  5.                                       port: 5432, 
  6.                                inputStream: &inputStream, 
  7.                               outputStream: &outputStream) 

## NSString -localizedCaseInsensitiveContainsString ##

又如下面這個是“小而堅實的修複”,一種更簡便的NSString的方法:

 
  1. let string: NSString = "Café" 
  2. let substring: NSString = "É" 
  3.  
  4. string.localizedCaseInsensitiveContainsString(substring) // true

## CTRubyAnotationRef ##

如果你是一個語言學和文字排版的執著者,那麼CoreText架構新增添的部分可能會令你起身歡呼了。

......哦對。不過這個Ruby不是你印象中的Ruby,它用來在某些亞洲人的指令碼中展示字元發音的。

 
  1. @import CoreText; 
  2.  
  3. NSString *kanji = @"貓"; 
  4. NSString *hiragana = @"ねこ"; 
  5.  
  6. CFStringRef furigana[kCTRubyPositionCount] = 
  7.     {(__bridge CFStringRef)hiragana, NULL, NULL, NULL}; 
  8.  
  9. CTRubyAnnotationRef ruby = 
  10.     CTRubyAnnotationCreate(kCTRubyAlignmentAuto, kCTRubyOverhangAuto, 0.5, furigana);

不可否認,文檔沒有完全清晰地描述如何精確地將這部分合并到剩餘的CoreText繪製調用中,但是結果看起來也許會是這樣:

ねこ

## 新的日曆識別符 ##

有什麼比Ruby注釋更書獃子氣的?iOS 8和OS X Yosemite中添加了新日曆標識符。此次更新讓Foundation架構更新至最新的CLDR版本。不過,在NSHipsters看來,French Republican Calendar法國共和曆)依然有自己的亮點。

新日曆識別符:

- NSCalendarIdentifierCoptic: 又名亞曆山大曆,之前被Coptic Orthodox Church使用。

- NSCalendarIdentifierEthiopicAmeteMihret:埃塞俄比亞日曆,Amete Mihret公元8世紀左右)

- NSCalendarIdentifierEthiopicAmeteAlem:埃塞俄比亞日曆,Amete Alem公元前5493前後)

- NSCalendarIdentifierIslamicTabular:一個簡單的伊斯蘭曆法表格,在公元622年7月15日星期四的天文時代使用。

- NSCalendarIdentifierIslamicUmmAlQura:在沙地阿拉伯使用的伊斯蘭烏姆Qura日曆。根據天文計算,而不是表格的行為。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.