由于iOS系统的封闭性,在数据传输方面十分不方便。不像安卓设备,直接连接电脑就能当U盘使用。所以一般我们如果用iPhone临时存取个东西,要么使用数据线连接iTunes,要么手机电脑都登上QQ,使用QQ来传输。
但这两种方式都略显不便,所以市面上出现了无线U盘这类的APP。原理很简单,就是软件打开后会启动HTTP服务器,这时电脑端使用浏览器输入
手机的ip,就可以通过web页面的形式访问到这个软件的用户文档。同时在这个web页面里,直接可以进行文件的上传,下载,删除等操作。
手机的ip,就可以通过web页面的形式访问到这个软件的用户文档。同时在这个web页面里,直接可以进行文件的上传,下载,删除等操作。
下面演示如何开发一个无线U盘,实现功能如下:
1,程序启动后会启动Web服务,并监听设置的端口,等待请求
2,电脑浏览器输入手机ip+端口,在web页上会列出用户文档里所有文件
3,点击文件,即可下载
效果图如下:
详细步骤:
1,这里用到了Swift Taylor(一个用Swift编写HTTP服务器的开发包)。先把Taylor整个包引入到项目。
2,添加个头文件bridge.h,并添加到编译参数里(Taylor内部又使用了一个叫CocoaAsyncSocket的socket库,使用Objective-C写的)
1
|
# import "GCDAsyncSocket.h"
|
3,页面代码 ViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
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盘,有兴趣的可以自行加上文件上传和删除功能。
源码下载:WirelessStorage.zip