[目的]
iOS端末にネットワークからダウンロードするmp4などのビデオをカメラロールに突っ込みたい。
[環境]
- Objective-C
- Xcode 9.3.2
- iOS 11.4
[やり方]
端末のローカルパスにダウンロードしたバイナリをwriteToFileして、そのパスをPhotosライブラリ使って書き込むことでビデオを端末取り込む。
[サンプル]
DownloadExample.m
//Library
# import <Foundation/Foundation.h>
# import <AFNetworking/AFNetworking.h>
# import <Photos/Photos.h>
//Model
# import "DownloadTaskModel.h"
@interface DownloadTaskModel()
@end
@implementation DownloadTaskModel
- (void)DownloadWithUrlValue:(NSString *)urlValue
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer.timeoutInterval = 10;
manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[manager POST:urlValue //URLを入力する
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
// responseを変換
NSData *binaryData = [[NSData alloc] initWithData:responseObject];
if (binaryData)
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *localFilePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"tmpName.mp4"];
dispatch_async(dispatch_get_main_queue(), ^{
[binaryData writeToFile:localFilePath atomically:YES];
PHPhotoLibrary *library = [PHPhotoLibrary sharedPhotoLibrary];
[library performChanges:^{
[PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL: [[NSURL alloc] initWithString:localFilePath]];
}
completionHandler:^(BOOL success, NSError * _Nullable error)
{
if (success)
{
dispatch_async(dispatch_get_main_queue(), ^{
//完了時なんらかのUIを追加
});
}
}];
});
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
}];
}
@end
カメラロールにアクセスするため、Info.plistに以下追加を忘れずに。
あとhttpアクセスする場合はATSを無効に。必要に応じて。
Info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSCameraUsageDescription</key>
<string>カメラにアクセスします。</string>
[特記事項]
同じソースコードをSwiftで書いても失敗する。