2012-03-30 62 views
4

在底部(在AppDelegate.m中),您可以看到我的CLLocationManager委託方法,它們都不會被調用。我正在使用GPX文件,但即使這些區域沒有輸入或退出,也應該調用代理方法didStartMonitoringForRegion爲什麼我的CLLocationManager沒有響應startMonitoringForRegion?

SomeOtherClass.m

AppDelegate appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
[appDelegate.locationManager startMonitoringForRegion:regionToMonitor desiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate> 
@property (nonatomic, retain) CLLocationManager *locationManager; 

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    if (locationManager==nil) { 
     locationManager = [[CLLocationManager alloc] init]; 
     locationManager.delegate = self; 
    } 

    return YES; 
} 

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
    NSLog(@"Did enter region"); 
} 

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
    NSLog(@"Did exit region"); 
} 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    NSLog(@"Fail"); 
    NSLog(@"%@", [error description]); 
} 

-(void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { 
    NSLog(@"Did start monitoring for region: %@", region.identifier); 
} 
+0

您是否已檢查過'+(BOOL)regionMonitoringAvailable'和'+(BOOL) regionMonitoringEnabled'在您的位置管理器上? – 2012-03-30 13:33:54

+1

@DavidRönnqvist我剛剛做了,兩者都是真實的。 – Pieter 2012-03-30 13:58:35

+0

也發生在我身上。奇怪的部分是該區域被正確監控,並顯示在'monitoredRegions'中......我有一個偷偷的懷疑,只有當一個不同的'CLLocationManager'添加一個區域時纔會調用這個區域(因爲它們是在你的應用程序中共享的)... – 2012-06-27 22:01:42

回答

0

不完全小號爲什麼它不會收到你的回調。我會介紹一些我注意到的事情,你可以看看他們是否有所幫助。

  1. 您還沒有設置您的位置經理desiredAccuracydistanceFilter。他們應該默認爲某些東西,但是如果您在GPX中的位置不在區域的準確度範圍內,那麼它可能不足以觸發。
  2. 您用於開始監控的方法在iOS 6中已被棄用。您可以將精確度添加到位置管理器,並將其關閉。
  3. 這將是有益的,看看你是如何創建CLRegion監控,regionToMonitor。如果在開始監測時立即生成,您應該看到空心紫色位置箭頭出現。您還應該收到代表電話-didStartMonitoringForRegion。如果這些都沒有出現,那麼你的位置管理器設置可能只是一個問題。
  4. 一個建議是創建自己的位置管理器類並將其轉換爲單例。這將防止您意外初始化多個代理並獲得多個呼叫。它也給你一個乾淨的類來包含所有的回調方法。

我沒有看到你包含的代碼有什麼問題,所以我猜測問題在於你沒有包含的代碼。檢查以確保您的位置管理器代碼正在初始化,並確保您的CLRegion正在正確創建。希望這可以幫助。如果包含更多代碼並找出真正的問題,我很樂意更新我的答案。

2

首先你應該添加以下位置經理的委託方法,看看是否出於某種原因,區域監控註冊失敗的:

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

其次,區域監控系統中的共享資源。 該文檔指出,它允許您監視有限數量的區域(不會遺漏任何數字),並提及如果另一個應用程序註冊了要監視的其他區域,則某些應用程序監視區域可能會被丟棄。

三,區域監控不使用任何GPS技術。它只使用網絡運營商的蜂窩天線,無論何時更換蜂窩塔,它都會觸發系統事件,該事件遍歷所有受監控區域,並查看某個區域是否位於您現在所在的新區域內。

這意味着您應該期望服務的準確性較低,因此您應該增加您爲區域設置的半徑。

最後,如果您的應用程序完全終止,沒有中止,那麼你的應用程序將收到內部應用程序的委託:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

一個UIApplicationLaunchOptionsLocationKeylaunchOptions字典。 然後,您有責任重新初始化您的位置管理員,獲取當前位置並在應用程序生命狀態有限的時間內向用戶發出本地推送通知。

由於應用程序在該階段不會正常運行,但處於有限背景模式狀態。

此外,如果你想在模擬器中測試應用程序,你應該添加一個track.gpx文件到你的項目並設置模擬器跟蹤模式。 確保放置在模擬器中的2個位置不是很遠(因爲完成跟蹤可能需要相當長的時間),並將它們設置在路徑中,它將進入您的監控區域。 然後看看你是否得到任何回調。 請勿使用您的設備對其進行測試,因爲您需要實際走幾個街區以查看與設備的任何實際交互:-)

相關問題