2016-02-09 58 views
1

在我離子/ angularjs應用我使用的地理定位插件:科爾多瓦地理位置watchPosition頻率高於該選項允許它

var watchOptions = { 
    frequency : 10*1000, 
    timeout : 60*60*1000, 
    enableHighAccuracy: true // may cause errors if true 
}; 

watch = navigator.geolocation.watchPosition(on_success,on_error,watchOptions); 
https://github.com/apache/cordova-plugin-geolocation

就像我用這個配置表的文檔中

但是,在Android上,頻率遠高於10秒(約0.5秒)。在iOS上,它效果很好。這裏有什麼問題?

回答

8

更新了的意見光低於

沒有frequency參數在geolocation options可供watchPosition()因此你傳遞任何值將被忽略。每當本機位置管理器從GPS硬件接收位置更新時(在enableHighAccuracy=true的情況下),就會調用通過watchPosition()註冊的成功回調,因此不會以固定間隔調用。

本地位置管理器(Android和iOS)都是事件驅動的,即它們從GPS硬件接收更新,並以非固定時間間隔傳送它們。因此,嘗試將固定頻率應用於此,試圖在圓孔中安裝一個方形的掛釘 - 您無法要求GPS硬件爲您提供精確的位置更新N秒。

雖然您可以按固定的時間間隔撥打getCurrentPosition(),但此方法只是返回上次收到的位置或請求新的位置。

如果問題是更新過於頻繁,您可以記錄每次更新的時間,並且只接受N秒後的下一次更新,例如,

var lastUpdateTime, 
minFrequency = 10*1000, 
watchOptions = { 
    timeout : 60*60*1000, 
    maxAge: 0, 
    enableHighAccuracy: true 
}; 

function on_success(position){ 
    var now = new Date(); 
    if(lastUpdateTime && now.getTime() - lastUpdateTime.getTime() < minFrequency){ 
     console.log("Ignoring position update"); 
     return; 
    } 
    lastUpdateTime = now; 

    // do something with position 
} 
navigator.geolocation.watchPosition(on_success,on_error,watchOptions); 

但是,這樣不會停止更頻繁地請求更新的設備,因此會消耗相對大量的電池。

原生的Android LocationManager不會允許你以儘量減少電池消耗,但是在Android cordova-plugin-geolocation不直接實現使用的LocationManager請求位置時指定更新之間的最短時間,而是使用在本地web視圖的W3C Geolocation API Specification,這不允許你指定這個。

但是,你可以使用這個插件來做到這一點:cordova-plugin-locationservices

它可以讓你指定:

間隔:爲主動的位置更新所需的時間間隔,以毫秒爲單位。

fastInterval:顯式設置位置更新的最快時間間隔(以毫秒爲單位)。

+0

有沒有對應於'cordova-plugin-locationservices' for iOS?我能想到的解決方法是圍繞默認的'watchPosition'創建自己的包裝,根據您提供的'frequency'值調用'watchPosition'和'clearWatch'。 – cr8ivecodesmith

+0

謝謝!但是,在你的示例代碼中,我認爲一行不正確,應該是:if(lastUpdateTime && now.getTime() - lastUpdateTime.getTime()

相關問題