问题:有什么方法可以检测并防止这种行为?
实际上有两个不同的问题:(1)如何检测,(2)如何预防?
(1) 的答案:在回调 locationManager:didUpdateLocations: 时模拟的位置行为与真实的完全不同:
[模拟位置] 回调几乎在调用 startUpdatingLocation 后立即返回,然后每隔一秒重复调用一次。如果我们选择一个固定的位置,位置也是一样的。这是一个例子:
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:48 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:49 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:50 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:51 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:52 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:53 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:54 Час: Індокитай
[真实位置] 需要几秒钟(如果第一次运行)回调然后随机重新调用。即使您根本不移动,您也可以看到这些位置之间的重大变化。这是一个例子:
location: <+10.77219361,+106.70597441> +/- 67.39m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:26 Час: Індокитай
location: <+10.77213011,+106.70591088> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:31 Час: Індокитай
location: <+10.77219507,+106.70587790> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:38 Час: Індокитай
location: <+10.77214753,+106.70587741> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:49 Час: Індокитай
(2) 的答案:为了防止,我现在只是暂时解决,我们需要查找至少 3 个位置来确定它是模拟位置还是真实位置。
提醒,这只是检测模拟位置的临时解决方案。未来,Apple 可能会改变这种行为。
顺便说一句,我还尝试在方案中禁止 xCode 上的模拟位置:
不幸的是,它仍然允许模拟位置。
您可能知道的更多问题here。
希望对您有所帮助。