1

我正在做一个简单的项目,但我遇到了一个看似简单的任务。将基于字典的 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 或终止通知,那么一切都会按预期工作。

非常感谢那些试图提供帮助的人!

4

2 回答 2

2

遇到了同样的问题,我认为这是因为您没有正确获取文件的路径。当我将测试更改为执行以下操作时,它起作用了。

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

从文档:

+ (id) dictionaryWithContentsOfFile:(NSString *)path

参数

小路

完整或相对路径名。由路径标识的文件必须包含其根对象是字典的属性列表的字符串表示形式。

返回值

一个新字典,包含路径中的字典,如果存在文件错误或文件的内容是字典的无效表示,则返回 nil。

于 2013-01-12T19:34:30.090 回答
0

我弄清楚我做错了什么,尽管我希望这是一个更有趣的答案。

我正在使用 NSTask 调用代码设计工具,但在我的基本测试中,我忘记等到它完成后再尝试将 plist 加载到我的 NSDictionary 中。如果我只使用终止处理程序或 waitUntilExit 或终止通知,那么一切都会按预期工作。

非常感谢那些试图提供帮助的人!

于 2013-01-13T16:08:37.633 回答