2013-10-16 57 views
12

我有一個非常簡單的應用程序示例,初始化和更新用戶的位置..在設備上它成功地拋出另一個回調位置每秒左右但設備(iPhone運行iOS7)調用該方法一次,然後神祕地停止...iOS7核心位置不更新

//Setup Location Manager in ViewDidLoad 
locationManager = [[CLLocationManager alloc] init]; 
[locationManager setDistanceFilter:kCLDistanceFilterNone]; 
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[locationManager setDelegate:self]; 
[locationManager startUpdatingLocation]; 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    NSLog(@"location services not turned on"); 
} 

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    NSLog(@"loactions %@", locations); 
} 

-(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 

    NSLog(@"new location %f, and old %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude); 
} 

在iOS6這個應用程序工作完美並不斷更新設備的位置...自iOS7以來有什麼改變?

+0

didUpdateLocations方法是否觸發? – karthika

+0

它的觸發,但只有一次... –

+0

你在這個方法中調用stopUpdatingLocation? – karthika

回答

12

這裏有幾件事情:

1 - 我沒有看到任何地方的財產:pausesLocationUpdatesAutomatically。該屬性的默認值是Yes。這意味着根據您的activityType(見#2),GPS會暫停更新,這可能是您沒有獲得更新的原因。該算法是一個黑盒子,只有蘋果知道,也許在iOS6和iOS7之間有所變化。將暫停位置更新自動設置爲「否」可能會影響電池。

2-您應該根據您的應用程序設置您的activityType。默認是CLActivityTypeOther,我不確定它是如何影響GPS算法和上述#1的。因此,爲了最初測試您的應用程序,我會適當地設置activityType,並將pausesLocationUpdatesAutomatically更改爲否。在我的測試中,我會每隔一秒更新一次(我在一夜之間測試過它)。

3-位置更新測試需要移動。爲了獲得更好的結果,我會使用您設置的activityType進行測試。換句話說,如果activityType是CLActivityTypeFitness,我會四處走動來測試它,等等。

4- locationManager didUpdateToLocation fromLocation在iOS7中已棄用。另外,如果locationManager didUpdateLocations被實現,前者將不會被調用。所以在你上面的例子中,locationManager的didUpdateToLocation fromLocation沒有被調用。

5-在kCLLocationAccuracyBestForNavigation和kCLLocationAccuracyBest之間沒有真正的電池使用差異。另一方面,kCLLocationAccuracyBestForNavigation使用最高速GPS,並將其與加速度計數據結合起來。

所以我會從設置activityType開始,將pausesLocationUpdatesAutomatically設置爲NO並將desiredAccuracy更改爲kCLLocationAccuracyBestForNavigation。一旦獲得持續更新,那麼我會將pausesLocationUpdatesAutomatically設置爲Yes,並嘗試使用代碼來實現相同的應用程序可用性。

希望這有助於

+0

如果我將我的應用放在背景中,走到A點,然後停止移動20分鐘。然後我開始再次移動到POINT B.在這段時間內,該應用程序仍處於後臺。當我以前景模式打開我的應用時,didUpdateLocations會給我POINT A和POINT B之間的所有位置嗎? –

+0

不,它不會,GPS芯片接收的位置將直接通過locationManager:didUpdateLocations方法傳遞。所以如果你想存儲一個位置路徑,你必須在收到它們時直接存儲它們。 – Leon