应用程序被杀后,用于跟踪后台位置的iOS私有API(如“查找我的朋友”)

时间:2013-06-26 14:59:58

标签: iphone ios core-location

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

到目前为止我有什么:

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

缺少什么:

当应用程序处于后台已杀死时,当我的朋友请求我的位置时,它仍会将我的位置发送到服务器。此后台更新不会调用常规更新方法,因此我的钩子不起作用。此外,即使应用程序被杀,它也可以响应来自网络的位置请求。我认为Apple不会在常规应用中允许这种行为。

我认为这只能通过一些私有API来完成。有人能指出我正确的方向,找出它在后台使用的API /方法吗?

2 个答案:

答案 0 :(得分:1)

您可能需要查看-startMonitoringSignificantLocationChangesdocs)中的CLLocationMananger方法。

正如文档所述:

  

此方法异步启动位置事件的传递,   你打电话后不久回来。地点活动将发送至   你的委托的locationManager:didUpdateLocations:方法。首先   要交付的事件通常是最近缓存的位置   事件(如果有的话),但在某些情况下可能是较新的事件。   获取当前位置修复可能需要几秒钟,   所以一定要检查你的位置事件的时间戳   委托方法。

     

返回当前位置修复后,接收器会生成更新   仅当用户位置发生重大变化时才会发生事件   检测。例如,它可能会在设备生成新事件   变得与不同的细胞塔相关联。它不依赖   distanceFilter属性中的值,用于生成事件。调用   这种方法连续几次不会自动产生   在生成的新事件中。调用   但是,stopMonitoringSignificantLocationChanges介于两者之间   导致下次调用时发送新的初始事件   方法

     

如果您启动此服务,则随后会提交您的申请   终止后,系统会自动将应用程序重新启动到   新活动到来的背景。在这种情况下,选项   字典传递给locationManager:didUpdateLocations:方法   您的应用程序委托包含密钥   UIApplicationLaunchOptionsLocationKey表示你的   应用程序是由于位置事件而启动的。重新启动后,   您仍然必须配置位置管理器对象并调用它   继续接收位置事件的方法。当你重新启动   位置服务,当前事件将传递给您的代理人   立即。此外,您所在位置的位置属性   管理器对象甚至填充了最新的位置对象   在开始定位服务之前。

     

除了你的委托对象实现了   locationManager:didUpdateLocations:方法,它也应该实现   locationManager:didFailWithError:响应潜力的方法   错误。

所以基本上你需要:

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

答案 1 :(得分: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