美文网首页iOS开发进阶iOS技术交流iOS
iOS 实现WiFi局域网传输文件至APP

iOS 实现WiFi局域网传输文件至APP

作者: 安静守护你 | 来源:发表于2018-06-29 17:54 被阅读126次

    由于个人使用习惯,看小说喜欢自己扒拉下载后传到小说阅读APP上浏览,电影也同样,我使用的宜搜小说和暴风影音其中都有这么一个功能,那就是WiFi传书、WiFi传片。

    宜搜小说WiFi传书 暴风影音传片助手

    要实现在局域网内设备间传送文件的功能,我的第一想法局域网内广播点对点传输文件(不过这个实在是不大懂) 【后来查到的有通过这种方式实现的,可以参考 iOS--(转)WiFi传输数据;那么第二想法就是建立一个服务器,就跟平时的网络请求一样,不过转换到这个功能上,就应该把手机建立为服务器,传输文件的一端为客户端,客户端访问指定页面上传文件。所以要实现这个功能,要完成这几个步骤:

    1. 把自己的手机设置为局域网内的服务器;
    2. 获取到自己手机的IP地址并设置一个传输端口号;
    3. 传输文件到指定的位置;
    4. 显示指定位置的所有文件。(很鸡肋。。。)

    1. 将本机设为本地服务器

    在网上稍微扒拉了一下,一大堆的帖子等等,简而言之用的最多的并且最好的就是 CocoaHTTPServer 了。

    CocoaHTTPServer

    A small, lightweight, embeddable HTTP server for Mac OS X or iOS applications

    不标准的翻译(原谅我这英语一级不过的人,人工表情:大哭):
    CocoaHTTPServer是一款为Mac OS X或者iOS应用提供HTTP服务的轻量级、小巧的框架。

    框架有了,就开始导入了,我使用的是cocoaspods。(原谅我的懒)

    pod CocoaHTTPServer

    cocoaspods导入成功

    距离成功还有一段距离,我们还要在CocoaHTTPServer的基础上,基于HTTPConnection进行二次封装。至于封装的类这里就不再赘述了,我会直接在文章结尾处放上代码,需要的可以去下载就OK了。
    值得一说的是:在基于HTTPConnection封装的类中的代理方法 - (void)processStartOfPartWithHeader:(MultipartMessageHeader *)header 中,指定的上传目录为Documents,这里可以根据项目需要进行需改。

    NSString *uploadDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    

    可参考下篇文章:iOS沙盒篇

    2. 获取本机IP地址

    为了方便,直接给封装为一个类,调用直接获取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";
    }
    

    端口号可以随机生成,不过为了避免冲突,端口号一般都会稍微大一点,比如:88888等

    3. 通过浏览器传输文件

    在APP本地添加一个简单的可以上传的html文件,然后在浏览器端输入IP地址就可以访问到这个页面,并进行传输操作。

    上传页面

    WiFi局域网传输文件demo是基于iTunes文件共享的demo实现的,在支持iTunes文件共享页面的右上角点击同网传送即可打印出IP地址及端口号,浏览器访问即可。 代码传送门

    注意:如果同网传送生成的IP地址在浏览器访问连接失败,可以在ViewController.mviewDidLoad函数中调用[self demo1];进行一次网络请求,之后便可以实现同网传输。

    相关链接:iOS沙盒篇

    相关文章

      网友评论

      本文标题:iOS 实现WiFi局域网传输文件至APP

      本文链接:https://www.haomeiwen.com/subject/cmlnyftx.html