我正在做一个简单的项目,但我遇到了一个看似简单的任务。将基于字典的 plist 加载到 NSDirectory 中。这是我以前做过很多次的事情,所以我对为什么我现在被卡住有点困惑。
我正在尝试读取我在 OS X 上使用 codesign 工具创建的 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];
但是会发生什么,它拒绝加载任何内容,我的内容为零:
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 或终止通知,那么一切都会按预期工作。
非常感谢那些试图提供帮助的人!