如何使用IOS实现WIFI传输

 更新时间:2021年04月13日 16:35:09   作者:森雨豪  
这篇文章主要介绍了如何使用IOS实现WIFI传输,对局域网传输和HTTP感兴趣的同学,可以参考下

问题

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

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

方案

最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) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
                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?.port
http://\(address):\(port)/

备注:

  • 确保设备在同一局域网
  • 上传时勿关闭该页面

Game Over

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

以上就是如何使用IOS实现WIFI传输的详细内容,更多关于IOS实现WIFI传输的资料请关注脚本之家其它相关文章!

相关文章

  • iOS9新特性之UIStackView

    iOS9新特性之UIStackView

    UIStackView主要包括了四大属性:axis、alignment、distribution、spacing。下面通过本文给大家介绍iOS9新特性之UIStackView的相关知识,感兴趣的朋友一起看看吧
    2017-09-09
  • 详解iOS的Core Animation框架中的CATransform3D图形变换

    详解iOS的Core Animation框架中的CATransform3D图形变换

    CATransform3D一般用于操作view的layer的,是Core Animation的结构体,可以用来做比较复杂的3D操作,这里我们就带大家来详解iOS的Core Animation框架中的CATransform3D图形变换
    2016-07-07
  • iOS使用pageViewController实现多视图滑动切换

    iOS使用pageViewController实现多视图滑动切换

    这篇文章主要为大家详细介绍了iOS使用pageViewController实现多视图滑动切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Flutter之TabBarView组件项目实战示例

    Flutter之TabBarView组件项目实战示例

    这篇文章主要为大家介绍了Flutter之TabBarView组件项目实战示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • React Native搭建iOS开发环境

    React Native搭建iOS开发环境

    React Native的门槛不管是对于前端开发者还是移动端开发者来说都是很高的,既要懂原生又要懂js,技术栈是相当长的。但是没有关系,下面我们一步步来学习,慢慢成长吧!
    2016-09-09
  • iOS App开发中UITextField组件的常用属性小结

    iOS App开发中UITextField组件的常用属性小结

    这篇文章主要介绍了iOS App开发中UITextField组件的常用属性小结,文中还介绍了UITextField隐藏键盘及为内容增加校验的两个使用技巧,需要的朋友可以参考下
    2016-04-04
  • IOS中的七种手势小结

    IOS中的七种手势小结

    本文给大家总结了ios中的七种手势,手势在开发在开发中经常会用到,今天小编通过本文给大家详细介绍下,需要的朋友参考下
    2016-11-11
  • iOS多Target环境配置的完整步骤

    iOS多Target环境配置的完整步骤

    这篇文章主要给大家介绍了关于iOS多Target环境配置的完整步骤,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    这篇文章主要介绍了iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势),具有一定的参考价值,有需要的可以参考一下。
    2016-11-11
  • iOS实现大雪纷飞动画

    iOS实现大雪纷飞动画

    这篇文章主要为大家详细介绍了iOS实现大雪纷飞动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论