Приложение вылетает при запуске


#1

Доброго времени суток.

Запускаю app на iphone и симуляторах xcode. Все работает. Отсоединяю кабель от iphone, запускаю app и через раз или несколько приложение вылетает при его запуске (сворачивается).

Приложение запускает LocationManager, получается локацию, передает ее в функции с получением и парсом JSON и обновляет Labeel.

В чем может быть проблема?

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

@IBOutlet weak var fajr: UILabel!
@IBOutlet weak var sunrise: UILabel!
@IBOutlet weak var dhuhr: UILabel!
@IBOutlet weak var asr: UILabel!
@IBOutlet weak var magrib: UILabel!
@IBOutlet weak var isha: UILabel!

@IBAction func settingButton(_ sender: UIBarButtonItem) {
    TimerLeftTime()
}
@IBOutlet weak var cityLabel: UILabel!

var latitude = " "
var longitude = " "

var timerr = String()

let locationManagerVar = CLLocationManager()

@IBOutlet weak var leftTime: UILabel!
@IBOutlet weak var leftTimerDescription: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    
    cityLabel.textColor = #colorLiteral(red: 0.4620226622, green: 0.8382837176, blue: 1, alpha: 0)
    leftTime.textColor = #colorLiteral(red: 0.4620226622, green: 0.8382837176, blue: 1, alpha: 0)
    leftTimerDescription.textColor = #colorLiteral(red: 0.4620226622, green: 0.8382837176, blue: 1, alpha: 0)
    
    locationManagerVar.delegate = self
    locationManagerVar.desiredAccuracy = kCLLocationAccuracyBest
    locationManagerVar.requestWhenInUseAuthorization()
    locationManagerVar.startUpdatingLocation()
    
    let backgroundImage = UIImageView(frame: UIScreen.main.bounds)
    backgroundImage.image = UIImage(named: "bg")
    self.view.insertSubview(backgroundImage, at: 0)
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation = locations.last! as CLLocation
    
    if userLocation.horizontalAccuracy > 0 {
        locationManagerVar.stopUpdatingLocation()
        latitude = String(userLocation.coordinate.latitude)
        longitude = String(userLocation.coordinate.longitude)
        fetchPrayerTime()
        fetchCityName() 
    }
    print("Получил координаты пользователя")
}

func fetchCityName() {
    let baseUrlCity = URL(string: "http://maps.googleapis.com/maps/api/geocode/")
    let pathUrlCity = "json?latlng=\(latitude),\(longitude)"
    let urlCity = URL(string: pathUrlCity, relativeTo: baseUrlCity)
    
    let task = URLSession.shared.dataTask(with: urlCity!) {(data, response, error) in
        DispatchQueue.main.async(execute: {
            if error != nil {
                print("error")
            } else {
                if let content = data {
                    do {
                        let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                        if let results = myJson["results"] as? [AnyObject] {
                            if let firstResult = results[0] as? NSDictionary {
                                if let addressComponents = firstResult["address_components"] as? [AnyObject] {
                                    if let thirdComponent = addressComponents[2] as? NSDictionary {
                                        if let cityName = thirdComponent["long_name"] {
                                            self.cityLabel.text = String(describing: cityName)
                                        }
                                    }
                                }
                            }
                        }
                    } catch {
                        
                    }
                }
            }
        })
    }
    task.resume()
    cityLabel.textColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    print("Получил название города")
}

func fetchPrayerTime() {
    let baseUrl = URL(string: "http://api.aladhan.com/timings/")
    let pathUrl = "0?latitude=\(latitude)&longitude=\(longitude)&method=3"
    let url = URL(string: pathUrl, relativeTo: baseUrl)
    
    let task2 = URLSession.shared.dataTask(with: url!) {(data, response, error) in
        DispatchQueue.main.async(execute: {
            if error != nil {
                print("error")
            } else {
                if let content = data {
                    do {
                        let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
                        
                        if let data = myJson["data"] as? NSDictionary {
                            if let timings = data["timings"] as? NSDictionary {
                                if let fajr = timings["Fajr"] { self.fajr.text = String(describing: fajr) }
                                if let sunrise = timings["Sunrise"] { self.sunrise.text = String(describing: sunrise) }
                                if let dhuhr = timings["Dhuhr"] { self.dhuhr.text = String(describing: dhuhr) }
                                if let asr = timings["Asr"] { self.asr.text = String(describing: asr) }
                                if let maghrib = timings["Maghrib"] { self.magrib.text = String(describing: maghrib) }
                                if let isha = timings["Isha"] { self.isha.text = String(describing: isha) }
                            }
                        }
                    } catch {
                        
                    }
                }
            }
        })
    }
    task2.resume()
    print("Получил времена молитв")
}

func TimerLeftTime() {
    let timeFormatter = DateFormatter()
    timeFormatter.dateFormat = "HH:mm"
    
    var arrayTime = [fajr.text, sunrise.text, dhuhr.text, asr.text, magrib.text, isha.text]
    
    let date = Date()
    var date2 = Date()
    let calendar = Calendar.current
    
    for index in 0...arrayTime.count-1 {
        let time = arrayTime[index]
        date2 = timeFormatter.date(from: time!)!
        
        let year = calendar.component(.year, from: date)
        let month = calendar.component(.month, from: date)
        let day = calendar.component(.day, from: date)
        let hour = calendar.component(.hour, from: date2)
        let minute = calendar.component(.minute, from: date2)
        
        date2 = calendar.date(bySetting: .year, value: year, of: date2)!
        date2 = calendar.date(bySetting: .month, value: month, of: date2)!
        date2 = calendar.date(bySetting: .day, value: day, of: date2)!
        date2 = calendar.date(bySetting: .hour, value: hour, of: date2)!
        date2 = calendar.date(bySetting: .minute, value: minute, of: date2)!
        
        if date < date2 {
            let timeDifference = calendar.dateComponents([.hour, .minute, .second], from: date, to: date2)

            leftTime.text = "\(String(timeDifference.hour!))ч \(String(timeDifference.minute!))м"
            leftTime.textColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
            leftTimerDescription.textColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
            break
        }
    }
    print("Узнал время до след молитвы")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}


#2

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#3

К сожалению, пока не знаю, как этим пользоваться. Но заметил, что когда запускаю на симуляторах, то содержимое функции locationManager прогоняется всего один раз. В консоле я получаю это

Получил времена молитв
Получил название города
Получил координаты пользователя

А когда запускаю на iphone по кабелю, то получаю

Получил времена молитв
Получил название города
Получил координаты пользователя
2017-09-23 01:47:14.104822+0500 PrayerTimeApp[488:73131] refreshPreferences: HangTracerEnabled: 0
2017-09-23 01:47:14.104905+0500 PrayerTimeApp[488:73131] refreshPreferences: HangTracerDuration: 500
2017-09-23 01:47:14.104942+0500 PrayerTimeApp[488:73131] refreshPreferences: ActivationLoggingEnabled: 0 ActivationLoggingTaskedOffByDA:0
Получил времена молитв
Получил название города
Получил координаты пользователя
Получил времена молитв
Получил название города
Получил координаты пользователя
Получил времена молитв
Получил название города
Получил координаты пользователя


#4

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#5

Добавил value.

ПоПо\320лучч\320ил вревре\320мвре\320м\320ена молитв
Получил название города
Получил координаты пользователя
Получил времена молитв
Полл\321учил названиани\320е города
Получил координаты пп\320ользователя
Получил времена молитв
Получил название города
Получил координаты пользователя
2017-09-23 02:17:50.744830+0500 PrayerTimeApp[546:85030] refreshPreferences: HangTracerEnabled: 0
2017-09-23 02:17:50.745989+0500 PrayerTimeApp[546:85030] refreshPreferences: HangTracerDuration: 500
2017-09-23 02:17:50.746146+0500 PrayerTimeApp[546:85030] refreshPreferences: ActivationLoggingEnabled: 0 ActivationLoggingTaskedOffByDA:0

Все так же понесколько раз прогоняет


#6

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#7

http://rapid.ufanet.ru/65038829


#8

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#9

Чем дольше использовать тем чаще вылетает на iphone. Спасибо за отзывчивость. Буду пробовать.


#10

Баг стабильно воспроизводится.
Порядок действий такой:
Выставляю локацию девайса Apple. Запускаю приложение.
Выставляю локацию девайса lat: 15,755786 long: 17,617633 (выбрал значения случайно).
Убиваю приложение и запускаю заново.

Стабильно вылетает при каждом запуске и любой локации девайса.

Ваш addressComponents (83 строка):

Получил времена молитв
Получил название города
Получил координаты пользователя
Получил времена молитв
Получил название города
Получил координаты пользователя


[{
    "long_name" = 2;
    "short_name" = 2;
    types =     (
        "street_number"
    );
}, {
    "long_name" = "Infinite Loop";
    "short_name" = "Infinite Loop";
    types =     (
        route
    );
}, {
    "long_name" = Cupertino;
    "short_name" = Cupertino;
    types =     (
        locality,
        political
    );
}, {
    "long_name" = "Santa Clara County";
    "short_name" = "Santa Clara County";
    types =     (
        "administrative_area_level_2",
        political
    );
}, {
    "long_name" = California;
    "short_name" = CA;
    types =     (
        "administrative_area_level_1",
        political
    );
}, {
    "long_name" = "United States";
    "short_name" = US;
    types =     (
        country,
        political
    );
}, {
    "long_name" = 95014;
    "short_name" = 95014;
    types =     (
        "postal_code"
    );
}, {
    "long_name" = 2083;
    "short_name" = 2083;
    types =     (
        "postal_code_suffix"
    );
}]
[{
    "long_name" = 2;
    "short_name" = 2;
    types =     (
        "street_number"
    );
}, {
    "long_name" = "Infinite Loop";
    "short_name" = "Infinite Loop";
    types =     (
        route
    );
}, {
    "long_name" = Cupertino;
    "short_name" = Cupertino;
    types =     (
        locality,
        political
    );
}, {
    "long_name" = "Santa Clara County";
    "short_name" = "Santa Clara County";
    types =     (
        "administrative_area_level_2",
        political
    );
}, {
    "long_name" = California;
    "short_name" = CA;
    types =     (
        "administrative_area_level_1",
        political
    );
}, {
    "long_name" = "United States";
    "short_name" = US;
    types =     (
        country,
        political
    );
}, {
    "long_name" = 95014;
    "short_name" = 95014;
    types =     (
        "postal_code"
    );
}, {
    "long_name" = 2083;
    "short_name" = 2083;
    types =     (
        "postal_code_suffix"
    );
}]

Эта переменная после бага.

Получил времена молитв
Получил название города
Получил координаты пользователя
[{
    "long_name" = "Bahr El Gazel";
    "short_name" = "Bahr El Gazel";
    types =     (
        "administrative_area_level_1",
        political
    );
}, {
    "long_name" = Chad;
    "short_name" = TD;
    types =     (
        country,
        political
    );
}]
fatal error: Index out of range
2017-09-24 01:31:56.864835+0300 PrayerTimeApp[14111:2082014] fatal error: Index out of range

#11

Получилось зафиксировать.


#12

Попробовал потыкать адрес API в браузере. И с очень похожей периодичностью вместо JSON от гугла я получал сообщение.

{
“error_message” : “You have exceeded your daily request quota for this API. We recommend registering for a key at the Google Developers Console: https://console.developers.google.com/apis/credentials?project=_”,
“results” : [],
“status” : “OVER_QUERY_LIMIT”
}

Возможно, это и есть причина. Попробую через аккаунт разработчика.


#13

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.