我知道由于沙盒,每个操作系统特权级别以及iOS如何处理后台任务,我将面临限制,因此我想确认是否可以在iOS和Android上执行此操作.
Android和iOS是否允许您分析和修改通过TCP端口的数据包?如果可能的话怎么样?当我的应用程序保留在后台时,我可以这样做吗?
解决方法
我认为在iOS上不可能.
我没有找到用于网络监控/数据包过滤的公共API.这种API有可能存在,但它是隐藏的.但在这种情况下,Apple App Store review guidelines表示:
2.5 Apps that use non-public APIs will be rejected
如果您需要一个特定的引用来表明它是不可能的,您可以使用:
iOS does not support packet tracing directly. However,if you connect your iOS device to a Mac via USB…
从official Apple Technical Q&A QA1176开始.
备择方案
下一个最好的事情是在“设置”中手动配置代理服务器,然后过滤服务器端的流量.由于limitations的iOS后台任务,在设备上本地运行代理不是一个选项:
2.16 Multitasking Apps may only use background services for their intended purposes: VoIP,audio playback,location,task completion,local notifications,etc.
此外,this帖子建议可以在iOS 8上以编程方式设置VPN连接.还需要发送设备的流量,我不确定此方法是否符合指南.
非替代
某些应用程序提供测量网络流量的功能.但他们使用专用API进行网络统计:iPhone Data Usage Tracking/Monitoring.
还有一些方法可以通过05005描述的USB电缆在iOS上进行数据包跟踪.
Android的
在Android上,您可以将设备配置为将您的应用用作VPN service.但是:
>它要求您显示一个对话框,描述授予VPN作为权限的后果.
>您必须在VPN处于活动状态时显示持久通知.应用程序的一个例子是tPacketCapture.
要请求用户权限,请调用VpnService.prepare:
public void onClick(View v) { Intent intent = VpnService.prepare(getApplicationContext()); if (intent != null) { startActivityForResult(intent,0); } else { onActivityResult(0,RESULT_OK,null); } }
并处理结果,启动您的VpnService.
protected void onActivityResult(int requestCode,int resultCode,Intent data) { if (resultCode == RESULT_OK) { Intent intent = new Intent(this,MyVpnService.class); startService(intent); } }
您的VpnService必须实现public int onStartCommand().该服务被视为前台服务,不应被操作系统杀死.
这个问题:Android VpnService to capture packets won’t capture packets,它的评论揭示了数据包处理本身.