私は単純なプロジェクトに取り組んでいますが、一見簡単な作業で壁にぶつかりました。辞書ルートの plist を NSDirectory にロードします。これは私が以前に何度もやったことがあるので、なぜ私が現在立ち往生しているのかについて少し困惑しています.
OS X のコードサイン ツールで作成した plist を読み込もうとしています。使用しているそのツールを呼び出すと、アプリの資格がファイルにダンプされます。Safari の場合は、次のようになります。
codesign --display --entitlements :<path to plist> /Applications/Safari.app
これにより、指定したパスに通常の XML plist が生成されます。ファイルの先頭に魔法のバイナリ BLOB が挿入されないように、コロン プレフィックスが必要です。生成された plist の完全な XML は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.private.accounts.allaccounts</key>
<true/>
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>com.apple.Safari.SyncedTabs</string>
<key>com.apple.private.tcc.allow</key>
<array>
<string>kTCCServiceAddressBook</string>
</array>
</dict>
</plist>
シンプルですよね?だから今、これをNSDictionaryにロードしたいだけです。私は単に通常の方法でそれをロードしようとします:
NSDictionary *entitlementDict = [NSDictionary dictionaryWithContentsOfFile:tempFile];
ただし、何もロードすることを拒否し、内容に nil が返されるということです:
Printing description of entitlementDict:
<nil>
(lldb)
ここで明らかな何かが欠けているように感じます。NSDictionary の読み込みメソッドは、すべてのコンテンツが plist-objects である場合にのみ機能することを知っていますが、そうであるように見え、Xcode と QuickLook はファイルのコンテンツを喜んで表示します。さらに、plutil は構文が正しいことを検証します。
何か案は?ありがとう。
アップデート:
これまでに回答してくれた人々に感謝します。詳細については、適切なフル パスを使用しています。
デバッガーから:
Printing description of tempFile:
/var/folders/yk/kvvzp89x03v896rqx4mc9rqw0000gq/T/FFF82FDD-0A01-4139-9719-00B447B2F907-60198-000284518B41D04F/BC54EEC8-5A0B-49FD-9BFD-44B7FFB29B73.plist
そしてターミナルから:
FatMan:~ macshome$ file /var/folders/yk/kvvzp89x03v896rqx4mc9rqw0000gq/T/FFF82FDD-0A01-4139-9719-00B447B2F907-60198-000284518B41D04F/BC54EEC8-5A0B-49FD-9BFD-44B7FFB29B73.plist
/var/folders/yk/kvvzp89x03v896rqx4mc9rqw0000gq/T/FFF82FDD-0A01-4139-9719-00B447B2F907-60198-000284518B41D04F/BC54EEC8-5A0B-49FD-9BFD-44B7FFB29B73.plist: XML document text
と:
FatMan:~ macshome$ ls -l /var/folders/yk/kvvzp89x03v896rqx4mc9rqw0000gq/T/FFF82FDD-0A01-4139-9719-00B447B2F907-60198-000284518B41D04F/BC54EEC8-5A0B-49FD-9BFD-44B7FFB29B73.plist
-rw-r--r-- 1 macshome staff 455 Jan 12 15:13 /var/folders/yk/kvvzp89x03v896rqx4mc9rqw0000gq/T/FFF82FDD-0A01-4139-9719-00B447B2F907-60198-000284518B41D04F/BC54EEC8-5A0B-49FD-9BFD-44B7FFB29B73.plist
一時パスを生成するコードを投稿できますが、それほど重要ではないと思います。短いパスでテストしてみるかもしれませんが、それもあまり重要ではないと思います。これは、一時ファイルを生成する非常に一般的な方法です。
最終更新: もっと興味深い答えだったらいいのにと思いますが、自分が間違っていたことを理解しました。
NSTask を使用してコードサイン ツールを呼び出していますが、基本的なテストでは、plist を NSDictionary にロードする前に完了するまで待つのを忘れていました。終了ハンドラー、waitUntilExit、または終了通知を使用するだけで、すべてが期待どおりに機能します。
助けようとした人々に感謝します!