Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS应用程序崩溃-但不在模拟器中-硬编码URL有效_Ios_Json_Swift - Fatal编程技术网

IOS应用程序崩溃-但不在模拟器中-硬编码URL有效

IOS应用程序崩溃-但不在模拟器中-硬编码URL有效,ios,json,swift,Ios,Json,Swift,通过xcode成功构建后,该应用程序在模拟器和我的iPhone中运行——当我分发它进行测试时,当测试用户尝试执行搜索时,它崩溃 如果我硬编码URL元素,它在模拟模式下工作,在用户测试中功能完美 我有CrashLytics操作,它说崩溃是这行代码的结果 let allContactsData = try Data(contentsOf: urlResults!) 我在前面的VC中检查所有字段是否都包含一个值,并且“print”确认了这一点 Company : Accountant Suburb

通过xcode成功构建后,该应用程序在模拟器和我的iPhone中运行——当我分发它进行测试时,当测试用户尝试执行搜索时,它崩溃

如果我硬编码URL元素,它在模拟模式下工作,在用户测试中功能完美

我有CrashLytics操作,它说崩溃是这行代码的结果

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 {

    }
}
  • 如果字符串不是格式正确的URL,URL(字符串:)可能返回nil。强制将其展开为
    urlResults是不安全的,尤其是当您从用户输入构建代码时
  • 它是这样的:

    if let url = urlResults {
        let allContactsData = try Data(contentsOf:url) 
        // etc
    } else {
        // log an error for debugging
    }
    
    toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
    
  • 您应该确保字符串是URL编码的
  • trimmingCharacters仅从字符串的开头和结尾删除字符。但您的输入变量可能包含嵌入空格,或URL字符串的其他非法字符

    按如下方式转换输入字符串:

    if let url = urlResults {
        let allContactsData = try Data(contentsOf:url) 
        // etc
    } else {
        // log an error for debugging
    }
    
    toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
    
  • 如果字符串不是格式正确的URL,URL(字符串:)可能返回nil。强制将其展开为
    urlResults是不安全的,尤其是当您从用户输入构建代码时
  • 它是这样的:

    if let url = urlResults {
        let allContactsData = try Data(contentsOf:url) 
        // etc
    } else {
        // log an error for debugging
    }
    
    toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
    
  • 您应该确保字符串是URL编码的
  • trimmingCharacters仅从字符串的开头和结尾删除字符。但您的输入变量可能包含嵌入空格,或URL字符串的其他非法字符

    按如下方式转换输入字符串:

    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