• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 21:27:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我的问题显然是2种情况:

  • (1) 仅通过 wifi 发送请求 URL1
  • (2) 仅通过蜂窝网络发送请求 URL2

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

但这些仅解决了情况 (1)(因为我将 allowsCellularAccess 设置为 NO)。 情况 (2) 不能保证,因为请求可以通过蜂窝或 wifi(如果可用)运行。即使我仅通过蜂窝网络的可达性检查状态,仍然存在一些异常情况,如本文档 Restrict Cellular Networking Correctly 中所述

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

提前致谢!



Best Answer-推荐答案


您可以使用 IP_BOUND_IF 在套接字中执行此操作:

  1. 使用“ifaddrs.h”中包含的“getifaddrs”获取接口(interface)地址:

struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
NSInteger success = getifaddrs(&interfaces);
if (success == 0) {
    // Loop through linked list of interfaces
    temp_addr = interfaces;
    while(temp_addr != NULL) {
        if(temp_addr->ifa_addr->sa_family == AF_INET) {
            // Get NSString from C String
            NSString* ifaName = [NSString stringWithUTF8String:temp_addr->ifa_name];
            NSString* address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *) temp_addr->ifa_addr)->sin_addr)];
            NSString* mask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *) temp_addr->ifa_netmask)->sin_addr)];
            NSString* gateway = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *) temp_addr->ifa_dstaddr)->sin_addr)];
            NSLog(@"%@;%@;%@;%@",ifaName,address,mask,gateway);
        }
        temp_addr = temp_addr->ifa_next;
    }
}

然后你会看到这样的输出:
lo0;127.0.0.1;255.0.0.0;127.0.0.1
pdp_ip0;10.9.163.185;255.255.255.255;10.9.163.185
en0;10.0.0.6;255.255.0.0;10.0.255.255

(“pdp_ip0”表示手机接口(interface))

  1. 使用“net/if.h”中的“if_nametoindex”和“sys/socket.h”中的“setsockopt”通过指定接口(interface)发送msg

int s = socket(AF_INET, SOCK_STREAM, 0); 
int index = if_nametoindex( "pdp_ip0");
int suc = setsockopt(s, IPPROTO_IP, IP_BOUND_IF, &index, sizeof(index));

然后连接socket,你会看到你已经通过蜂窝接口(interface)连接了服务器

关于iOS 如何仅通过蜂窝网络正确发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38603432/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap