SwiftUI MessageUI messageComposeViewController ever called

394 Views Asked by At

Looking to send SMS from a swiftui enviro .Passing recipients from a swiftui contentview, i can send sms . However, messageComposeViewController is never called hence modal is never dismissed and i dont get any callBack (same issue when trying to cancel)

import UIKit import MessageUI import SwiftUI

struct sms: View {

@State private var isShowingMessage = false
@State private var recipients = ["007"]

@State private var message = "this is my  message "
@State private var resultValue = ""

var body: some View {
   
  
    Button{
        
        self.isShowingMessage.toggle()
        
    } label : {
        
        Text("Show messages")
    }
    .sheet(isPresented: $isShowingMessage) {
        SMSMessageUIView(recipients:recipients,body: message,completion:handleCompletion(_:))
    }
    
    
    
}


func handleCompletion (_ result:MessageComposeResult){
    
    
    switch result {
    
    case.cancelled :
        resultValue = "cancelled"
     
        break
        
    case .sent :
        resultValue = "sent"
        break
        
    case.failed :
        
        resultValue = "failed"
        break
        
    @unknown default :
     
        break
        
    }
}

}

class SMSMessageViewController : UIViewController, MFMessageComposeViewControllerDelegate {

var delegate : MessagesViewDelegate?
var recipients : [String]?
var body :String?

override func viewDidLoad() {
    super.viewDidLoad()
}

func displayMessageInterface(){
    
    let composeVC = MFMessageComposeViewController()
    composeVC.body = body ?? ""
    composeVC.recipients = recipients
    
    if MFMessageComposeViewController.canSendText(){
        self.present(composeVC,animated:true,completion: nil)
        
    }else{
        
        self.delegate?.messageCompletion(result: MessageComposeResult.failed)
    }

}
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
    print("NEVR CALLED")
    self.delegate?.messageCompletion(result: result)
    controller.dismiss(animated: true, completion: nil)
   
}

}

public protocol MessagesViewDelegate {

func messageCompletion(result: MessageComposeResult)

}

struct SMSMessageUIView : UIViewControllerRepresentable {

@Environment(\.presentationMode) var presentationMode

let recipients: [String]?
let body : String

var completion : ((_ result: MessageComposeResult)-> Void)

func makeCoordinator() -> Coordinator {
   Coordinator(self)
}

func makeUIViewController(context: Context) -> SMSMessageViewController {
    let controller = SMSMessageViewController()
    controller.delegate = context.coordinator
    controller.recipients = recipients
    controller.body = body
    return controller
}

func updateUIViewController(_ uiViewController: SMSMessageViewController, context: Context) {
    uiViewController.recipients = recipients
    uiViewController.displayMessageInterface()

}

class Coordinator :NSObject,UINavigationControllerDelegate,MessagesViewDelegate{
 
    var parent:SMSMessageUIView
    
    init(_ parent:SMSMessageUIView) {
        
        self.parent = parent
    }
    
    
    func messageCompletion(result: MessageComposeResult) {
    
        self.parent.presentationMode.wrappedValue.dismiss()
        self.parent.completion(result)
    }
    
    
    
}

}

0

There are 0 best solutions below