Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
作者:hangge | 2015-06-11 15:22
由于iOS系统的封闭性,在数据传输方面十分不方便。不像安卓设备,直接连接电脑就能当U盘使用。所以一般我们如果用iPhone临时存取个东西,要么使用数据线连接iTunes,要么手机电脑都登上QQ,使用QQ来传输。


调试说明:
但这两种方式都略显不便,所以市面上出现了无线U盘这类的APP。原理很简单,就是软件打开后会启动HTTP服务器,这时电脑端使用浏览器输入手机的ip,就可以通过web页面的形式访问到这个软件的用户文档。同时在这个web页面里,直接可以进行文件的上传,下载,删除等操作。
下面演示如何开发一个无线U盘,实现功能如下:
1,程序启动后会启动Web服务,并监听设置的端口,等待请求
2,电脑浏览器输入手机ip+端口,在web页上会列出用户文档里所有文件
3,点击文件,即可下载
效果图如下:

详细步骤:
1,这里用到了Swift Taylor(一个用Swift编写HTTP服务器的开发包)。先把Taylor整个包引入到项目。

2,添加个头文件bridge.h,并添加到编译参数里(Taylor内部又使用了一个叫CocoaAsyncSocket的socket库,使用Objective-C写的)
#import "GCDAsyncSocket.h"
3,页面代码 ViewController.swift
import UIKit
import AssetsLibrary
class ViewController: UIViewController {
//文件操作类
var manager:NSFileManager!
//保存用户文档目录
var docPath:NSURL!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//设置用户文档路径
manager = NSFileManager.defaultManager()
let urlsForDocDirectory = manager.URLsForDirectory(
NSSearchPathDirectory.DocumentDirectory,
inDomains:NSSearchPathDomainMask.UserDomainMask)
docPath = urlsForDocDirectory[0] as! NSURL
//设置Web服务器
let server = Server()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
() -> Void in
server.addPostRequestHandler(Middleware.requestLogger(println))
//首页请求
server.get("/") {
request, response, callback in
self.createIndexHtml()
let file = self.docPath.URLByAppendingPathComponent("index.html")
let data = self.manager.contentsAtPath(file.path!)
response.body = data
callback(.Send(request, response))
}
//文件请求
server.get("/file") {
request, response, callback in
println(request.arguments)
var fileName = request.arguments["fileName"]
let file = self.docPath.URLByAppendingPathComponent(fileName!)
let data = self.manager.contentsAtPath(file.path!)
response.body = data
callback(.Send(request, response))
}
//启动并监听服务器
server.startListening(port: 4000, forever: true) {
result in
switch result {
case .Success:
println("Up and running")
case .Error(let e):
println("Server start failed \(e)")
}
}
})
}
//加载用户文档下的文件,并生成index.html首页
func createIndexHtml()->Void{
var content = "<html><meta charset=\"utf-8\"><body>"
let contentsOfPath = manager.contentsOfDirectoryAtPath(docPath.path!, error: nil)
for child in contentsOfPath!{
content = content + "<a target='_blank' href='/file?fileName=\(child)'>\(child)</a><br/>"
}
content = content + "</body></html>"
createFile("index.html", fileBaseUrl: docPath, content:content)
}
//创建文件
func createFile(name:String,fileBaseUrl:NSURL,content:String){
var error:NSErrorPointer = nil
let file = fileBaseUrl.URLByAppendingPathComponent(name)
println("文件: \(file)")
let exist = manager.fileExistsAtPath(file.path!)
if !exist {
var error:NSErrorPointer = nil
manager.removeItemAtPath(file.path!, error:error)
}
let data = content.dataUsingEncoding(NSUTF8StringEncoding,
allowLossyConversion: true)
let createSuccess = manager.createFileAtPath(file.path!,contents:data,
attributes:nil)
println("文件创建结果: \(createSuccess)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
调试说明:
1,默认使用4000端口,可以在代码里修改
2,真机调试的话,可以先把测试文件用iTunes传到这个APP的用户文档里。再启动程序,电脑输入手机ip+端口访问
3,模拟器调试的话,文件可以直接拷到这个程序的用户文档里(路径在控制台中有打印)。电脑输入localhost+端口访问
4,目前这个只能说是一个只读U盘,有兴趣的可以自行加上文件上传和删除功能。
全部评论(2)
谢谢站长!是客户端,iOS关于FTP的文章不多,swift的就更少了!
站长回复:不客气,那我下周出个FTP客户段相关的文章。
站长,你好,有没有关于FTP的文章啊,谢谢!
站长回复:不知道你说的是FTP服务端还是客户端。客户端的话,我周末或者下周写篇相关文章,你可以关注下。服务端的话我还不会。