如何在iPhone上测试低带宽条件

M. *_*yan 5 iphone testing wireless bandwidth

我有一个应用程序,可以进行大量的二进制数据加载.我遇到过这样的情况:在加载某些二进制数据期间,不稳定的3G连接可能会间歇性地切断,从而导致问题.

有没有办法,使用模拟器或其他方法来测试低带宽/不稳定的连接方案?

我似乎记得Adobe Flash在他们的测试套件中有带宽模拟器.

Phi*_*vin 6

您可以通过使用Internet共享在Mac上创建无线网络,使用防火墙规则降级该接口以及将iPhone连接到该网络来实现此目的.这实际上可以调试连接到无线网络的任何设备.

使用此技术,您可以模拟极其微薄,有损或潜在的网络.

我使用这种技术而不是Apple的官方网络链接调节器有几个原因:

  • 限制只能应用于特定的连接设备,而不会影响开发机器的网络连接.
  • 它可以编写脚本来模拟快速变化或"突发"网络.
  • 与iOS内置的网络链接调节器不同,您可以在应用程序保持在前台时更改设置.

这使用ipfw的dummeynet功能.在现代版本的OS X中,ipfw在技术上已被弃用,但它仍然可以正常工作.不幸的是,pf(替换)还不支持任意数据包延迟.如果有变化,我会更新这个答案.

创建一个糟糕的Wi-Fi网络

  1. 如果您还没有插入以太网.
  2. 在"系统偏好设置"的"共享"面板中启用Internet共享 选择"从以太网共享您的连接"并选中"Wi-Fi".
  3. 将手机连接到刚刚创建的网络,并确保可以浏览网页.
  4. 告诉Mac OS的内置防火墙(ipfw)以确保应用了延迟的数据包(通过ipfw用语中的"dummynet")仍然通过正常规则进行路由.这允许Internet共享继续工作:

    phil@Nebula ~$ sudo sysctl -w net.inet.ip.fw.one_pass=0
    net.inet.ip.fw.one_pass: 0 -> 0
    
    Run Code Online (Sandbox Code Playgroud)
  5. 配置iPhone流量通过的低质量管道(吞吐量为14Kb/s,丢包率为1%):

    phil@Nebula ~$ sudo ipfw pipe 1 config bw 14KB/s
    phil@Nebula ~$ sudo ipfw pipe 1 config plr 0.01
    
    Run Code Online (Sandbox Code Playgroud)

下一步取决于您是在山狮或以下,还是小牛队.

对于Mountain Lion(10.8)或以下:

将数据包路由到管道,但仅限于通过AirPort接口的流量:

phil@Nebula ~$ sudo ipfw add 10 pipe 1 ip from any to any via en1
00010 pipe 1 ip from any to any via en1
Run Code Online (Sandbox Code Playgroud)

重要提示:如果您在没有物理以太网端口的情况下使用Air或新MacBook Pro,则可能会调用AirPort接口en0.如果是这样,请替换en1en0上述情况.

对于小牛队(10.9):

检查输出ifconfig并查找Internet共享创建的网桥接口:

bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=63<RXCSUM,TXCSUM,TSO4,TSO6>
    ether xx:xx:xx:xx:xx:xx
    Configuration:
            id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
            maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
            root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
            ipfilter disabled flags 0x2
    member: en4 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 6 priority 0 path cost 0
    nd6 options=1<PERFORMNUD>
    media: <unknown type>
    status: inactive
bridge100: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=3<RXCSUM,TXCSUM>
    ether xx:xx:xx:xx:xx:xx
    inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
    Configuration:
            id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
            maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
            root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
            ipfilter disabled flags 0x2
    member: en1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 5 priority 0 path cost 0
    media: autoselect
    status: active
Run Code Online (Sandbox Code Playgroud)

您想要具有IP地址的桥接接口; 在大多数情况下,它会bridge100.

将数据包路由到管道,但仅限于桥接接口上的流量:

phil@Nebula ~$ sudo ipfw add 10 pipe 1 ip from any to any via bridge100
00010 pipe 1 ip from any to any via bridge100
Run Code Online (Sandbox Code Playgroud)

bridge100如果系统上的名称不同,请进行更改.

模拟不断变化的网络

您可以更改值,14KB/s0.01在上面的步骤5中模拟不同类型的网络.您还可以指定config delay 1000引入1000毫秒的延迟.有关更多选项,请参见联机帮助页

您可以在为管道添加规则后继续重新配置管道.例如,要模拟接近蜂窝覆盖范围的边缘,请在应用运行并连接时发出此命令(95%丢包):

    phil@Nebula ~$ sudo ipfw pipe 1 config plr 0.95
Run Code Online (Sandbox Code Playgroud)

sudo ipfw add 10 …重新配置管道后无需再次运行.您可以编写这些更改的脚本以模拟极其动态的网络环境.

打扫干净

你可以发出sudo ipfw delete 10让一切恢复正常的方法,或者只是重新启动.


Arr*_*rel 5

这是一个很棒的脚本,我在OS X上使用它来限制连接速度,或者只是关闭它,对于你想要的任何域.我希望我能记住我从哪里得到它来表扬.

将代码保存到计算机上的文件中,并将其命名为"限制".然后运行,只需在终端输入以下内容,然后选择以下速度之一:[full|fast|medium|slow|wwdc|off].

"./throttling medium"
Run Code Online (Sandbox Code Playgroud)

如果您将脚本设置为限制localhost:3000和stackoverflow.com,那么从浏览器(或iphone模拟器或其他)中的任何一个域加载页面将响应较慢并加载文件较慢.这对于测试iphone连接错误非常有用.

http://gist.github.com/499177