Ответ 1
Это неприятная проблема с SDK iOS. Во-первых, я рекомендую подать запрос .
Теперь вот потенциальное обходное решение: если ALAsset был создан вами (т.е. его свойство editable
- YES
), тогда вы можете в основном читать данные, писать с помощью метаданных, читать снова, сохранять на диск, а затем напишите исходные метаданные.
Этот подход позволит избежать дублирования изображения.
Прочитайте//комментарии, поскольку я кратко пропустил некоторые вещи (например, создание словаря метаданных):
ALAsset* asset; //get your asset, don't use this empty one
if (asset.editable) {
// get the source data
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc(rep.size);
// add error checking here
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *sourceData = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
// make your metadata whatever you want
// you should use actual metadata, not a blank dictionary
NSDictionary *metadataDictionary = [NSDictionary dictionary];
// these are __weak to avoid creating an ARC retain cycle
NSData __weak *originalData = sourceData;
NSDictionary __weak *originalMetadata = [rep metadata];
[asset setImageData:sourceData
metadata:metadataDictionary
completionBlock:^(NSURL *assetURL, NSError *error) {
//now get your data and write it to file
if (!error) {
//get your data...
NSString *assetPath = [assetURL path];
NSData *targetData = [[NSFileManager defaultManager] contentsAtPath:assetPath];
//...write to file...
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [searchPaths lastObject];
NSURL *fileURL = [NSURL fileURLWithPath:documentPath];
[targetData writeToURL:fileURL atomically:YES];
//...and put it back the way it was
[asset setImageData:originalData metadata:originalMetadata completionBlock:nil];
} else {
// handle error on setting data
NSLog(@"ERROR: %@", [error localizedDescription]);
}
}];
} else {
// you'll need to make a new ALAsset which you have permission to edit and then try again
}
Как вы можете видеть, если ALAsset не принадлежит вам, вам нужно будет создать его, который добавит фотографию в пользовательскую библиотеку, чего именно вы хотели избежать. Однако, как вы, возможно, догадались, вы не можете удалить ALAsset из библиотеки фотографий пользователя, даже если ваше приложение создало его. (Не стесняйтесь записать еще один запрос на повышение.)
Итак, если фото/изображение было создано в вашем приложении, это будет работать для вас.
Но если нет, он создаст дополнительную копию, которую пользователь должен удалить.
Единственная альтернатива - это самостоятельно проанализировать NSData, что будет больно. Нет никакой библиотеки с открытым исходным кодом, о которой я знаю, чтобы заполнить этот пробел в SDK iOS.