从远程 plist 访问内容
Accessing contents from a remote plist
在有人将我的问题标记为重复之前,让我告诉你,我已经查看了所有答案,但我找不到解决方案。
所以这是我的问题,
我尝试在应用程序启动后立即使用密钥设置用户默认值,例如服务器名称、服务器端口、UDID、语言包和 erid。
所有这些变量都是在服务器端设置的。
我知道我可以编写一个逻辑来下载该 plist 并访问数据,但在这里,我只能编写一个应用程序,并且服务器因我们拥有的所有不同客户端而异。
因此,当此应用程序从服务器推送到设备时,该 plist 也会被推送。
但是每当我尝试访问内容时,它 returns nil 和应用程序崩溃(这在 objective-c 中使用相同的逻辑工作正常,可能是因为 nil 被占用了作为 objective c).
中的值
我的问题是这怎么可能,因为当配置文件安装在设备中时,应用程序如何在代码中不编写任何逻辑的情况下访问内容。
这是 plist
<?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>CommandUUID</key>
<string>InstallApplication;Collection=302</string>
<key>Command</key>
<dict>
<key>RequestType</key>
<string>InstallApplication</string>
<key>ManifestURL</key>
<string>https://%ServerName%:%ServerPort%/MDM/apprepository/1/appupload/2/2/Manifest.plist</string>
<key>ManagementFlags</key>
<integer>1</integer>
<key>ChangeManagementState</key>
<string>Managed</string>
<key>Configuration</key>
<dict>
<key>ServerName</key>
<string>%ServerName%</string>
<key>ServerPort</key>
<string>%ServerPort%</string>
<key>UDID</key>
<string>%udid%</string>
<key>ErID</key>
<string>%erid%</string>
<key>IsLanguagePackEnabled</key>
<string>%license_pack_enabled%</string>
</dict>
</dict>
提前谢谢你。
编辑:我尝试注册默认值,我尝试使用 DictionaryForKey 而不是 objectForKey,键为 "com.apple.configuration.managed"(两种情况都没有区别),我在 swift 中的代码是
let userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
if let dict = userDefaults.dictionaryForKey(mdmiosagent_Constants.MANAGED_APP_CONFIGURATION) {
NSUserDefaults.standardUserDefaults().registerDefaults(dict)
if let serverName = dict[mdmiosagent_Constants.SERVERNAMEKEY] as? String{
}
if let serverPort = dict[mdmiosagent_Constants.SERVERPORTKEY] as? String{
}
if let UDID = dict[mdmiosagent_Constants.UDIDKEY] as? String{
}
if let languagePack = dict[mdmiosagent_Constants.IS_LANG_PACK_ENABLED] as? String{
}
if let ErID = dict[mdmiosagent_Constants.ERIDKEY] as? String{
}
if let authToken = dict[mdmiosagent_Constants.AUTHTOKENKEY] as? String {
}else {
authToken = ""
}
if let scope = dict[mdmiosagent_Constants.SCOPEKEY] as? String {
} else {
scope = ""
}
}
常量声明为
static let SERVERNAMEKEY = "ServerName"
static let SERVERPORTKEY = "ServerPort"
static let ERIDKEY = "ErID"
static let UDIDKEY = "UDID"
static let AUTHTOKENKEY = "authtoken"
static let SCOPEKEY = "SCOPE"
static let MANAGED_APP_CONFIGURATION = "com.apple.configuration.managed"
static let IS_LANG_PACK_ENABLED = "IsLanguagePackEnabled"
查看您的代码,我没有在任何地方看到寄存器。我不能保证什么,但我至少会尝试改变:
let userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
至:
let userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
NSUserDefaults.standardUserDefaults().registerDefaults(userDefaults)
您还需要测试以确保您已正确加载它:
if let path = NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
, defaults = NSDictionary(contentsOfFile:path) as? [String : AnyObject] {
NSUserDefaults.standardUserDefaults().registerDefaults(defaults)
好吧,我尝试将用于存储默认值的字典初始化为 NSDictionary 而不是 [String: AnyObject] 并且成功了!!哇,没想到会是这个原因。谢谢大家提供建议。
在有人将我的问题标记为重复之前,让我告诉你,我已经查看了所有答案,但我找不到解决方案。
所以这是我的问题,
我尝试在应用程序启动后立即使用密钥设置用户默认值,例如服务器名称、服务器端口、UDID、语言包和 erid。
所有这些变量都是在服务器端设置的。
我知道我可以编写一个逻辑来下载该 plist 并访问数据,但在这里,我只能编写一个应用程序,并且服务器因我们拥有的所有不同客户端而异。
因此,当此应用程序从服务器推送到设备时,该 plist 也会被推送。
但是每当我尝试访问内容时,它 returns nil 和应用程序崩溃(这在 objective-c 中使用相同的逻辑工作正常,可能是因为 nil 被占用了作为 objective c).
中的值我的问题是这怎么可能,因为当配置文件安装在设备中时,应用程序如何在代码中不编写任何逻辑的情况下访问内容。
这是 plist
<?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>CommandUUID</key>
<string>InstallApplication;Collection=302</string>
<key>Command</key>
<dict>
<key>RequestType</key>
<string>InstallApplication</string>
<key>ManifestURL</key>
<string>https://%ServerName%:%ServerPort%/MDM/apprepository/1/appupload/2/2/Manifest.plist</string>
<key>ManagementFlags</key>
<integer>1</integer>
<key>ChangeManagementState</key>
<string>Managed</string>
<key>Configuration</key>
<dict>
<key>ServerName</key>
<string>%ServerName%</string>
<key>ServerPort</key>
<string>%ServerPort%</string>
<key>UDID</key>
<string>%udid%</string>
<key>ErID</key>
<string>%erid%</string>
<key>IsLanguagePackEnabled</key>
<string>%license_pack_enabled%</string>
</dict>
</dict>
提前谢谢你。
编辑:我尝试注册默认值,我尝试使用 DictionaryForKey 而不是 objectForKey,键为 "com.apple.configuration.managed"(两种情况都没有区别),我在 swift 中的代码是
let userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
if let dict = userDefaults.dictionaryForKey(mdmiosagent_Constants.MANAGED_APP_CONFIGURATION) {
NSUserDefaults.standardUserDefaults().registerDefaults(dict)
if let serverName = dict[mdmiosagent_Constants.SERVERNAMEKEY] as? String{
}
if let serverPort = dict[mdmiosagent_Constants.SERVERPORTKEY] as? String{
}
if let UDID = dict[mdmiosagent_Constants.UDIDKEY] as? String{
}
if let languagePack = dict[mdmiosagent_Constants.IS_LANG_PACK_ENABLED] as? String{
}
if let ErID = dict[mdmiosagent_Constants.ERIDKEY] as? String{
}
if let authToken = dict[mdmiosagent_Constants.AUTHTOKENKEY] as? String {
}else {
authToken = ""
}
if let scope = dict[mdmiosagent_Constants.SCOPEKEY] as? String {
} else {
scope = ""
}
}
常量声明为
static let SERVERNAMEKEY = "ServerName"
static let SERVERPORTKEY = "ServerPort"
static let ERIDKEY = "ErID"
static let UDIDKEY = "UDID"
static let AUTHTOKENKEY = "authtoken"
static let SCOPEKEY = "SCOPE"
static let MANAGED_APP_CONFIGURATION = "com.apple.configuration.managed"
static let IS_LANG_PACK_ENABLED = "IsLanguagePackEnabled"
查看您的代码,我没有在任何地方看到寄存器。我不能保证什么,但我至少会尝试改变:
let userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
至:
let userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()
NSUserDefaults.standardUserDefaults().registerDefaults(userDefaults)
您还需要测试以确保您已正确加载它:
if let path = NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
, defaults = NSDictionary(contentsOfFile:path) as? [String : AnyObject] {
NSUserDefaults.standardUserDefaults().registerDefaults(defaults)
好吧,我尝试将用于存储默认值的字典初始化为 NSDictionary 而不是 [String: AnyObject] 并且成功了!!哇,没想到会是这个原因。谢谢大家提供建议。