2015-05-04 2 views
0

Я пытаюсь предварительно загрузить теги изображений из строки html, чтобы загрузить их, когда устройство находится в автономном режиме. В принципе, я удаляю исходный url из всех тегов <img>, очищаю URL, чтобы иметь чистое имя файла, а затем загружайте изображение.Сохранение изображений в Main Bundle, а затем загрузка их в HTML работает на Simulator, но не на реальном устройстве?

__block NSString *imageName = [[NSString alloc]init]; 

//Get the string after HTTP:// 
    NSArray *nohttp = [actualUrl componentsSeparatedByString:@"//"]; 
    imageName = [nohttp objectAtIndex:1]; 

//Clean any /.: 
    imageName = [imageName stringByReplacingOccurrencesOfString:@"/" withString:@""]; 
    imageName = [imageName stringByReplacingOccurrencesOfString:@"." withString:@""]; 
    imageName = [imageName stringByReplacingOccurrencesOfString:@":" withString:@""]; 
//Add .png at the end as we will be saving it as a PNG 
    imageName = [NSString stringWithFormat:@"%@.png", imageName]; 

//change the source url to the new filename of the image so the WebView will load it from the main bundle 
    html = [html stringByReplacingOccurrencesOfString:actualUrl withString:imageName]; 

//save the image to the main bundle 
    NSString *pathString = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle]bundlePath], imageName]; 

//this just checks if the image already exists        
    BOOL test = [[NSFileManager defaultManager] fileExistsAtPath:pathString]; 

    if (!test){ 

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^(void) { 

    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:actualUrl]]; 
    UIImage* image = [[UIImage alloc] initWithData:imageData]; 

                          NSData *imageData2 = UIImagePNGRepresentation(image); 
               [imageData2 writeToFile:pathString atomically:YES]; 


    }); 
} 

Тогда после того, как я загрузить HTML строку в UIWebView, она прекрасно работает на тренажере, но на устройстве изображения просто не загружаются. Зачем?

NSURL *baseUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@",[[NSBundle mainBundle]bundlePath]]]; 


[self.webView loadHTMLString:self.htmlPage baseURL:baseUrl]; 

Любые предложения, мысли? Изображения загружаются на устройстве iOS или имитаторе, но не загружаются в WebView реального устройства. Он отлично работает для симулятора.

+2

Основной комплект не может быть записан на устройствах iOS. Попробуйте сохранить их в каталоге документов – Vig

+0

Спасибо, что и было. –

+0

Я всегда буду следить за тем, чтобы файл был сохранен, NSError * error = nil; , если { NSLog (@ "WriteToFile не удалось:% @", ошибка) ([imageData2 WriteToFile: @ "Foo" атомарно: НЕТ кодирования:: NSASCIIStringEncoding ошибки и ошибки]!); } – Vig

ответ

2

Это правильно.

В iOS пакет приложений доступен только для чтения. Любые попытки сохранить изменения в вашем пакете не будут выполняться на устройстве iOS.

В Mac OS комплект не предназначен только для чтения, но вы все равно должны относиться к нему как к чтению. Изменение пакета приложения - плохая идея. Если пользователь обновляет свое приложение из магазина приложений, восстанавливается из резервной копии и т. Д., То изменения, которые вы сохраняете в комплекте, будут потеряны даже в Mac OS.

Симулятор работает под Mac OS и построен против фреймворков Mac OS и файловой системы Mac.

Существует множество различий между симом и работой на устройстве. Это одно.

Еще один пример: Файловая система iOS всегда с учетом событий. Симулятор, который работает на Mac OS, по умолчанию не чувствителен к регистру. (Mac OS может читать из томов, работающих с разными файловыми системами. Файловая система по умолчанию не чувствительна к регистру, но вы можете настроить ее на чувствительность к регистру.)

Файл «Foo.txt» - это другой файл, файл «foo.txt». Они могут существовать в одном каталоге. Если ваш файл называется «Foo.txt», и вы пытаетесь загрузить его с помощью строки «foo.txt», он не будет работать на устройстве iOS, а работать с Mac OS.

В результате вы всегда должны проверять свои приложения на реальном устройстве. Не предполагайте, что если что-то работает на сим, что это правильно для устройства iOS. А может и не быть.

Смежные вопросы