IOS应用程序崩溃 - 但不是在模拟器 - 硬编码URL工作

时间:2017-07-28 02:43:38

标签: ios json swift

在通过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 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()

}

如前所述,如果我取消注释硬编码的变量,它将作为例外运行而不会出现问题。

任何帮助都会受到赞赏,因为我仍然无法弄清楚为什么它在模拟模式下运行没有任何问题,但即使所有字段都有值,也无法进行实时测试。

编辑:(崩溃数据)

#0. Crashed: com.apple.main-thread
0  ThisAWSMAPP                    0x1000752e4 ViewController.getResults() -> () (ViewController.swift:158)
1  ThisAWSMAPP                    0x100076180 specialized ViewController.viewDidAppear(Bool) -> () (ViewController.swift)
2  ThisAWSMAPP                    0x100071e3c @objc ViewController.viewDidAppear(Bool) -> () (ViewController.swift)
3  UIKit                          0x18cb0ddb0 -[UIViewController _setViewAppearState:isAnimating:] + 856
4  UIKit                          0x18cb0e31c -[UIViewController _endAppearanceTransition:] + 228
5  UIKit                          0x18cbc4d64 -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 1224
6  UIKit                          0x18cc93c5c __49-[UINavigationController _startCustomTransition:]_block_invoke + 232
7  UIKit                          0x18cc1aa1c -[_UIViewControllerTransitionContext completeTransition:] + 116
8  UIKit                          0x18cd68fac __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke.99 + 724
9  UIKit                          0x18cb2e9d0 -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 492
10 UIKit                          0x18cb2e4f8 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 312
11 UIKit                          0x18cb2e314 -[UIViewAnimationState animationDidStop:finished:] + 160
12 QuartzCore                     0x189cdf0d4 CA::Layer::run_animation_callbacks(void*) + 260
13 libdispatch.dylib              0x18587e9a0 _dispatch_client_callout + 16
14 libdispatch.dylib              0x1858835e8 _dispatch_main_queue_callback_4CF + 996
15 CoreFoundation                 0x1869750c0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
16 CoreFoundation                 0x186972cdc __CFRunLoopRun + 1572
17 CoreFoundation                 0x1868a2d94 CFRunLoopRunSpecific + 424
18 GraphicsServices               0x18830c074 GSEventRunModal + 100
19 UIKit                          0x18cb5b130 UIApplicationMain + 208
20 ThisAWSMAPP                    0x1000646d8 main (AppDelegate.swift:16)
21 libdyld.dylib                  0x1858b159c start + 4

3 个答案:

答案 0 :(得分:2)

  1. 如果字符串不是格式正确的URL,则URL(字符串:)可能返回nil。强制将其展开为urlResults!是不安全的,特别是如果您是根据用户输入构建它。
  2. 这样更安全:

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

      翻译输入字符串,如下所示:

      toSearchFor = searchingFor.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
      

答案 1 :(得分:0)

给定行的carh表示你的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 {

    }
}

答案 2 :(得分:0)

似乎是线程问题。你能尝试在主线程上执行你的代码。

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()
})