#javascript #ios #objective-c #cordova #wkwebview
#javascript #iOS #objective-c #кордова #wkwebview
Вопрос:
XCode 10.1
iOS 12.0.1
Я использую функцию wkwebview «evaluateJavaScript» для обратного вызова URL-адреса изображения и позволяю wkwebview отображать это изображение.
Он успешно работает в симуляторе.
Но это сбой в устройстве.
Что в этом плохого?
url-адрес симулятора — хорошая работа:
file:///Users/xxxxxx/Library/Developer/CoreSimulator/Devices/8FB6E110-F30F-425D-9011-A196E78BE7CB/data/Containers/Data/Application/E122A32D-7E21-4EBA-A9E7-BC15E8468A11/Documents/20190409150915.png
url-адрес устройства — сбой:
Не разрешено загружать локальный ресурс: file:///var/mobile/Containers/Data/Application/03F63826-7849-47C3-A6DF-E1EB1113FF0A/Documents/20190408203417.png
NSArray *imagesArray = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"pickerImages"]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"file://%@/",documentsDirectory];
NSString *imagesString = pickerImagesArray.firstObject;
NSString *jscript = @"";
if ([imagesString isEqualToString:@""])
{
jscript = [NSString stringWithFormat:@"getimage_cb('%@')" , @""];
} else {
NSString *output = [NSString stringWithFormat:@"%@%@",filePath,imagesString];
jscript = [NSString stringWithFormat:@"%@", [NSString stringWithFormat:@"getimage_cb('%@')" , output]];
}
[self.myWkwebView evaluateJavaScript:jscript completionHandler:^(id object, NSError * _Nullable error) {
}];
Ответ №1:
На SO по этой конкретной теме есть противоречивые ответы.
Я прочитал, что вы можете напрямую загружать изображение из пакета приложения, но не из его каталога documents.
Одним из возможных обходных путей является загрузка изображения в экземпляр UIImage, преобразование его в base64 и передача его методу evaluateJavascript:
NSArray *imagesArray = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"pickerImages"]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagesString = [pickerImagesArray firstObject];
NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, imagesString];
//Init UIImage Instance
UIImage *uiImageInstance = [[UIImage alloc] initWithContentsOfFile:filePath];
//Get PNG Representation as NSData
NSData *data = UIImagePNGRepresentation(uiImageInstance);
//Convert to Base64
NSString *base64Str = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//Construct the attribute value we'll pass in the javascript
NSString *attribute = [NSString stringWithFormat: @"data:image/png;base64,%@", base64Str];
//Set the image within the webview
[self.myWkwebView evaluateJavascript: [NSString stringWithFormat: @"document.getElementById('img').setAttribute( 'src', %@);", attribute] completionHandler:^(id object, NSError * _Nullable error) {}];