iOS客户端开启FTP,其他设备访问手机本地文件操作实现
因为项目需要,需要在手机端搭建FTP服务,让其他设备来访问手机某个路径文件夹下边的文件,实现下载功能。
主要实现借助第三方库XMFTPServer, 原来文件有修改,实现带用户名、密码访问连接FTP。
首先封装FTPManager,便于其他地方使用
.h 文件部分代码
#import "XMFTPServer.h"
@interface FTPManager : NSObject
/**
* 服务器ftpServer;
*/
@property (nonatomic, strong) XMFTPServer *ftpServer;
/**
* 是否有用户连接
*/
@property (nonatomic, assign) BOOL isLink;
/**
* 创建ftpServer管理类单例
*/
+ (instancetype)sharedManager;
/**
* 主动断开链接
*/
- (void)disconnect;
/**
* 开放端口
*/
- (void)portDispark;
@end
.m 文件部分代码
@implementation FTPManager
/** */
+ (instancetype)sharedManager {
static FTPManager *_ftpManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_ftpManager = [[FTPManager alloc] init];
});
return _ftpManager;
}
/** 主动断开链接 */
- (void)disconnect {
[self.ftpServer stopFtpServer];
self.isLink = NO;
}
/** 开放端口,监听ftp用户 */
- (void)portDispark {
//默认开放端口为20000
unsigned ftpPort = 20000;
NSString *basePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
self.ftpServer = [[XMFTPServer alloc] initWithPort:ftpPort withDir:basePath notifyObject:self];
NSLog(@"FTP服务器地址:%@", [NSString stringWithFormat:@"ftp://%@:%u", [ManagerTool getIPAddress],ftpPort]);
}
/** 监听登录用户 */
- (void)currentUserLogin {
self.isLink = YES;
NSLog(@"有FTP用户登录进来了");
}
@end
由于开放FTP需要设置账户、密码, 需要在XMFTPServer源文件作出修改。
XMFTPConnection.m中需要做修改, 修改代码如下
-(void)doUser:(id)sender arguments:(NSArray*)arguments
{
// send out confirmation message -- 331 password required for
if ( currentUser != nil )
currentUser = [NSString new];
currentUser = [arguments objectAtIndex:1];
NSString *outputString = [[NSString alloc] init];
if([[arguments objectAtIndex:1] isEqualToString:@"用户名"]){
outputString = [ NSString stringWithFormat:@"331 Password required for %@", currentUser ];
[[NSNotificationCenter defaultCenter] postNotificationName:@"currentUserLogin" object:nil];
}else{
outputString = @"530 Invalid username\n";
}
[ sender sendMessage:outputString];
}
-(void)doPass:(id)sender arguments:(NSArray*)arguments
{
NSString *pass = [ arguments objectAtIndex:1 ];
NSString *outputString = [[NSString alloc] init];
if([pass isEqualToString:@"密码"]){
outputString = [ NSString stringWithFormat:@"230 User %@ logged in.", currentUser ];
}else{
outputString = @"500 Invalid username or password\n";
}
[ sender sendMessage:outputString];
}
基本实现iOS开放设置携带用户名、密码的服务,其他设备可访问移动端本地文件。