1

私は単純なプロジェクトに取り組んでいますが、一見簡単な作業で壁にぶつかりました。辞書ルートの 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、または終了通知を使用するだけで、すべてが期待どおりに機能します。

助けようとした人々に感謝します!

4

2 に答える 2

2

あなたが抱えていたのと同じ問題がありましたが、ファイルへのパスを正しく取得していないことが原因だと思います。テストを次のように変更すると、うまくいきました。

   NSDictionary *entitlementDict = [NSDictionary dictionaryWithContentsOfFile:[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"DictionaryTest.plist"]];

ドキュメントから:

+ (id) dictionaryWithContentsOfFile:(NSString *)path

パラメーター

完全または相対パス名。パスで識別されるファイルには、ルート オブジェクトがディクショナリであるプロパティ リストの文字列表現が含まれている必要があります。

戻り値

path の辞書を含む新しい辞書。ファイル エラーがある場合、またはファイルの内容が辞書の無効な表現である場合は nil。

于 2013-01-12T19:34:30.090 に答える
0

もっと興味深い答えだったらいいのにと思いますが、自分が間違っていたことを理解しました。

NSTask を使用してコードサイン ツールを呼び出していますが、基本的なテストでは、plist を NSDictionary にロードする前に完了するまで待つのを忘れていました。終了ハンドラー、waitUntilExit、または終了通知を使用するだけで、すべてが期待どおりに機能します。

助けようとした人々に感謝します!

于 2013-01-13T16:08:37.633 に答える