iOS私有API在应用程序关闭后仍可以在后台跟踪位置(例如“找朋友”)

8

我正在使用Theos尝试欺骗Find My Friends中的位置更新。

目前我所做的:

当应用程序在前台时,我能够欺骗更新消息(使用Theos/Logos挂钩FMFLocation类)。

缺少的内容:

当应用程序在后台被关闭时,我的位置仍会在朋友请求我的位置时向服务器发送。这种后台更新并不调用常规更新方法,因此我的挂钩无法工作。此外,即使应用程序已关闭,它也可以响应来自网络的位置请求。我不认为苹果允许常规应用程序具有这种行为。

我认为只能通过某些私有API实现这一点。是否有人可以指点我在后台中所使用的API/method?

2个回答

1
我懂了!是 aosnotifyd 在后台发送位置信息。
最终我做了这个:
#import <CoreLocation/CoreLocation.h>

%hook AOSFindBaseServiceProvider
-(void)sendCurrentLocation:(id)fp8 isFinished:(BOOL)fp12 forCmd:(id)fp16 withReason:(int)fp20 andAccuracyChange:(double)fp24{
    //Mess with (CLLocation *)fp8 here
    %orig(c,fp12,fp16,fp20,fp24);
}
%end

你有相同的示例项目吗? - Maulik
@Maulik 我有一篇关于此的博客文章和 GitHub 代码库:http://weishi.github.io/blog/2013/07/19/fixing-find-my-friends-location-shift-in-china/ - Wei Shi

1
你可能想要检查 CLLocationMananger 中的 -startMonitoringSignificantLocationChanges 方法 (文档)。
如文档所述:
该方法异步启动位置事件传递,调用后会很快返回。位置事件将传递给您的委托对象的locationManager:didUpdateLocations:方法。通常,要传递的第一个事件是最近缓存的位置事件(如果有),但在某些情况下可能是更新的事件。获取当前位置修复可能需要几秒钟的时间,请确保在委托方法中检查位置事件的时间戳。
返回当前位置修复后,接收器仅在检测到用户位置的显着更改时生成更新事件。例如,当设备与不同的基站关联时,它可能会生成新的事件。它不依赖于distanceFilter属性的值来生成事件。连续多次调用此方法不会自动生成新事件。但是,在调用stopMonitoringSignificantLocationChanges之间调用,则会导致在下次调用此方法时发送新的初始事件。
如果启动此服务并随后终止应用程序,则系统会自动将应用程序重新启动到后台,如果有新事件到达。在这种情况下,传递给应用程序委托的locationManager:didUpdateLocations:方法的选项字典包含UIApplicationLaunchOptionsLocationKey键,以指示您的应用程序是因为位置事件而启动的。重新启动后,您仍然必须配置位置管理器对象并调用此方法以继续接收位置事件。重新启动位置服务后,当前事件将立即传递给您的委托对象。此外,即使在启动位置服务之前,位置管理器对象的location属性也已填充最新的位置对象。
除了您的委托对象实现locationManager:didUpdateLocations:方法之外,它还应该实现locationManager:didFailWithError:方法以响应潜在错误。

基本上你需要:

  • 在你的Info.plist文件中将location键设置为后台模式
  • 启动一个CLLocationMananger
  • 调用startMonitoringSignificantLocationChanges
  • 在你的AppDelegate中,当用户移动大约500米时,你将在信息字典中收到一个以UIApplicationLaunchOptionsLocationKey为键的位置。
  • 在该方法中,你可以更新服务器上的位置。

1
实际上,“查找我的朋友”可以在网络请求时发送位置,即使应用程序已被关闭并且未检测到任何移动,这显然不是由“startMonitoringSignificantLocationChanges”触发的。 - Wei Shi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接