しばらく更新していなかったiOSアプリを久しぶりに開発しています。
メールで、アプリで保存したファイルを取り出せないのかという質問/要望を何通かもらっていたので、iCloudにエクスポートできるようにしました。
実装方法をメモっておきます。
共通
ViewController.h
ViewController にUIDocumentPickerDelegateデリゲートを追加する。
@interface ViewController : UIViewController<UIDocumentPickerDelegate>
エクスポートする
ViewController.m
エクスポートをしたい任意の箇所に記述する。
NSURL *url = [[NSURL alloc] initFileURLWithPath:filePath]; UIDocumentPickerViewController *picker = [[UIDocumentPickerViewController alloc] initWithURL:url inMode:UIDocumentPickerModeExportToService]; picker.delegate = self; [self presentViewController:picker animated:YES completion:nil];
エクスポート完了後の処理は、documentPickerメソッドに記述する。
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url { if (controller.documentPickerMode == UIDocumentPickerModeExportToService) { NSLog(@"Exported"); } }
インポート
インポートをしたい任意の箇所に記述する。
UIDocumentPickerViewController *picker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[(NSString *)kUTTypeAudio] inMode:UIDocumentPickerModeImport]; picker.delegate = self; [self presentViewController:picker animated:YES completion:nil];
ファイルタイプには、kUTTypeAudioを指定しているが、用途に合わせて他のファイルタイプに変更する。
kUTTypeAudioは、MobileCoreServices.hに定義されているため、必要に応じてincludeする。
#import <MobileCoreServices/MobileCoreServices.h>
インポート完了後の処理は、documentPickerメソッドに記述する。
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url { if (controller.documentPickerMode == UIDocumentPickerModeImport) { // ファイルコピー NSString *filename = url.lastPathComponent; NSString *filePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:filename]; NSError *err = [[NSError alloc] init]; BOOL result = [[NSFileManager defaultManager] copyItemAtPath:url.path toPath:filePath error:&err]; if (result) { NSLog(@"Imported"); } else { NSLog(@"Import failed. %@", err.localizedDescription); } } }
インポートしたファイルがテンポラリディレクトリにコピーされるので、Documentsディレクトリにファイルをコピーしている。
エクスポートとインポートの両方を行う場合は、documentPickerメソッドで、controller.documentPickerModeによって条件分けをすればよい。