偶尔读取本地webbarchive文件,返回空WebResourceData



再见,

我在iOS 6.1.3读取webchive文件时遇到了一个问题-偶尔- WebResourceData返回null。

这些是存储在bundle中的已知的良好文件(在TextEdit中创建),并且通常读取良好。只是偶尔,他们不会。

在下面的一个简单测试中,我反复读取3个不同的文件,直到发现一个错误。对于iOS 6.1.3,每次运行测试,我都会在1到200次迭代之间遇到错误。我在不同的设备和模拟器上运行了同样的结果。

    // trying to find out why reading webarchives occasionally
    // returns with empty WebResourceData from known good files.
    //
    - (BOOL) testMe {
        NSMutableDictionary *plist = [[NSMutableDictionary alloc] initWithCapacity:100] ;
        int iteration = 1;
        BOOL  ok = TRUE;
        // keep going until we have an error
        while (ok) {
            NSArray *fileNames = @[@"file1",
                                   @"file2",
                                   @"file3" ];
            // LOOP through the webArchives...
            //
            for (NSString *webarchiveName in fileNames) {
                // get the webarchive template
                //
                NSURL *fileURL = [[NSBundle mainBundle] URLForResource:webarchiveName withExtension:@"webarchive"];
                //
                NSData *plistData = [NSData dataWithContentsOfURL:fileURL];
                NSString *error;
                NSPropertyListFormat format;
                //
                plist = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistData
                                                                              mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                                                                          format:&format
                                                                                errorDescription:&error];
                // check to see if it loaded
                //
                //
                if(!plist){
                    NSLog(@"ERROR: did not load %@", webarchiveName);
                }else{

                    NSData *foundWebResourceData = [[plist objectForKey:@"WebMainResource"] objectForKey:@"WebResourceData"];
                    NSString *foundHTML = [NSString stringWithUTF8String:[foundWebResourceData bytes]];
                    if (foundHTML == NULL) {
                        NSLog(@"      %@ descr = %@", webarchiveName, foundHTML);
                        [errorOutlet setText:[NSString stringWithFormat:@"%@ returned with no content (null) in WebResourceData", webarchiveName]];
                        ok = FALSE;
                    }
                } //---- end of if plist exists
            }  // loop through all 3 files

            [countOutlet setText:[NSString stringWithFormat:@"%d", iteration]];
            ++ iteration;
        }  // keep looping until error
        return ok;
    }  // end of testMe 

错误显示在这两行:

    NSData *foundWebResourceData = [[plist objectForKey:@"WebMainResource"] objectForKey:@"WebResourceData"];
    NSString *foundHTML = [NSString stringWithUTF8String:[foundWebResourceData bytes]];

但不一致。我通过创建一个新的xcode项目来隔离代码,其中这是唯一的活动,而不是显示迭代计数和重新测试按钮。文件总是加载,并且总是有一个WebMainResource和一个WebResourceData键。

一个可能的线索是,如果我插入代码到ViewDidLoad,它运行了更多的迭代,但仍然发现一个空。从按钮动作调用[self testMe]会更快地出错…不知道为什么。

我有点不知所措,希望这不是iOS的bug,而是我错过的一些基本的东西。

你可以尝试使用为读取NSData而设计的NSString初始化器:

NSString *foundHTML = [[NSString alloc] initWithData:foundWebResourceData encoding:NSUTF8StringEncoding];

相关内容

  • 没有找到相关文章