iOS开发进阶iOS技术交流iOS

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

2018-06-29  本文已影响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沙盒篇

上一篇下一篇

猜你喜欢

热点阅读