IOS应用程序崩溃-但不在模拟器中-硬编码URL有效
通过xcode成功构建后,该应用程序在模拟器和我的iPhone中运行——当我分发它进行测试时,当测试用户尝试执行搜索时,它崩溃 如果我硬编码URL元素,它在模拟模式下工作,在用户测试中功能完美 我有CrashLytics操作,它说崩溃是这行代码的结果IOS应用程序崩溃-但不在模拟器中-硬编码URL有效,ios,json,swift,Ios,Json,Swift,通过xcode成功构建后,该应用程序在模拟器和我的iPhone中运行——当我分发它进行测试时,当测试用户尝试执行搜索时,它崩溃 如果我硬编码URL元素,它在模拟模式下工作,在用户测试中功能完美 我有CrashLytics操作,它说崩溃是这行代码的结果 let allContactsData = try Data(contentsOf: urlResults!) 我在前面的VC中检查所有字段是否都包含一个值,并且“print”确认了这一点 Company : Accountant Suburb
let allContactsData = try Data(contentsOf: urlResults!)
我在前面的VC中检查所有字段是否都包含一个值,并且“print”确认了这一点
Company : Accountant
Suburb : Southport
State : QLD
Getting results from: http://www.myawsmurl.com.au/api/get_details.php?no=Accountant&state=QLD&suburb=Southport
var通过以下方式设置在类的顶部:
var toSearchFor: String = ""
var toSearchForSuburb: String = ""
var toSearchForState: String = ""
这是导致问题的func:
func getResults() {
toSearchFor = searchingFor.trimmingCharacters(in: .whitespacesAndNewlines)
toSearchForSuburb = searchingSuburb.trimmingCharacters(in: .whitespacesAndNewlines)
toSearchForState = searchingState.trimmingCharacters(in: .whitespacesAndNewlines)
print("Company : \(toSearchFor)")
print("Suburb : \(toSearchForSuburb)")
print("State : \(toSearchForState)")
//toSearchFor = "Accountant"
//toSearchForSuburb = "Southport"
//toSearchForState = "QLD"
//print("Company : \(toSearchFor)")
//print("Suburb : \(toSearchForSuburb)")
//print("State : \(toSearchForState)")
let searchURL = ("http://www.myawsmurl.com.au/api/get_details.php?no=" + toSearchFor + "&state=" + toSearchForState + "&suburb=" + toSearchForSuburb)
let urlResults = URL(string:searchURL)
print("Getting results from: \(searchURL)")
do {
let allContactsData = try Data(contentsOf: urlResults!)
let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : NSArray]
etc etc
}
catch {
}
tableView.reloadData()
}
如前所述,如果我取消对硬编码变量的注释,它将作为例外运行,不会出现问题
任何帮助都将不胜感激,因为我仍然无法理解为什么它在模拟模式下运行时没有任何问题,但在现场测试中失败,即使所有字段都有一个值
编辑:(碰撞数据)
给定行的carsh表示您的
urlResults
不知何故变得为零
在创建url对象之前,请尝试对url字符串进行编码
let toSearchFor = ""
let toSearchForSuburb = ""
let toSearchForState = ""
let searchURL = ("http://www.myawsmurl.com.au/api/get_details.php?no=" + toSearchFor + "&state=" + toSearchForState + "&suburb=" + toSearchForSuburb).addingPercentEncoding(withAllowedCharacters: . urlQueryAllowed)
if let url = searchURL, let urlResults = URL(string:url) {
print("Getting results from: \(url)")
do {
let allContactsData = try Data(contentsOf: urlResults!)
let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : NSArray]
}
catch {
}
}
给定行的carsh表示您的
urlResults
不知何故变得为零
在创建url对象之前,请尝试对url字符串进行编码
let toSearchFor = ""
let toSearchForSuburb = ""
let toSearchForState = ""
let searchURL = ("http://www.myawsmurl.com.au/api/get_details.php?no=" + toSearchFor + "&state=" + toSearchForState + "&suburb=" + toSearchForSuburb).addingPercentEncoding(withAllowedCharacters: . urlQueryAllowed)
if let url = searchURL, let urlResults = URL(string:url) {
print("Getting results from: \(url)")
do {
let allContactsData = try Data(contentsOf: urlResults!)
let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : NSArray]
}
catch {
}
}
urlResults是不安全的代码>,尤其是当您从用户输入构建代码时
if let url = urlResults {
let allContactsData = try Data(contentsOf:url)
// etc
} else {
// log an error for debugging
}
toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
if let url = urlResults {
let allContactsData = try Data(contentsOf:url)
// etc
} else {
// log an error for debugging
}
toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
urlResults是不安全的代码>,尤其是当您从用户输入构建代码时
if let url = urlResults {
let allContactsData = try Data(contentsOf:url)
// etc
} else {
// log an error for debugging
}
toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
if let url = urlResults {
let allContactsData = try Data(contentsOf:url)
// etc
} else {
// log an error for debugging
}
toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
看起来像是线程问题。您可以尝试在主线程上执行代码吗
DispatchQueue.main.async({
let searchURL = ("http://www.myawsmurl.com.au/api/get_details.php?no=" + toSearchFor + "&state=" + toSearchForState + "&suburb=" + toSearchForSuburb)
let urlResults = URL(string:searchURL)
print("Getting results from: \(searchURL)")
do {
let allContactsData = try Data(contentsOf: urlResults!)
let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : NSArray]
etc etc
}
catch {}
self.tableView.reloadData()
})
看起来像是线程问题。您可以尝试在主线程上执行代码吗
DispatchQueue.main.async({
let searchURL = ("http://www.myawsmurl.com.au/api/get_details.php?no=" + toSearchFor + "&state=" + toSearchForState + "&suburb=" + toSearchForSuburb)
let urlResults = URL(string:searchURL)
print("Getting results from: \(searchURL)")
do {
let allContactsData = try Data(contentsOf: urlResults!)
let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : NSArray]
etc etc
}
catch {}
self.tableView.reloadData()
})
您应该添加崩溃日志或确切的崩溃消息。可能某个值为零,请再次使用该值进行测试。该行的carsh表示您的URL结果以某种方式变为零。无论我是硬编码还是动态获取这些值,“searchURL”都是一样的-只有一个有效,而另一个无效。在访问该值时,该值似乎变为零。或者请共享崩溃日志您应该添加崩溃日志或确切的崩溃消息。可能某个值为零,请再次使用该值进行测试该行的carsh表示您的URL结果以某种方式为零无论我是硬编码值还是动态获取值,都是一样的——只有一个有效,另一个无效。似乎值在被访问时为零。或者请大家分享一下log@Dale-您能解释一下为什么控制台输出相同的信息,无论我是硬编码值还是动态获取值。我能理解为什么需要你的代码——但我用自己的输入测试了原始代码的“accounter”、“Southport”和“QLD”——为什么它可以在模拟模式下工作,但不能在外部工作?我们在你的代码中看不到的是searchingforetc的来源。这些内容似乎是用户输入,可能是原因。尽管它们在打印时可能看起来没有问题,但根据编码的不同,它们实际上可能会有所不同。尝试在添加PercentEncoding后打印字符串,这似乎工作得很好-尽管它仍然打印相同的结果-不确定为什么模拟器不模拟可以这么说:s@Dale-您能解释一下为什么控制台输出相同的信息,无论我是硬编码值还是动态获取值。我能理解为什么需要你的代码——但我用自己的输入测试了原始代码的“accounter”、“Southport”和“QLD”——为什么它可以在模拟模式下工作,但不能在外部工作?我们在你的代码中看不到的是searchingforetc的来源。这些内容似乎是用户输入,可能是原因。尽管它们在打印时可能看起来没有问题,但根据编码的不同,它们实际上可能会有所不同。尝试在添加PercentEncoding后打印出字符串,虽然它仍然打印出相同的结果,但不确定为什么模拟器不模拟可以说:s