公司要做一個實時巡查的功能,當小程序切入后台后怎樣才能不被微信給銷毀掉。
官方小程序運行機制
它說小程序可能會在后台運行一段時間,網上說是5分鍾 會被銷毀掉,說什么的都有,,,正是網友都說不能在后台運行,直接把我引到不能在后台運行的結論上了。(他們在誤人子弟呀!!!)
當看到官方這句話的時候覺得不可能了,產品經理,,,告訴我,為什么酷狗音樂可以后台播放呢???
打開酷狗音樂后台播放超過10分鍾,4首歌的時間,還能播放。(哎呀,我開始有信心了。)
下面幾種方式進行講解: 請往下看!!!
一 使用setInterval進行輪詢位置信息
首先我的小程序是通過web-view套入的H5高德地圖,因為公司業務只采用 高德地圖。
代碼片段
// 每隔5秒獲取一次當前位置信息
this.interval = setInterval(() => {
this.geolocation();
}, 5000);
geolocation(type) {
let _this = this;
if (!_this.marker) {
uni.showLoading({
title: "定位中...",
});
}
AMap.plugin("AMap.Geolocation", function() {
var geolocation = new AMap.Geolocation({
// 是否使用高精度定位,默認:true
enableHighAccuracy: false,
// 設置定位超時時間,默認:無窮大
timeout: 10000,
// 定位按鈕的停靠位置的偏移量,默認:Pixel(10, 20)
buttonOffset: new AMap.Pixel(10, 20),
// 定位成功后調整地圖視野范圍使定位位置及精度范圍視野內可見,默認:false
zoomToAccuracy: true,
// 定位按鈕的排放位置, RB表示右下
buttonPosition: "RB",
});
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, "complete", onComplete);
AMap.event.addListener(geolocation, "error", onError);
function onComplete(data) {
_this.location = {
formattedAddress: data.formattedAddress,
lat: data.position.lat,
lng: data.position.lng,
};
let center = [data.position.lng, data.position.lat];
_this.map.setCenter(center);
// 向數據庫存入當前位置經緯度
saveLocation({
lng: data.position.lng,
lat: data.position.lat,
address: data.formattedAddress
}).then(res => {
console.log(res)
})
if (!_this.marker) {
uni.hideLoading();
_this.addMarker(center);
} else {
_this.marker.setPosition(center);
}
}
function onError(data) {
console.log("出錯", data);
}
});
},
從上面代碼可以看出我通過周期循環每5秒獲取一次當前位置,並將位置存入數據庫,這種方式可行,但是必須打開 【小程序的浮框功能】。
方案的缺點
- 如果不打開浮框經測試長時間鎖屏會自己停掉不向數據庫存入當前位置信息。
- 打開浮框測試長時間鎖屏也可以向數據庫存入信息,但是 但是 但是 它並不是每5秒存入一次信息,它的時間不固定,這肯定不行呀,我走出500米了,你的位置還在出發點,這肯定不行呀 。
最終結果
所以 這個方案不可取。
二 使用微信提供的startLocationUpdateBackground開啟后台持續定位
代碼片段
1. aap.json添加定位配置
"requiredBackgroundModes": ["location"]
2. 開啟后台定位及實時監控
wx.authorize({
scope: "scope.userLocationBackground",
success: () => {
wx.startLocationUpdateBackground({
success: (res) => {
wx.onLocationChange((data) => {
saveLocation({
lng: data.longitude,
lat: data.latitude,
}).then((res) => {
console.log(res);
});
});
},
fail: (res) => {
console.log("獲取位置失敗", res);
},
});
},
fail: (res) => {
console.log("權限獲取失敗", res);
},
});
方案缺點
采用這種方式需要引導用戶開啟定位


選擇 【使用小程序期間和離開小程序后】在你將小程序切入到后台后可以依舊獲取實時位置。
這個引到只是常規情況下會生效,但是如果手機的應用權限給的不夠高,在這里設置的權限就是個寂寞
如果在這種情況下切入后台無法獲取當前位置,則證明需要給微信更高的定位權限,不同手機型號設置權限的操作不同,這就大大降低了體驗效果。
設置小米9的微信定位權限
找到系統應用微信,選擇定位設置。

將定位設置為【始終允許】即可。

最終結果
這種方式可以實現位置實時變化,但是有個問題,就是操作的復雜度。

