8

我试图Find My Friends用 Theos 欺骗位置更新。

到目前为止我所拥有的:

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

什么不见​​了:

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

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

4

2 回答 2

1

您可能需要检查( docs )-startMonitoringSignificantLocationChanges中的方法。CLLocationMananger

正如文档所述:

此方法以异步方式启动位置事件的传递,并在您调用它后立即返回。位置事件被传递到您的委托的 locationManager:didUpdateLocations: 方法。要传递的第一个事件通常是最近缓存的位置事件(如果有),但在某些情况下可能是较新的事件。获取当前位置修复可能需要几秒钟的时间,因此请务必检查委托方法中位置事件的时间戳。

在返回当前位置定位后,接收器仅在检测到用户位置发生重大变化时才生成更新事件。例如,当设备与不同的蜂窝塔相关联时,它可能会生成一个新事件。它不依赖 distanceFilter 属性中的值来生成事件。连续多次调用此方法不会自动生成新事件。但是,在这两者之间调用 stopMonitoringSignificantLocationChanges 确实会在您下次调用此方法时发送一个新的初始事件。

如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。在这种情况下,传递给应用程序委托的 locationManager:didUpdateLocations: 方法的选项字典包含键 UIApplicationLaunchOptionsLocationKey 以指示您的应用程序是由于位置事件而启动的。重新启动后,您仍然必须配置位置管理器对象并调用此方法以继续接收位置事件。当您重新启动位置服务时,当前事件会立即传递给您的委托。此外,即使在您启动位置服务之前,您的位置管理器对象的位置属性也会填充最新的位置对象。

除了实现 locationManager:didUpdateLocations: 方法的委托对象之外,它还应该实现 locationManager:didFailWithError: 方法来响应潜在的错误。

所以基本上你需要:

  • 在文件中将密钥设置location为后台模式Info.plist
  • 开始一个CLLocationMananger
  • 称呼startMonitoringSignificantLocationChanges
  • 在您的 上AppDelegate,您将在信息字典中收到一个位置,UIApplicationLaunchOptionsLocationKey当用户移动大约 500 米时键入该位置。
  • 在该方法中,您可以更新服务器上的位置。
于 2013-06-26T17:37:22.433 回答
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
于 2013-06-27T05:13:12.350 回答