On my App, I send alert via sms. I try to open a new view controller as a modal, and in this , the alert was sent. But, when the sms is sent or when user click on the cancel button, the messageComposeViewController do not dismiss, and crash.
Error on xcode log is :
(lldb)
This is my code used to send alerts :
import UIKit
import CoreLocation
import Social
import MessageUI
import BRYXBanner
class AlertInProgressViewController: UIViewController, MFMessageComposeViewControllerDelegate, CLLocationManagerDelegate {
[... Code here ...]
func sms()
{
//Send sms
if(sms_exist()==true)
{
if( CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways)
{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
let mlocation = self.locationManager.location
if mlocation != nil {
let latitude: Double = mlocation!.coordinate.latitude
let longitude: Double = mlocation!.coordinate.longitude
let latitude_convert:String = String(format:"%f", latitude)
let longitude_convert:String = String(format:"%f", longitude)
let location = number_street + " " + ville + "\nLatitude " + latitude_convert + " - Longitude : " + longitude_convert
let geoCoder = CLGeocoder()
let location_details = CLLocation(latitude: mlocation!.coordinate.latitude, longitude: mlocation!.coordinate.longitude)
geoCoder.reverseGeocodeLocation(location_details)
{
(placemarks, error) -> Void in
let placeArray = placemarks as [CLPlacemark]!
// Place details
var placeMark: CLPlacemark!
placeMark = placeArray?[0]
// Address dictionary
print(placeMark.addressDictionary)
// Location name
if let locationName = placeMark.addressDictionary?["Name"] as? NSString
{
print(locationName)
self.details_location = locationName as String
}
if let city = placeMark.addressDictionary?["City"] as? NSString
{
self.city = city as String
}
self.message = NSLocalizedString("IN_DANGER_TEXT_SHARE",comment:"I'm in danger, I'm currently at ") + location + "\n - " + self.details_location + " - " + self.city
let defaults = UserDefaults.standard
let sms_perso = defaults.object(forKey: "sms") as? String
if(MFMessageComposeViewController.canSendText()) {
let controller = MFMessageComposeViewController()
controller.body = self.message
controller.recipients = [sms_perso!]
controller.messageComposeDelegate = self
self.present(controller, animated: true, completion: nil)
}
else
{
print("Can't send sms")
}
}
}
}
}
}
[...]
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
//Original code but doesn't work too
//self.dismiss(animated: true, completion: nil)
OperationQueue.main.addOperation {
self.dismiss(animated: true, completion: {});
}
print("I want to dismiss here")
}
}
In xcode log, I can see : I want to dismiss here, so messageComposeViewController is called but after it's crash.
To display AlertInProgressViewController I use a storyboard segue.
I resolve my problem by changing this :
self.dismiss(animated: true, completion: {});
by
controller.dismiss(animated: true, completion: nil)