菜鸟教程小白 发表于 2022-12-12 21:27:50

iOS 如何仅通过蜂窝网络正确发送请求


                                            <p><p>我的问题显然是2种情况:</p>

<ul>
<li>(1) 仅通过 wifi 发送请求 URL1</li>
<li>(2) 仅通过蜂窝网络发送请求 URL2</li>
</ul>

<p>我知道 <code>Reachability</code> 实用程序(Apple 的代码和 AFNetworking/Alamofire 代码)和 <code>allowsCellularAccess</code> 属性(在 NSMutableURLRequest 和 NSURLSessionConfiguration 中)。 </p>

<p>但这些仅解决了情况 (1)(因为我将 <code>allowsCellularAccess</code> 设置为 NO)。
情况 (2) 不能保证,因为请求可以通过蜂窝或 wifi(如果可用)运行。即使我仅通过蜂窝网络的可达性检查状态,仍然存在一些异常情况,如本文档 <a href="https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/Platform-SpecificNetworkingTechnologies/Platform-SpecificNetworkingTechnologies.html#//apple_ref/doc/uid/TP40010220-CH212-SW9" rel="noreferrer noopener nofollow">Restrict Cellular Networking Correctly</a> 中所述</p>

<p>有没有更好的方法来确保仅限蜂窝网络?欢迎任何建议。 Object-C 和 Swift 都受到欢迎。</p>

<p>提前致谢!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><h3>您可以使用 IP_BOUND_IF 在套接字中执行此操作:</h3>

<ol>
<li>使用“ifaddrs.h”中包含的“getifaddrs”获取接口(interface)地址:</li>
</ol>

<p><i></i></p><i>

<pre><code>struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
NSInteger success = getifaddrs(&amp;interfaces);
if (success == 0) {
    // Loop through linked list of interfaces
    temp_addr = interfaces;
    while(temp_addr != NULL) {
      if(temp_addr-&gt;ifa_addr-&gt;sa_family == AF_INET) {
            // Get NSString from C String
            NSString* ifaName = ;
            NSString* address = ;
            NSString* mask = ;
            NSString* gateway = ;
            NSLog(@&#34;%@;%@;%@;%@&#34;,ifaName,address,mask,gateway);
      }
      temp_addr = temp_addr-&gt;ifa_next;
    }
}
</code></pre>

</i><p><i></i>
然后你会看到这样的输出:
<i><br/>
lo0;127.0.0.1;255.0.0.0;127.0.0.1<br/>
pdp_ip0;10.9.163.185;255.255.255.255;10.9.163.185<br/>
en0;10.0.0.6;255.255.0.0;10.0.255.255<br/>
</i></p>

<p>(“pdp_ip0”表示手机接口(interface))</p>

<ol 开始=“2”>
<li>使用“net/if.h”中的“if_nametoindex”和“sys/socket.h”中的“setsockopt”通过指定接口(interface)发送msg</li>
</ol>

<p><i></i></p><i>

<pre><code>int s = socket(AF_INET, SOCK_STREAM, 0);
int index = if_nametoindex( &#34;pdp_ip0&#34;);
int suc = setsockopt(s, IPPROTO_IP, IP_BOUND_IF, &amp;index, sizeof(index));
</code></pre>

</i><p><i></i></p>

<p>然后连接socket,你会看到你已经通过蜂窝接口(interface)连接了服务器</p></p>
                                   
                                                <p style="font-size: 20px;">关于iOS 如何仅通过蜂窝网络正确发送请求,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/38603432/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/38603432/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS 如何仅通过蜂窝网络正确发送请求