• 问题

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

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

  • 方案

    最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传书相关推荐

  1. 多看Android版本WIFI传书的实现

    多看Android版本WIFI传书的实现 参照<多看>的WIFI传书功能 * 手机端的HttpServer采用开源项目AndroidAsync实现的. * 网页端采用jQuery实现,文件 ...

  2. iOS 实现 WiFi 局域网传输文件到 App

    我经常使用「多看」和「掌阅」App 看书,其中有一个共同的功能就是 WiFi 传书,根据 App 的提示在电脑浏览器打开指定的地址,传入文件就可以直接发送到手机上阅读了. 虽然这个功能需求不是很多,但 ...

  3. [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)

    (本文详情来源:android源码 http://www.eoeandroid.com/thread-296427-1-1.html   转载请注明出处!)  [Android源码分享]飞鸽传书的An ...

  4. 飞鸽传书FreeEIM买还是不买?

    笔者在现场与排队即时通讯交流时发现,大部分即时通讯比较倾向的16G版的3GS FreeEIM,作为软件今年5月才发布的FreeEIM新品,3GS被称作是"最快的FreeEIM". ...

  5. Kindle如何带封面传书

    软件:calibre Kinlde传书以往分为两种方式,一种是邮件传输,另一种是数据线连接电脑传输 邮件传书 每部Kindle都有自己的邮箱,通过附件的方式给Kindle邮箱发送邮件就可以传书 但是K ...

  6. android版本飞鸽传书源码

    2019独角兽企业重金招聘Python工程师标准>>> 说明 第一次在eoe论坛发帖.去年11月份开始自学android开发, 长期混迹在eoe里潜水.今天来点贡献.贡献出我自己写的 ...

  7. ios实现wifi搜索连接_Wifi 定位原理及 iOS Wifi 列表获取

    Wifi 定位原理及 iOS Wifi 列表获取 对于大家来说,Wifi 应该是一个很熟悉的词了,我们每天都可能在使用 Wifi 热点.Wifi 除了能给我们提供热点之外同时还有定位的作用, 现在移动 ...

  8. “飞鸽传书”无法显示局域网用户问题的解决办法

    为了方便文件传输,在同个局域网内的两台机器上安装了飞鸽传书(5.1版本). 运行后确发现互相都看不到对方--工作组的用户列表是空的,等待一段时间后不断点击刷新列表按钮,依然空白. 相信其他同学也遇到类 ...

  9. 一个软件网络连接异常_飞鸽传书软件下载-飞鸽传书短信平台下载

    飞鸽传书是一款非常好用的.操作简单.便捷的互动界面,用户们可以在这里进行最方便的短信通信等,软件中,用户们还可以进行文件的快速的传输使用等,有需要的用户们就来下载吧~ 飞鸽传书介绍: 1.通过WiFi ...

最新文章

  1. R语言list.files函数获取文件列表实战
  2. explain mysql怎么用_[mysql] mysql explain 使用
  3. telnet命令发送邮件
  4. COS系统的前端演变和发展
  5. Python实现微信朋友签名云图项目
  6. loadrunner性能测试——第一步 录制脚本(中文版)
  7. python_机器学习(一)、基本概念
  8. Gridview DetailView
  9. matlab语言与应用 10 数学问题的非传统解法
  10. linux下查看mysql配置文件位置
  11. HttpClient示例01
  12. 小知识 - 恢复chmod执行权限
  13. RSA算法实现(Python版)
  14. 国产GM8220,USB2.0集线器,替换汤铭的FE1.1,USB HUB,替换创维GL850
  15. C++基础入门(超详细)
  16. (字符串分解器)StringTokenizer类的使用_无名小仙男
  17. 中小企业OA管理系统(微鳄OA私有化部署)
  18. Python---魔术方法
  19. 直线滑台模组与电机控制
  20. 处理QQ五笔(2.3.622.400)不能保存中文状态使用英文标点的问题

热门文章

  1. ubuntu 14.04解压zip文件出现乱码
  2. 每个程序员都应该了解:KISS:60年前美国军方的编程原则。
  3. 来看看这些“高科技奶嘴”,是你的“快乐老家”吗?
  4. LintCode领扣算法问题答案:190. 下一个排列
  5. 糖尿病治疗进入肽时代,Bachem公司的肽了解一下
  6. 杨元喜院士:《北斗+与综合PNT体系》
  7. Things3 for Mac如何设置任务提醒
  8. 免费的jpg转pdf软件
  9. Serial.begin
  10. php美团团购项目,微信小程序如何实现美团菜单