【发布时间】:2011-06-25 22:01:40
【问题描述】:
我一直在尝试找出一种方法来使用 iPhone 访问我的 windows 共享文件夹。所需的功能是我正在构建的更大企业应用程序的一部分。这是一个已经问过类似问题但没有运气的人 - Does iOS support file operations via SMB?
现在,我找到了名为“SimpleNetworkStreams”的苹果开发者教程,它使用 NSNetService 通过将 NSNetService 实例的类型设置为协议 x-SNSUpload._tcp 来通过 tcp 使用 x-SNSUpload 协议
这是他们的做法 -
self.netService = [[[NSNetService alloc] initWithDomain:@"local." type:@"_x-SNSUpload._tcp." name:@"Test"] autorelease];
因此,如果我只是将 _x-SNSUpload._tcp 替换为 _smb._tcp 并在我的 macbook 上运行 SMB 服务器。我运行以下命令集在我的 macbook 上启动 SMB
dns-sd -R Test _smb._tcp. "" 12345
nc -l 12345 > tmp.png
然后我可以将 iPhone 中的图片传输到我的 macbook 的根目录。我希望对 Windows 机器上的共享文件夹做同样的事情。
共享文件夹的名称是“测试共享”。我已经在我的 Windows 机器中明确共享了我的“测试共享”文件夹,并且所有人都可以完全控制。代码的完整细节放在下面(更新后)
如果我在浏览器上直接输入“smb:\\10.212.19.121”,我就可以访问我的共享文件夹。它会打开 finder 应用程序,并为我提供挂载“临时共享”文件夹的选项。
更新 - 从上面删除的大量冗余文本以及有关 SimpleNetworkStreams 工作原理和我已调整内容的更好细节放在下面。
代码取自-SimpleNetworkStreams-
- 为我们要发送的文件打开 NSInputStream 类型的流
//Open a stream for the file we're going to send
//filepath is a NSString with path to the file on iPhone
self.fileStream = [NSInputStream inputStreamWithFileAtPath:filepath];
assert(self.fileStream != nil);
[self.fileStream open];
- 正如苹果文档所说的那样
"您可以直接创建一个 NSNetService 对象(如果您知道确切的主机和端口信息),也可以使用 NSNetServiceBrowser 对象来浏览服务。"
为托管 SMB 服务器的服务器实例化一个 NSNetService 对象
// Open a stream to the server, finding the server via Bonjour. Then configure
// the stream for async operation.
//here's the tweak.
//original code looked like -
//self.netService = [[[NSNetService alloc] initWithDomain:@"local." type:@"_x-SNSUpload._tcp." name:@"Test"] autorelease];
self.netService = [[[NSNetService alloc] initWithDomain:@"10.212.19.121" type:@"_smb._tcp." name:@"lanmanserver"] autorelease];
assert(self.netService != nil);
NSDictionary *newDict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"domain\\username",@"password",@"C:\\Documents and Settings\\username\\Desktop\\test%20sharing",nil] forKeys:[NSArray arrayWithObjects:@"u",@"p",@"path",nil]];
[self.netService setTXTRecordData:[NSNetService dataFromTXTRecordDictionary:newDict]];
将NSOutputStream类型的输出流对象获取到self.networkStream中。
success = [self.netService getInputStream:NULL outputStream:&output];
assert(success);
self.networkStream = output;
[output release];
self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.networkStream open];
然后 NSOutputStream 委托捕获我们在输入文件中缓冲的 NSStreamEventHasSpaceAvailable,然后将该缓冲区写入我们的 NSOutputStream 对象,即 networkStream
bytesWritten = [self.networkStream write:&self.buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset];
【问题讨论】:
标签: iphone share smb nsnetservice