[flutter]flutter如何防止GPS偽定位

在 Flutter 中,要防止 GPS 偽定位(Mock Location),可以採取以下幾種方法:

1. 檢測是否啟用了 Mock Location(Android)

在 Android 設備上,你可以使用 isMockLocation 來判斷位置數據是否是模擬的。

方法 1:透過 Location 插件

import 'package:location/location.dart';
Future<bool> isMockLocationEnabled() async { Location location = Location(); LocationData locationData = await location.getLocation(); return locationData.isMock ?? false; }

方法 2:透過 locationManager(更準確)

使用 MethodChannel 來直接調用原生 Android API 來檢測 Mock Location:

import 'package:flutter/services.dart';
Future<bool> isMockLocation() async { const platform = MethodChannel('mock_location_checker'); try { final bool result = await platform.invokeMethod('isMockLocation'); return result; } on PlatformException { return false; } }

對應的 Android 原生代碼(Kotlin):

package com.example.app
import android.content.Context import android.location.Location import android.location.LocationManager import android.os.Build import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler class MockLocationPlugin : FlutterPlugin, MethodCallHandler { private lateinit var channel: MethodChannel private lateinit var context: Context override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { context = flutterPluginBinding.applicationContext channel = MethodChannel(flutterPluginBinding.binaryMessenger, "mock_location_checker") channel.setMethodCallHandler(this) } override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { if (call.method == "isMockLocation") { result.success(isMockLocationEnabled()) } else { result.notImplemented() } } private fun isMockLocationEnabled(): Boolean { val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager val providers = locationManager.getProviders(true) for (provider in providers) { val location: Location = locationManager.getLastKnownLocation(provider) ?: continue if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { if (location.isFromMockProvider) { return true } } } return false } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { channel.setMethodCallHandler(null) } }

2. 限制 GPS 來源

你可以強制應用只使用 硬體 GPS,而不是 WiFi 或網路定位:

import 'package:geolocator/geolocator.dart';
Future<Position> getRealGPSLocation() async { return await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high, // 強制使用 GPS ); }

這樣可以確保應用只從真實的 GPS 硬體獲取數據。


3. 偵測 GPS 位置的異常變化

Mock Location 工具通常會提供不合理的 GPS 數據,例如:

  • 短時間內移動速度異常高(> 1000 km/h)

  • 位置變化過於頻繁或不符合常理

你可以檢測這些異常:

bool isFakeGPS(Position oldPos, Position newPos) {
double distance = Geolocator.distanceBetween( oldPos.latitude, oldPos.longitude, newPos.latitude, newPos.longitude ); double timeDiff = newPos.timestamp.difference(oldPos.timestamp).inSeconds; double speed = distance / timeDiff; // km/h return speed > 1000; // 設定合理的閾值 }

4. 透過 Google Play Services API 檢測

Google Play Services 提供了一個 SafetyNet API,可以用來檢測裝置是否被 Root 或安裝了 GPS Spoofing 工具:

import 'package:device_info_plus/device_info_plus.dart';
Future<bool> isDeviceRooted() async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; return androidInfo.isPhysicalDevice == false; // 模擬器通常返回 false }

或者使用 safetynet_attestation 套件來執行更深入的檢測。


5. 結合多個方法提高準確性

單獨使用某一種方法可能不夠可靠,因此建議結合多種技術來防止 GPS 偽定位: 

✅ 檢查 isMockLocation
✅ 強制使用 GPS 硬體
✅ 偵測異常速度或位置變化
✅ 使用 Google SafetyNet API

這樣可以大幅降低被偽造 GPS 位置欺騙的風險。

留言

這個網誌中的熱門文章

flutter 使用 ToastDialog 範例

ScaffoldMessenger 範例