2

GCDWebServer を使用して、デバイスに HTTP サーバーを作成しています。Web ページの実際のコンテンツは、my アプリの Documents フォルダー内に配置されます。コンテンツには、参照された css および png ファイルを含む HTML ファイルが含まれています。問題は、css および png ファイルがサーバーからアクセス/使用できないことです (HTML テキスト コンテンツしか表示されません)。

関連するコード:

self.server = [[GCDWebServer alloc] init];

NSString *documents = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] absoluteString];
documents = [documents stringByAppendingPathComponent:@"MyWebsite"];

[self.server addGETHandlerForBasePath:@"/" directoryPath:documents indexFilename:nil cacheAge:0 allowRangeRequests:YES];

__weak typeof(self) weakSelf = self;

[_server addDefaultHandlerForMethod:@"GET" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest *request) {

        if ([[request path] isEqualToString:@"/status"]) {

            return [GCDWebServerDataResponse responseWithText:@"RUNNING"];
        }

        else if ([[request path] isEqualToString:@"/"]) {

            NSString *filePath = [documents stringByAppendingPathComponent:@"mypage.html"];
            NSString *html = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
            return [GCDWebServerDataResponse responseWithHTML:html];

        }    

    return nil;

}];

[self.server startWithOptions:@{GCDWebServerOption_Port: @(80)} error:&error];

ありがとう!

4

1 に答える 1

5

私は解決策を見つけました:

server addGETHandlerForBasePathand thenでハンドラを追加するのはserver addDefaultHandlerForMethod:間違っているようです。

次の変更を行う必要がありました。

addGETHandlerForBasePath:

// using `absoluteString` is adding "file://" in front of the path. This seems to be wrong. The following code will create a correct path string.
const char *path = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] fileSystemRepresentation];
NSString *documents = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:path length:strlen(path)];

// full path to the HTML file
NSString *htmlFile = [documents stringByAppendingPathComponent:...];

// "directoryPath" has to be the path to folder with the (main) HTML, not the subfolder of the files. I have a separate folder only for the static files. GCDWebServer will search for the files by it's self - recursive.
[self.server addGETHandlerForBasePath:@"/" directoryPath: documents indexFilename:htmlFile cacheAge:0 allowRangeRequests:YES];

他の GET ハンドラーを追加します。

addHandler...メソッドを使用する必要があります。

[self.server addHandlerForMethod:@"GET" path:@"/status" requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest *request) {

    // ... same implementation as in the question
}];
于 2015-06-22T19:19:34.973 に答える