頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


macOSでSCNView→png画像を作成、保存する

SCNViewの表示内容からpng画像を作って保存したかったんだ。なおNSSavePanelは使わない。
散々回り道したけど、こんな感じ。

{
    //(1)
    NSImage *image = [sceneView snapshot];
	
    //(2)
    NSData *imageData = [image TIFFRepresentation];
    NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
    NSDictionary *imageProps = [NSDictionary dictionary];
    imageData = [imageRep representationUsingType:NSPNGFileType properties:imageProps];

    //(3)
    NSFileManager *fm = [NSFileManager defaultManager];
    NSURL *url =[fm homeDirectoryForCurrentUser];
    NSString *path = [url path];
    NSString *pathStr = [path stringByAppendingPathComponent: @"images/screenshot.png"];

    //(4)
    NSError *error = nil;
    if (![imageData writeToFile:pathToDesktop options:NSAtomicWrite error:&error]) {
        NSLog(@"%@",error);
    }
}
(1)まずNSImageオブジェクトを作る。snapshotで一撃。
(2)NSImageオブジェクトからNSDataオブジェクトを作る。調べるといろんなやり方があるみたい。propertiesに渡すのもなくてもいけそう(でもnilだと警告が出る)。
(3)保存先、ファイル名を指定。imagesってフォルダーを作ってそこに入れてる。
(4)保存。ダメならエラー表示。

sandbox設定
↑XcodeのTarget設定のところのApp SandboxをONにしてる場合、保存先が限られてデスクトップなどには保存できない。
{
    NSString *pathToDesktop = [NSString stringWithFormat:@"/Users/%@/Desktop/screenshot.png", NSUserName()];
}
↑保存先にデスクトップを指定すると

Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “screenshot.png” in the folder “Desktop”.

なんてエラーになる。ただしサンドボックスをOFFにしておけばデスクトップにも保存できた。なおNSSavePanelを使えばサンドボックスON/OFF関係なくどこでも保存できるみたい。

macOSのサンドボックスについてもっと勉強せねば。


macOSアプリでSave Asができない

最近、macOSアプリ(リリース目的ではなく自分専用だけど)を作ろうかなと勉強してる。

ざっと調べるとドキュメント・ベース・アプリケーションなるものがあって、それでエディターっぽいのを作るのがHello Worldみたいなもんらしい。知らんけど。

プロジェクトでDoc Base Appにチェック

↑プロジェクトの新規作成時に Create Document-Based Application にチェックすれば必要なクラスのサブクラスとか用意してくれる。

storyboardのviewに Text View を貼り付けてやる。
Documentクラス(NSDocumentのサブクラス、Xcodeが作ってくれてる)にすでにある以下のメソッドに必要な処理を書けば、ファイルの読み込み、保存ができる。

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError;
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError;


ところが、どういうわけか Save as ができない。

storyboardではSave As

↑storyboard上だとSave Asになってるのに、

実行時はDuplicate

↑実行時にはDuplicateになってる。



なんぞや?と調べた結果、アプリのTarget設定のCapabilitiesってところにApp SandboxってのがあってここのFile accessがデフォでRead Onlyになってる。

Read Onlyを変更する

ここをRead/Writeに変えたら期待通りDuplicateじゃなくSave Asになり、処理もできるようになった。そういうことだったのね、、、



macOS Sierra 10.12.6(ええ、まだSierraですねん)
Xcode 9.0.1


  TopPage  



Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad