文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么使用IOS实现WIFI传输

2023-06-14 12:16

关注

这篇文章主要介绍了怎么使用IOS实现WIFI传输,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

问题

业务场景上存在需要将手机里的文件、图片传递给其他的设备,

不仅仅局限于传书、资料啥的都有可能传递

方案

最base的方法:设备之间加个云,设备上传资料到云,云同步资料到各个设备,适用于多设备之间,这个没讲的必要

如果是两设备之间,忽略服务器,怎么搞?联想到图书App中的WiFi传书,貌似没云端概念的,怎么做到的?

上菜

采用框架GCDWebServer,通过CocoaPods引入

pod "GCDWebServer", "~> 3.0"

设置本地接收目录,初始化Server并启动

override func viewWillAppear(_ animated: Bool) {    super.viewWillAppear(animated)        if let filepath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first as NSString? {        let path = filepath.appendingPathComponent("transfer")        if !FileManager.default.fileExists(atPath: path) {            do {                try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: false, attributes: nil)            } catch {                print(error)            }        }                webServer = GCDWebUploader(uploadDirectory: path)        webServer?.delegate = self        webServer?.allowHiddenItems = true        webServer?.allowedFileExtensions = ["doc", "docx", "xls", "xlsx", "txt", "pdf", "jpeg", "jpg"]        webServer?.title = "善斋工具"        webServer?.prologue = "欢饮使用善斋工具的WIFI管理平台"        webServer?.epilogue = "善斋书屋制作"                if webServer?.start() == true, let address = IPHelper.deviceIPAdress(), address.count > 0, let port = webServer?.port {            ipLb.text = "1.确保设备在同一局域网 \n2.上传时勿关闭该页面 \n3.请网页中输入该地址 \nhttp://\(address):\(port)/"        } else {            ipLb.text = "GCDWebServer not running!"        }    }}

局域网内获取本机的ip地址,并设置其他设备访问链接

#import <ifaddrs.h>#import <arpa/inet.h>#import <net/if.h>@implementation IPHelper+ (NSString *)deviceIPAdress {    NSString *address = @"";    struct ifaddrs *interfaces = NULL;    struct ifaddrs *temp_addr = NULL;    int success = 0;    success = getifaddrs(&interfaces);    if (success == 0) { // 0 表示获取成功        temp_addr = interfaces;        while (temp_addr != NULL) {            if( temp_addr->ifa_addr->sa_family == AF_INET) {                // Check if interface is en0 which is the wifi connection on the iPhone                if ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {                    // Get NSString from C String                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];                }            }            temp_addr = temp_addr->ifa_next;        }    }    freeifaddrs(interfaces);    return address;    }#define IOS_CELLULAR    @"pdp_ip0"#define IOS_WIFI        @"en0"#define IOS_VPN         @"utun0"#define IP_ADDR_IPv4    @"ipv4"#define IP_ADDR_IPv6    @"ipv6"#pragma mark - 获取设备当前网络IP地址+ (NSString *)getIPAddress:(BOOL)preferIPv4 {    NSArray *searchArray = preferIPv4 ?    @[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :    @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;        NSDictionary *addresses = [self getIPAddresses];    NSLog(@"addresses: %@", addresses);        __block NSString *address;    [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)     {         address = addresses[key];         //筛选出IP地址格式         if([self isValidatIP:address]) *stop = YES;     } ];    return address ? address : @"0.0.0.0";}+ (BOOL)isValidatIP:(NSString *)ipAddress {    if (ipAddress.length == 0) {        return NO;    }    NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";        NSError *error;    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];        if (regex != nil) {        NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];                if (firstMatch) {            NSRange resultRange = [firstMatch rangeAtIndex:0];            NSString *result=[ipAddress substringWithRange:resultRange];            //输出结果            NSLog(@"%@",result);            return YES;        }    }    return NO;}+ (NSDictionary *)getIPAddresses{    NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];        // retrieve the current interfaces - returns 0 on success    struct ifaddrs *interfaces;    if(!getifaddrs(&interfaces)) {        // Loop through linked list of interfaces        struct ifaddrs *interface;        for(interface=interfaces; interface; interface=interface->ifa_next) {            if(!(interface->ifa_flags & IFF_UP)  ) {                continue; // deeply nested code harder to read            }            const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];            if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {                NSString *name = [NSString stringWithUTF8String:interface->ifa_name];                NSString *type;                if(addr->sin_family == AF_INET) {                    if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {                        type = IP_ADDR_IPv4;                    }                } else {                    const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;                    if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {                        type = IP_ADDR_IPv6;                    }                }                if(type) {                    NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];                    addresses[key] = [NSString stringWithUTF8String:addrBuf];                }            }        }        // Free memory        freeifaddrs(interfaces);    }    return [addresses count] ? addresses : nil;}

在其他设备中访问该地址即可

let address = IPHelper.deviceIPAdress()let port = webServer?.porthttp://\(address):\(port)/

备注:

Game Over

局域网中,设备作为server,其他设备作为client,简单的HTTP方式上传文件到server,初始配置的路径即为server接收后存放文件的路径

感谢你能够认真阅读完这篇文章,希望小编分享的“怎么使用IOS实现WIFI传输”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯