iOS 13圖片上傳相關適配

1.PHImageManager問題

PHAsset *phAsset = asset;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
//ptions.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
//是保證 resultHandler 值回調一次,否則可能回回調多次,只有最後一次返回的圖片大小等於設置的 targetSize
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.resizeMode = PHImageRequestOptionsResizeModeExact;
options.synchronous = YES;
options.networkAccessAllowed = YES;
CGSize imageSize = [UIImage getImageSizeWithAsset:phAsset];
[[PHImageManager defaultManager] requestImageForAsset:phAsset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *result, NSDictionary *info) {
    NSMutableData *imageData = [UIImage writeMetaDataWithData:result asset:phAsset];
    [imageData writeToFile:imagePath atomically:YES];
    [[UIImage getSmallImageWithImage:result] writeToFile:smallImagePath atomically:YES];
}];

常規使用情況下deliveryMode 使用PHImageRequestOptionsDeliveryModeFastFormat 在iOS 13時候調用requestImageForAsset會出現result是一張小圖(縮略圖)

可以通過修改成PHImageRequestOptionsDeliveryModeHighQualityFormat返回設置targetSize對應的圖片

這個坑找了很多資料才找到(iOS小菜鳥就這樣)

2.CGImageDestinationAddImageFromSource問題

+ (NSMutableData *)writeMetaDataWithData:(NSMutableData *)imageData metaDataDic:(NSDictionary *)metaDataDic {
    NSMutableData *mutableData = [NSMutableData data];
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
    CGImageDestinationRef destination = CGImageDestinationCreateWithData(
        (__bridge CFMutableDataRef)mutableData, CGImageSourceGetType(cgImage), 1, nil);
    CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metaDataDic);
    CGImageDestinationFinalize(destination);
    CFRelease(source);
    CFRelease(destination);
    return mutableData;
    
//    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
//    CFStringRef UTI = CGImageSourceGetType(source);
//    CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)imageData, UTI, 1, NULL);
//    CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metaDataDic);
//    CGImageDestinationFinalize(destination);
//    return imageData;
}

上面的方法使用註釋的代碼,在iOS 13上面會導致imageData 被清空爲0byte,然後使用新創建一個NSMutableData 卻沒有這個問題,不知道是啥情況,有知道的iOS大佬可以留言,求告知一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章