1. 程式人生 > >獲取手機的指南針和行進方向

獲取手機的指南針和行進方向

Core Location支援兩種方式去獲取方位相關的資訊:

heading:有磁力計的裝置可以獲得指南針方向.

course:有GPS的裝置可以獲取裝置的行進方向和速度.

加入方向相關的事件

info.plist里加入UIRequiredDeviceCapabilities相關的鍵:

  • magnetometer:磁力計,獲取heading資訊
  • gps:獲取course資訊.

獲取Heading相關的事件

  1. 建立CLLocationManager物件.
  2. 通過呼叫headingAvailable類方法來檢查heading事件是否有效.
  3. 賦值給location manager的delegate.
  4. 如果你要真實的北方,開始定位服務.
  5. 呼叫startUpdatingHeading方法,開始heading事件的遞送.
- (void)startHeadingEvents {
   if (!self.locManager) {
      CLLocationManager* theManager = [[[CLLocationManager alloc] init] autorelease];
 
      // Retain the object in a property.
      self.locManager = theManager;
      locManager.delegate = self;
   }
 
   // Start location services to get the true heading.
locManager.distanceFilter = 1000; locManager.desiredAccuracy = kCLLocationAccuracyKilometer; [locManager startUpdatingLocation]; // Start heading updates. if ([CLLocationManager headingAvailable]) { locManager.headingFilter = 5; [locManager startUpdatingHeading]; } }

你賦值給delegate

的物件,一定要遵循CLLocationManagerDelegate協議.當一個新的heading事件到達時,location manager會呼叫locationManager:didUpdateHeading:方法去遞送這個事件給app.一旦接收到一個新的事件,檢查headingAccuracy屬性去確保你接收的資料是有效的.如果你要用的是真實的heading,在使用它之前,同樣要檢查它是否包含有效的值.

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
   if (newHeading.headingAccuracy < 0)
      return;
 
   // Use the true heading if it is valid.
   CLLocationDirection  theHeading = ((newHeading.trueHeading > 0) ?
            newHeading.trueHeading : newHeading.magneticHeading);
 
   self.currentHeading = theHeading;
   [self updateHeadingDisplays];
}

當用戶在移動時攻取course資訊

在獲取當前使用者定位時,就可以獲取course和速度.



作者:輕雲綠原
連結:https://www.jianshu.com/p/4215da02ca6e
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。