将自定义密钥添加到 info.plist,当我从 Swift 中的游乐场访问时,它是零
added custom key to info.plist, when I access from playground in Swift, it is nil
使用 Xcode 7.2(在 Yosemite 上),我似乎无法从操场上的 info.plist 访问自定义密钥:
import UIKit
var str = "Hello, playground"
let app_id = NSBundle.mainBundle().infoDictionary?["MyAppID"] as? String
使用上面的代码,app_id 为零。我希望它是字符串 "TEST"
我像这样将它包含在我的 info.plist 中:
游乐场是否有一些我没听说过的限制?
如果我打印所有密钥,我的自定义密钥丢失了:
let dict = NSBundle.mainBundle().infoDictionary!
for k in dict.keys {
print("\(k)")
}
打印以下内容:
DTSDKName
CFBundleIdentifier
CFBundleSupportedPlatforms
CFBundleInfoDictionaryVersion
LSRequiresIPhoneOS
CFBundleNumericVersion
DTPlatformName
CFBundleShortVersionString
CFBundleVersion
UIViewControllerBasedStatusBarAppearance
UIRequiredDeviceCapabilities
UIStatusBarHidden
CFBundlePackageType
UIDeviceFamily
CFBundleExecutable
CFBundleInfoPlistURL
LSBackgroundOnly
CFBundleName
CFBundleDevelopmentRegion
如果我查看 Bundle 名称,如下所示:
let name = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as? String
我看到的是我的 playground 的名称,而不是工作区的名称。我可以得到项目的 info.plist 吗?
Playgrounds 没有 Info.plist
文件。游乐场 self-contained。将它们添加到项目中不会导致它们访问项目中的文件。他们只能访问自己包中的文件。
您可以将 plist 文件作为资源添加到 playground 并以这种方式读取(使用 pathForResource
和 NSDictionary(contentsOfFile:)
,但不能在其上使用 objectForInfoDictionaryKey
。您不能将其命名为 "Info.plist",因为这会与 auto-genenerated Info.plist 操场用于 运行.
发生冲突
例如,如果您将一个 plist 复制到您的 Resources 文件夹中,将其命名为 MyInfo.plist
,然后加载它:
let infoPath = NSBundle.mainBundle().pathForResource("MyInfo.plist", ofType: nil)!
let info = NSDictionary(contentsOfFile: infoPath)!
这与真实的 Info.plist 不完全相同,因为 $(EXECUTABLE_NAME)
之类的内容不会展开。
但这里的要点是 playgrounds 在它们自己的包中,与应用程序无关,它们在 运行 时动态创建自己的 Info.plist。您在此处尝试执行的操作与游乐场当前的工作方式不符。
理解所有这些的一个关键部分是游乐场是真实的应用程序。它们被编译并构建成一个可执行文件,它有自己的包,安装在构建目录中。检查 NSBundle.mainBundle().bundlePath
以查看位置。当 playground 是 运行ning 时,它不知道它的源代码来自哪里,更不用说它可能所在的一些更大的目录结构了。甚至 __FILE__
宏也被丢弃了(它 returns <EXPR>
).
我希望他们将来会对此进行改进,因为目前有很多这样的东西使得它们很难用来探索现有的代码库。他们真的是为了探索 self-contained Swift 的一小部分。我经常发现自己构建小型命令行应用程序而不是游乐场。对于 non-UI 工作,命令行应用程序可以更强大。
使用 Xcode 7.2(在 Yosemite 上),我似乎无法从操场上的 info.plist 访问自定义密钥:
import UIKit
var str = "Hello, playground"
let app_id = NSBundle.mainBundle().infoDictionary?["MyAppID"] as? String
使用上面的代码,app_id 为零。我希望它是字符串 "TEST"
我像这样将它包含在我的 info.plist 中:
游乐场是否有一些我没听说过的限制?
如果我打印所有密钥,我的自定义密钥丢失了:
let dict = NSBundle.mainBundle().infoDictionary!
for k in dict.keys {
print("\(k)")
}
打印以下内容:
DTSDKName
CFBundleIdentifier
CFBundleSupportedPlatforms
CFBundleInfoDictionaryVersion
LSRequiresIPhoneOS
CFBundleNumericVersion
DTPlatformName
CFBundleShortVersionString
CFBundleVersion
UIViewControllerBasedStatusBarAppearance
UIRequiredDeviceCapabilities
UIStatusBarHidden
CFBundlePackageType
UIDeviceFamily
CFBundleExecutable
CFBundleInfoPlistURL
LSBackgroundOnly
CFBundleName
CFBundleDevelopmentRegion
如果我查看 Bundle 名称,如下所示:
let name = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as? String
我看到的是我的 playground 的名称,而不是工作区的名称。我可以得到项目的 info.plist 吗?
Playgrounds 没有 Info.plist
文件。游乐场 self-contained。将它们添加到项目中不会导致它们访问项目中的文件。他们只能访问自己包中的文件。
您可以将 plist 文件作为资源添加到 playground 并以这种方式读取(使用 pathForResource
和 NSDictionary(contentsOfFile:)
,但不能在其上使用 objectForInfoDictionaryKey
。您不能将其命名为 "Info.plist",因为这会与 auto-genenerated Info.plist 操场用于 运行.
例如,如果您将一个 plist 复制到您的 Resources 文件夹中,将其命名为 MyInfo.plist
,然后加载它:
let infoPath = NSBundle.mainBundle().pathForResource("MyInfo.plist", ofType: nil)!
let info = NSDictionary(contentsOfFile: infoPath)!
这与真实的 Info.plist 不完全相同,因为 $(EXECUTABLE_NAME)
之类的内容不会展开。
但这里的要点是 playgrounds 在它们自己的包中,与应用程序无关,它们在 运行 时动态创建自己的 Info.plist。您在此处尝试执行的操作与游乐场当前的工作方式不符。
理解所有这些的一个关键部分是游乐场是真实的应用程序。它们被编译并构建成一个可执行文件,它有自己的包,安装在构建目录中。检查 NSBundle.mainBundle().bundlePath
以查看位置。当 playground 是 运行ning 时,它不知道它的源代码来自哪里,更不用说它可能所在的一些更大的目录结构了。甚至 __FILE__
宏也被丢弃了(它 returns <EXPR>
).
我希望他们将来会对此进行改进,因为目前有很多这样的东西使得它们很难用来探索现有的代码库。他们真的是为了探索 self-contained Swift 的一小部分。我经常发现自己构建小型命令行应用程序而不是游乐场。对于 non-UI 工作,命令行应用程序可以更强大。