NSUserDefaults

サンプル

AppDelegate.m
@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; // 取得
    [ud setObject:@"hoge" forKey:@"KEY_S"];
    [ud synchronize];
}

 

参考:https://glassonion.hatenablog.com/entry/20110920/1316473990

保存場所

Non SandBox: /Users/ユーザ名/Library/Preferences

SandBox: /Users/ユーザ名/Library/Containers/アプリ名/Data/Library/Preferences/

なのだそうだが、デバッグ時にそれらしいファイルはなかったな???

→registerDefaults メソッドはファイルに書き出しません!

しかし、standard と shared の違いがわからんなあ。

→shared は文字どおり「共有」ということらしい。
何と共有するかは、この記事によれば、同じグループ間で、ということらしいのだが、使ったことはない。

 

NSOutlineViewDelegate プロトコル

NSOutlineView 関連のプロトコルでは、DataSource の方は存在感があるが Delegate の影は薄い。

まあ、DataSource の方はないと表示すらできないわけだが…。

試しに

@interface OutlineviewManager : NSObject<NSOutlineViewDataSource>

@interface OutlineviewManager : NSObject<NSOutlineViewDataSource, NSOutlineViewDelegate>

としてもコンパイル自体はできる。

行選択時の機能

公式ページを見るに、行選択をした時のメソッドを供給しているようです。

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item;

のメソッドは、公式の説明だと item が選択できるかどうかを定義するもののように紹介されていますが、おそらく機能も提供できます。
OutlineView に Person クラス(のインスタンス)を表示させているとき

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item
{
Person *p = item;
NSLog(@"%@", p.name);

return YES;
}

を実装しておくと name プロパティの値(文字列)を表示してくれます。

 

cocoa プログラミング

今まで延々 GUI なしの Objective-C の記事書いてきたが、ここらで GUI つまり cocoa の話もちらほら。

Q&A 形式で。

Q Xcode 上で GUI 部品をどう出せばいいかわからない。

A 右上の + ボタンを押下する。

すると検索画面が出現するので、検索窓から button だの view だの打ち込んでパーツ選ぶ。

なお、View 関係で View 自体の大きさをウィンドウのリサイズに追従させたいときは、Autoresize 使う。

 

(続く)

Mac アプリインストーラー .pkg の作り方

あまり作る機会がないのだが、Mac アプリ用のインストーラーとして pkg 形式というものがある。

アプリそのものの場合、公証を受けなくてもユーザーが右クリック→「開く」でインストさせることはできるが、インストーラーの場合、デフォルトでは

オーナー root :グループ wheel

でインストされるせいか、この辺はキビしく、公証を受けていないと

このパッケージは、このバージョンの macOS と互換性がありません

という無慈悲なアラートとともにインスト自体がストップしてしまう。

だから、配布したい場合、公証まで受ける必要がある。

で、pkg 形式のファイルの作り方だが、現在だと『Mac用installerの作り方』 がまとまっているようだ。
ただ、この記事、.app が前提となっていて、コマンドラインツールでは全く通用しない。
説明も、もっぱら手順のみでコマンドの意味もまったく解説されておらず、ある程度のスキルを持った人はイライラすると思う。

コマンドラインツールの公証

追記の記事が一番確実。(ワイも Xcode 上で実行できないか試したが、記事のようにコマンドラインからビルドするのが確実なようです。しかし –timestamp というフラグは言われないと気が付かない)

だが、その他のコマンドがいささか古いのでアップデート。

まず、XXX.plist をつくる。

pkgbuild --analyze --root build/pkgroot hoge.plist

中身を見るとわかりますが、コマンドラインツールの場合、hoge.plist はほぼ何の有益な情報も記入されてないです。次のコマンドのために形式的に必要なのでは?と思います。

次はこれを使って .pkg を作成。

pkgbuild --root build/pkgroot --component-plist hoge.plist --scripts scriptDir --identifier id --version version --install-location "/" hoge.pkg

お次は hoge.pkg に(インストーラーの方の)署名。

productsign --sign "Developer ID Installer: team name" "hoge.pkg" "hoge2.pkg"

この時点でも公証は受けられる。
この時の password は apple ID 本体のやつではなくて、サードパーティアプリの二段階認証用のものを使う。
ない場合は(ほとんどの場合、ないと思うが)、appleID のページに行って作成。

xcrun notarytool submit hoge2.pkg --apple-id "hoge@hoge.com" --password 1234-5678-abcd-efgh --team-id 1234ABCD --wait

それほど大きくないソフトであれば数分で以下のメッセージが返ってきます。

Processing complete
  id: 1234678-abcd-4f44-86ae-792c54d13965
  status: Accepted

その他事項はまずはこの確認やってからでいいと思う。
ネットに落ちている情報は古いことが多く(この記事だっていつかは陳腐化するでしょう)、一回で決まることはまずないと思うので。


追記:英語になるがこの記事 や この記事(こちらは日本語)なども参考に。