TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

【iOS開発】iCloudにエクスポート/インポートする

しばらく更新していなかった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によって条件分けをすればよい。

余談

最新のiPad miniデバッグしようとしたらXcodeのバージョンアップが必要で、XcodeをバージョンするにはOSのバージョンアップが必要で、開発環境を整えるのに一苦労でした。
Objective-cも結構忘れていたので、思い出すのに一苦労。

いまさらですが、新しいXcodeでは、automatically manages signingという機能が追加されていて、あのめんどくさい証明書の更新が自動になっていて感動しました。