私はiPhoneを使って自分のWindows共有フォルダにアクセスする方法を見つけようとしています。必要な機能は、私が構築しているより大きなエンタープライズアプリの一部です。すでに同様の質問をしているが運がない人がいます-iOSはSMBを介したファイル操作をサポートしていますか?
今、私は「SimpleNetworkStreams」と呼ばれるアップルデベロッパチュートリアルを見つけました。これは、NSNetServiceインスタンスのタイプをプロトコルに設定することにより、tcpを介してx-SNSUploadプロトコルを使用するためにNSNetServiceを使用しますx-SNSUpload._tcp
これが彼らがそれをどのように行ったかです-
self.netService = [[[NSNetService alloc] initWithDomain:@"local." type:@"_x-SNSUpload._tcp." name:@"Test"] autorelease];
したがって、MacBookでSMBサーバーに置き換え_x-SNSUpload._tcp
て実行するとします。_smb._tcp
次の一連のコマンドを実行して、MacBookでSMBを起動します
dns-sd -R Test _smb._tcp. "" 12345
nc -l 12345 > tmp.png
次に、iPhoneの画像をMacBookのルートディレクトリに転送できます。私はWindowsマシンの共有フォルダでも同じことをしたいと思っていました。
共有フォルダの名前は「テスト共有」です。私は自分のWindowsマシンの「テスト共有」フォルダをすべての人に完全に制御して明示的に共有しました。コードの完全な詳細は以下に記載されています(更新後)
ブラウザで「smb:\\ 10.212.19.121」と直接入力すると、共有フォルダにアクセスできます。ファインダーアプリケーションが開き、「一時共有」フォルダーをマウントするオプションが表示されます。
更新-上から取り出された多くの冗長なテキストと、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オブジェクトを使用してサービスを参照できます。」
NSNetServiceのオブジェクトは、SMBサーバーをホストするサーバーに対してインスタンス化されます
// 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];