LoginSignup
2
1

More than 5 years have passed since last update.

【iOS】【Objective-C】.mp4などのバイナリデータをHTTP getでカメラロールに突っ込みたい

Posted at

[目的]

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で書いても失敗する。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1