Хотя у меня нет быстрого ответа (я имею в виду быстрое решение), у меня есть решение.
Это включает в себя отказ от протокола file:// и переключение на http:// через localhost.
КОРОТКИЙ ОТВЕТ
Вот шаги:
1) — Установите локальный веб-сервер в своем приложении;
2) — Настройте локальный веб-сервер для обслуживания с локального хоста на заданном порту по вашему выбору;
3) — Настройте делегата, который фактически обслуживает файл из ресурсов вашего приложения с учетом правильного типа MIME;
4) — Разрешить обход ATS iOS9 для обработки http (а не только https).
И вуаля!
ДЕТАЛЬНЫЙ ОТВЕТ
1) Установите локальный веб-сервер в своем приложении;
Установите GCDWebServer из репозитория Github: https://github.com/swisspol/GCDWebServer.
2) Настройте локальный веб-сервер для обслуживания с локального хоста на заданном порту вашего компьютера.
Учитывая тот факт, что файлы приложений angularjs или HTML находятся в папке «приложение» в папке ресурсов.
В вашем vc ViewDidLoad:
@implementation ViewController
GCDWebServer* _webServer;
- (void)viewDidLoad
{
[super viewDidLoad];
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame];
[self.view addSubview:self.webView];
self.webView.navigationDelegate = self;
NSURL *bundleURL = [NSBundle mainBundle].bundleURL;
NSURL *basePath = nil;
// Init WebServer
[self initWebServer:[[NSURL URLWithString:@"app" relativeToURL:bundleURL] absoluteURL]];
basePath = [NSURL URLWithString:@"http://localhost:8080/page.html#/home" relativeToURL:nil];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:basePath];
[self.webView loadRequest:request];
}
3) Настройте делегата, который фактически обслуживает файл из ресурсов вашего приложения с учетом правильного типа MIME;
-(void)initWebServer:(NSURL *)basePath {
// Create server
_webServer = [[GCDWebServer alloc] init];
#define GCDWebServer_DEBUG 0
#define GCDWebServer_VERBOSE 1
#define GCDWebServer_INFO 2
#define GCDWebServer_WARNING 3
#define GCDWebServer_ERROR 4
#define GCDWebServer_EXCEPTION 5
[GCDWebServer setLogLevel:GCDWebServer_ERROR];
// Add a handler to respond to GET requests on any URL
[_webServer addDefaultHandlerForMethod:@"GET"
requestClass:[GCDWebServerRequest class]
processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
//NSLog([NSString stringWithFormat:@"WS: loading %@", request]);
NSString * page = request.URL.lastPathComponent;
NSString * path = request.URL.path;
NSString * file = path;
//NSLog(@"WS: loading %@", file);
NSString * fullPath = [NSString stringWithFormat:@"%@%@", basePath, path];
NSString * sFullPath = [fullPath substringFromIndex:7];
BOOL isText = NO;
if([page.lastPathComponent hasSuffix:@"html"]) {
isText = YES;
}
if (isText) {
NSError * error = nil;
NSString * html = [NSString stringWithContentsOfFile:sFullPath encoding:NSUTF8StringEncoding error: &error];
return [GCDWebServerDataResponse responseWithHTML:html];
}
else {
NSData * data = [NSData dataWithContentsOfFile:sFullPath];
if (data !=nil) {
NSString * type = @"image/jpeg";
if ([page.lastPathComponent hasSuffix:@"jpg"]) type = @"image/jpeg";
else if ([page.lastPathComponent hasSuffix:@"png"]) type = @"image/png";
else if ([page.lastPathComponent hasSuffix:@"css"]) type = @"text/css";
else if ([page.lastPathComponent hasSuffix:@"js" ]) type = @"text/javascript";
return [GCDWebServerDataResponse responseWithData:data contentType:type];
}
else {
return [GCDWebServerDataResponse responseWithHTML:[NSString stringWithFormat:@"<html><body><p>404 : unknown file %@ World</p></body></html>", sFullPath]];
//return [GCDWebServerDataResponse responseWithHTML:@"<html><body><p>Hello World</p></body></html>"];
}
}
}];
// Start server on port 8080
[_webServer startWithPort:8080 bonjourName:nil];
NSLog(@"Visiting %@", _webServer.serverURL);
}
4) Разрешить обход ATS iOS9 для обработки http (а не только https)
В вашем файле info.plist в Xcode вы должны добавить словарь с именем «Настройки безопасности транспорта приложений» со следующим ключом-значением:
NSAllowsArbitraryLoads = истина
Надеюсь, поможет. Любой, кто наткнется на что-то более простое, может ответить!
person
Stéphane de Luca
schedule
03.11.2015