由于个人使用习惯,看小说喜欢自己扒拉下载后传到小说阅读APP上浏览,电影也同样,我使用的宜搜小说和暴风影音其中都有这么一个功能,那就是WiFi传书、WiFi传片。
宜搜小说WiFi传书 暴风影音传片助手要实现在局域网内设备间传送文件的功能,我的第一想法局域网内广播点对点传输文件(不过这个实在是不大懂) 【后来查到的有通过这种方式实现的,可以参考 iOS--(转)WiFi传输数据】;那么第二想法就是建立一个服务器,就跟平时的网络请求一样,不过转换到这个功能上,就应该把手机建立为服务器,传输文件的一端为客户端,客户端访问指定页面上传文件。所以要实现这个功能,要完成这几个步骤:
- 把自己的手机设置为局域网内的服务器;
- 获取到自己手机的IP地址并设置一个传输端口号;
- 传输文件到指定的位置;
- 显示指定位置的所有文件。(很鸡肋。。。)
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
距离成功还有一段距离,我们还要在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.m
的viewDidLoad
函数中调用[self demo1];
进行一次网络请求,之后便可以实现同网传输。
相关链接:iOS沙盒篇
网友评论