0

[myWebView loadHTMLString:htmlString baseURL:documentsDirectoryURL]HTMLのローカルNSStringとアプリのDocumentsディレクトリ内のディレクトリのbaseURLを使用してUIWebViewをロードしています。

問題は、HTMLに<img>上記のディレクトリからロードされた画像のタグが含まれていることです。画像を含むDocumentsディレクトリのディレクトリの代わりに、アプリバンドルに含まれる画像へのシンボリックリンクが含まれています。

UIWebViewが最初の起動時にロードされると、画像のロードに失敗し、標準のSafariの青い疑問符が表示されます。その後、アプリを終了し、UIWebViewを再起動して再度ロードすると、画像が正常にロードされます。

他の誰かがこの問題を抱えていましたか?

シンボリックリンクは次のように作成されます。

- (void)createSymbolicLinksForURL:(NSURL *)url inDirectory:(NSURL *)directory {

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtURL:url
                                       includingPropertiesForKeys:[NSArray arrayWithObject:NSURLIsDirectoryKey] 
                                                          options:NSDirectoryEnumerationSkipsHiddenFiles | NSDirectoryEnumerationSkipsPackageDescendants
                                                     errorHandler:nil];

    NSArray *resourceKeys = [NSArray arrayWithObjects:NSURLIsSymbolicLinkKey, NSURLIsDirectoryKey, nil];

    for (NSURL *bundledURL in dirEnum) {

        if ([[[bundledURL resourceValuesForKeys:resourceKeys error:nil] objectForKey:NSURLIsDirectoryKey] boolValue]) continue;

        NSArray *bundledURLPathComponents = [bundledURL pathComponents];

        NSURL *destinationURL = directory;

        for (NSUInteger componentIndex = [bundledURLPathComponents count] - dirEnum.level; componentIndex < [bundledURLPathComponents count]; componentIndex++) {

            destinationURL = [destinationURL URLByAppendingPathComponent:[bundledURLPathComponents objectAtIndex:componentIndex]];
        }

        if ([fileManager fileExistsAtPath:destinationURL.path]) {

            if ([[[destinationURL resourceValuesForKeys:resourceKeys error:nil] objectForKey:NSURLIsSymbolicLinkKey] boolValue]) {

                [fileManager removeItemAtURL:destinationURL error:nil];
            }
            else {

                continue;
            }
        }

        NSURL *container = [destinationURL URLByDeletingLastPathComponent];
        if (![fileManager fileExistsAtPath:container.path]) [fileManager createDirectoryAtURL:container withIntermediateDirectories:YES attributes:nil error:nil];

        NSError *error = nil;
        [fileManager createSymbolicLinkAtURL:destinationURL withDestinationURL:bundledURL error:&error];
        if (error) NSLog(@"Failed to create symbolic link for %@ (Error: %@)", bundledURL, error);
    }
}

UIWebViewによってロードされるHTML文字列は次のようになります(これは単なるスニペットです)。

<img src="images/thumb.jpg">
<img src="images/thumb1.jpg">
<img src="images/thumb2.jpg">

最初の起動時にこれが発生します:

最初の打ち上げ

...そしてこれ以降の起動時:

その後の打ち上げ

4

1 に答える 1

2

シンボリックリンクをDocumentsディレクトリのルートに移動し、<img>タグを短縮して<img src="thumb.jpg">、たとえば、最初の起動時に読み込まれた画像の問題を修正したようです。

ドキュメントディレクトリ内のディレクトリにリソースをグループ化する必要があったため、これでは十分な解決策ではありませんでした。そこで、代わりに<img>タグを拡張して、シンボリックリンクへの絶対URLを含めてみました。例(シミュレーターで実行している場合):

<img src="file://localhost/Users/adam/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/677CFABC-D16A-42C8-8F08-6FF415522FB6/Documents/images/thumb.jpg">

..そしてそれは動作します!

ヒントをくれたSPVarmaに感謝します!

于 2012-08-23T12:13:36.050 に答える