搭建手机本地服务器,可以保存在iOS沙盒中,从沙盒去获取存在本地的html,配置文件和证书文件的安装,从而本地配置信息,不走服务器,更加快速配置使用配置文件和页面的展示
用到的框架 RoutingHTTPServer
CocoaHTTPServer
CocoaAsyncSocket
添加这些文件
编译没有出错的情况下就开始搭建了
在appdelegate导入头文件
#import "RoutingHTTPServer.h"
添加属性
@property (strong, nonatomic , readonly)RoutingHTTPServer *httpServer;
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ;中添加开启服务器的代码
// Create server using our custom MyHTTPServer class
_httpServer = [[RoutingHTTPServer alloc] init];
/* * * * * * * * * add By AK * * * * * * * * * * * * * */
/* 设置文件格式为 Apple.mobileconfig */
[_httpServer setDefaultHeader:@"Content-Type" value:@"application/x-apple-aspen-config"];
[_httpServer setType:@"_http._tcp."];
[_httpServer setPort:8000];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
[_httpServer setDocumentRoot:documentsDirectory];
NSLog(@"%d",_httpServer.isRunning);
if (_httpServer.isRunning){
[_httpServer stop];
};
NSError *error;
if([_httpServer start:&error]) {
NSLog(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
} else {
NSLog(@"Error starting HTTP Server: %@", error);
[self startServer];
}
其中端口号在测试的时候必须添加端口才可以使用,
在加载描述文件,所以添加类型
把你对应的文件存放在对应的沙盒中
使用UIApplication 来用safari 来启动你所使用的html文件或者是描述文件
NSURL *url1 = [NSURL URLWithString:@"http://127.0.0.1:8000/pptp1.html"];
if([[UIApplication sharedApplication] canOpenURL:url1]){
[[UIApplication sharedApplication] openURL:url1];
}
问题:
当程序在后台的时候,从后台调出app可能导致服务器断开,但服务器却无法检测
再次调用url会出现无法访问服务器
解决1:添加一个UIBackgroundTaskIdentifier来让app进入后台的时候运行一段时间
在app delegate中
@property (nonatomic, unsafe_unretained)UIBackgroundTaskIdentifier bgTask;
在- (void)applicationDidEnterBackground:(UIApplication *)application中添加
if(!_bgTask) {
_bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
dispatch_async(dispatch_get_main_queue(), ^{
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
});
}];
}
问题2:可能时间过长还是导致服务器失效
无效,服务器是正常的,没有断开连接.
我解决的办法
在- (void)applicationDidEnterBackground:(UIApplication *)application
app进入后台的时候关闭服务器,调用
[_httpServer stop];
当app进入前台- (void)applicationDidBecomeActive:(UIApplication *)application
再次开启
NSError *error;
if([_httpServer start:&error]) {
NSLog(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
} else {
NSLog(@"Error starting HTTP Server: %@", error);
// Probably should add an escape - but in practice never loops more than twice (bug filed on GitHub https://github.com/robbiehanson/CocoaHTTPServer/issues/88)
[self startServer];
}