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 = selfwebServer?.allowHiddenItems = truewebServer?.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 iPhoneif ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {// Get NSString from C Stringaddress = [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 successstruct ifaddrs *interfaces;if(!getifaddrs(&interfaces)) {// Loop through linked list of interfacesstruct 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 memoryfreeifaddrs(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传书相关推荐
- 多看Android版本WIFI传书的实现
多看Android版本WIFI传书的实现 参照<多看>的WIFI传书功能 * 手机端的HttpServer采用开源项目AndroidAsync实现的. * 网页端采用jQuery实现,文件 ...
- iOS 实现 WiFi 局域网传输文件到 App
我经常使用「多看」和「掌阅」App 看书,其中有一个共同的功能就是 WiFi 传书,根据 App 的提示在电脑浏览器打开指定的地址,传入文件就可以直接发送到手机上阅读了. 虽然这个功能需求不是很多,但 ...
- [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
(本文详情来源:android源码 http://www.eoeandroid.com/thread-296427-1-1.html 转载请注明出处!) [Android源码分享]飞鸽传书的An ...
- 飞鸽传书FreeEIM买还是不买?
笔者在现场与排队即时通讯交流时发现,大部分即时通讯比较倾向的16G版的3GS FreeEIM,作为软件今年5月才发布的FreeEIM新品,3GS被称作是"最快的FreeEIM". ...
- Kindle如何带封面传书
软件:calibre Kinlde传书以往分为两种方式,一种是邮件传输,另一种是数据线连接电脑传输 邮件传书 每部Kindle都有自己的邮箱,通过附件的方式给Kindle邮箱发送邮件就可以传书 但是K ...
- android版本飞鸽传书源码
2019独角兽企业重金招聘Python工程师标准>>> 说明 第一次在eoe论坛发帖.去年11月份开始自学android开发, 长期混迹在eoe里潜水.今天来点贡献.贡献出我自己写的 ...
- ios实现wifi搜索连接_Wifi 定位原理及 iOS Wifi 列表获取
Wifi 定位原理及 iOS Wifi 列表获取 对于大家来说,Wifi 应该是一个很熟悉的词了,我们每天都可能在使用 Wifi 热点.Wifi 除了能给我们提供热点之外同时还有定位的作用, 现在移动 ...
- “飞鸽传书”无法显示局域网用户问题的解决办法
为了方便文件传输,在同个局域网内的两台机器上安装了飞鸽传书(5.1版本). 运行后确发现互相都看不到对方--工作组的用户列表是空的,等待一段时间后不断点击刷新列表按钮,依然空白. 相信其他同学也遇到类 ...
- 一个软件网络连接异常_飞鸽传书软件下载-飞鸽传书短信平台下载
飞鸽传书是一款非常好用的.操作简单.便捷的互动界面,用户们可以在这里进行最方便的短信通信等,软件中,用户们还可以进行文件的快速的传输使用等,有需要的用户们就来下载吧~ 飞鸽传书介绍: 1.通过WiFi ...
最新文章
- R语言list.files函数获取文件列表实战
- explain mysql怎么用_[mysql] mysql explain 使用
- telnet命令发送邮件
- COS系统的前端演变和发展
- Python实现微信朋友签名云图项目
- loadrunner性能测试——第一步 录制脚本(中文版)
- python_机器学习(一)、基本概念
- Gridview DetailView
- matlab语言与应用 10 数学问题的非传统解法
- linux下查看mysql配置文件位置
- HttpClient示例01
- 小知识 - 恢复chmod执行权限
- RSA算法实现(Python版)
- 国产GM8220,USB2.0集线器,替换汤铭的FE1.1,USB HUB,替换创维GL850
- C++基础入门(超详细)
- (字符串分解器)StringTokenizer类的使用_无名小仙男
- 中小企业OA管理系统(微鳄OA私有化部署)
- Python---魔术方法
- 直线滑台模组与电机控制
- 处理QQ五笔(2.3.622.400)不能保存中文状态使用英文标点的问题
热门文章
- ubuntu 14.04解压zip文件出现乱码
- 每个程序员都应该了解:KISS:60年前美国军方的编程原则。
- 来看看这些“高科技奶嘴”,是你的“快乐老家”吗?
- LintCode领扣算法问题答案:190. 下一个排列
- 糖尿病治疗进入肽时代,Bachem公司的肽了解一下
- 杨元喜院士:《北斗+与综合PNT体系》
- Things3 for Mac如何设置任务提醒
- 免费的jpg转pdf软件
- Serial.begin
- php美团团购项目,微信小程序如何实现美团菜单