iOS
我认为这在 iOS 上是不可能的。
我没有找到用于网络监控/数据包过滤的公共 API。有可能存在这样的 API,但它被隐藏了。但在那种情况下,Apple App Store review guidelines 声明:
2.5 使用非公开 API 的应用将被拒绝
如果您需要一个特定的报价来表明这是不可能的,您可以使用:
iOS 不直接支持数据包跟踪。但是,如果您通过 USB 将 iOS 设备连接到 Mac...
来自official Apple Technical Q&A QA1176。
替代品
下一个最好的方法是在“设置”中手动配置代理服务器,然后在服务器端过滤流量。由于 iOS 后台任务的limitations,在设备上本地运行代理不是一个选项:
2.16 多任务应用程序只能将后台服务用于其预期目的:VoIP、音频播放、位置、任务完成、本地通知等。
另外,this 帖子建议可以在 iOS 8 上以编程方式设置 VPN 连接。它还需要发送设备的流量,我不确定这种方法是否符合指南.
非替代品
某些应用提供测量网络流量的功能。但他们使用专用 API 进行网络统计:iPhone Data Usage Tracking/Monitoring。
还有一些方法可以通过here 描述的 USB 电缆在 iOS 上进行数据包跟踪。
安卓
在 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 它的 cmets 揭示了数据包处理本身。