L’invio di SMS in iOS con Swift

Prima di tutto, sono davvero sorpreso che questo non è un duplicato, perché ci sono TONNELLATE di stackoverflow domande che risolvere questo Objective-C, ma non ho ancora visto una buona risposta che usato Swift.

Quello che sto cercando è un frammento di codice in Swift che invia una stringa arbitraria come il corpo di un messaggio di testo a un determinato numero di telefono. In sostanza, vorrei qualcosa di simile questo da Apple documentazione ufficiale, ma in Swift invece di Objective-C.

Immagino che questo non è troppo difficile, in quanto può essere fatto solo in un paio di righe di codice in Android.

EDIT: Quello che sto cercando è 5-20 linee di codice Swift, io non sono d’accordo che questo è troppo ampia. In Java (per Android), la soluzione di simile a questo:

package com.company.appname;
import android.app.Activity;
import android.telephony.SmsManager;
public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        public static final mPhoneNumber = "1111111111";
        public static final mMessage = "hello phone";
        SmsManager.getDefault().sendTextMessage(mPhoneNumber, null, mMessage, null, null);
     }
}

Ora, questo è l’android soluzione, e sono solo le 11 linee. Java tende ad essere molto più dettagliato rispetto a Swift, così ho dubbi su quello che sto chiedendo è “troppo ampio”, è più probabile che non so come utilizzare Objective-C, MessageComposer oggetto, perché la documentazione che ho linkato sopra è chiaro per quanto riguarda l’utilizzo di Swift.

  • Ho modificato il post e credo che la domanda che sto intendendo non è chiedere troppo ampia. Si prega di riconsiderare la chiusura di questa domanda, o che mi aiuti chiedendo per chiarire i particolari che sto lasciando che rendere la portata troppo ampia.
  • Vorrei anche sottolineare il fatto che questa domanda è la stessa domanda per Objective-C e ricevuto oltre 300 upvotes e protetto dai moderatori (non mettere in attesa, come il mio è stato). Credo che questa domanda potrebbe effettivamente diventare molto prezioso per la comunità.
  • La conversione di Obj-C, Swift non è difficile. Una domanda che richiede semplicemente di una traduzione, citando il codice che è già stato scritto, non è particolarmente utile.
  • Capito. Io sono un principiante per iOS e non hanno avuto la possibilità di imparare l’Objective C. di Traduzione può essere facile una volta che sai come è fatto, ma non so come è fatto. Il frammento è probabile che molti altri come me.
  • C’è davvero molto da imparare. Le Api sono le stesse. Non c’è bisogno di capire la sintassi dettagliata di Obj-C, in quanto tutte le classi e i metodi che hanno sostanzialmente gli stessi nomi in Swift. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
  • Certo, ma almeno, sembra strano a scrivere codice Swift e si riferiscono a Objective-C risposte. Poi il lettore ha a che fare la conversione, piuttosto che il riutilizzo di un frammento. La costruzione di un repertorio di rispondere in modo rapido su StackOverflow solo essere di beneficio per la comunità, in futuro, come Swift potrebbe alla fine diventare la lingua principale in cui iOS apps sono scritti.
  • Sono davvero Cacao domande e non Obj-C domande. Vorrei incoraggiarvi a discutere la questione in Meta. meta.stackoverflow.com/questions/258413/…
  • (Tieni presente, inoltre, che la domanda che hai linkato è di 6 anni…!)
  • La domanda che ho linkato è di 6 anni, ma la Swift lingua è molto, molto più giovane. La swift versione della domanda non è stato chiesto sei anni fa.

InformationsquelleAutor johncorser | 2014-10-13



6 Replies
  1. 114

    Non si è sicuri se si ha davvero la risposta. Ero in una simile caccia e sono imbattuto in questa soluzione e ottenuto di lavorare.

    import UIKit
    import MessageUI
    
    class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {
    
        @IBOutlet weak var phoneNumber: UITextField!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func sendText(sender: UIButton) {
            if (MFMessageComposeViewController.canSendText()) {
                let controller = MFMessageComposeViewController()
                controller.body = "Message Body"
                controller.recipients = [phoneNumber.text]
                controller.messageComposeDelegate = self
                self.presentViewController(controller, animated: true, completion: nil)
            }
        }
    
        func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
            //... handle sms screen actions
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    
        override func viewWillDisappear(animated: Bool) {
            self.navigationController?.navigationBarHidden = false
        }
    }
    • sarebbe questo, inviare un sms o iMessage
    • Semplicemente a prendere per le app di Messaggistica. L’applicazione determina se è messaggio o iMessage.
    • Come condividere l’URL e il testo ?
    • Considerare l’aggiornamento rapido. Per esempio, è ora: func messageComposeViewController(_ controllore: MFMessageComposeViewController, …)
    • ha funzionato per me con la piccola modifica. controller.recipients = ([self.phoneNumber.text] as! [String])
  2. 26

    Swift 3.0 La Soluzione:

    func sendSMSText(phoneNumber: String) {
            if (MFMessageComposeViewController.canSendText()) {
                let controller = MFMessageComposeViewController()
                controller.body = ""
                controller.recipients = [phoneNumber]
                controller.messageComposeDelegate = self
                self.present(controller, animated: true, completion: nil)
            }
        }
    
        func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
            //... handle sms screen actions
            self.dismiss(animated: true, completion: nil)
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            self.navigationController?.isNavigationBarHidden = false
        }
    • possiamo nascondere i destinatari delle informazioni.
  3. 4

    Se non vogliono dipendere da un UIViewController, segue un Swift 3.0 soluzione:

    import UIKit
    import MessageUI
    
    class ECMMessageComposerBuilder: NSObject {
    
        private dynamic var customWindow: UIWindow?
        private var body: String?
        private var phoneNumber: String?
        fileprivate var messageController: MFMessageComposeViewController?
    
        var canCompose: Bool {
            return MFMessageComposeViewController.canSendText()
        }
    
        func body(_ body: String?) -> ECMMessageComposerBuilder {
            self.body = body
            return self
        }
    
        func phoneNumber(_ phone: String?) -> ECMMessageComposerBuilder {
            self.phoneNumber = phone
            return self
        }
    
        func build() -> UIViewController? {
            guard canCompose else { return nil }
    
            messageController = MFMessageComposeViewController()
            messageController?.body = body
            if let phone = phoneNumber {
                messageController?.recipients = [phone]
            }
            messageController?.messageComposeDelegate = self
    
            return messageController
        }
    
        func show() {
            customWindow = UIWindow(frame: UIScreen.main.bounds)
            customWindow?.rootViewController = MNViewController()
    
            //Move it to the top
            let topWindow = UIApplication.shared.windows.last
            customWindow?.windowLevel = (topWindow?.windowLevel ?? 0) + 1
    
            //and present it
            customWindow?.makeKeyAndVisible()
    
            if let messageController = build() {
                customWindow?.rootViewController?.present(messageController, animated: true, completion: nil)
            }
        }
    
        func hide(animated: Bool = true) {
            messageController?.dismiss(animated: animated, completion: nil)
            messageController = nil
            customWindow?.isHidden = true
            customWindow = nil
        }
    }
    
    extension ECMMessageComposerBuilder: MFMessageComposeViewControllerDelegate {
    
        func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
            controller.dismiss(animated: true, completion: nil)
            hide()
        }
    }

    Si chiama il compositore in questo modo:

    let phoneNumber = "987654321"
    let composer = MNMessageComposerBuilder()
    composer.phoneNumber(phoneNumber).show()

    o utilizzando un pigro var

    let phoneNumber = "987654321"
    private lazy var messageComposer: MNMessageComposerBuilder = {
        let composer = MNMessageComposerBuilder()
        return composer
    }()
    messageComposer.phoneNumber(phoneNumber).show()
  4. 3

    Swift 3

    @IBAction func sendSmsClick(_ sender: AnyObject) {
            let messageVC = MFMessageComposeViewController()
    
            messageVC.body = "Enter a message";
            messageVC.recipients = ["Enter tel-nr"]
            messageVC.messageComposeDelegate = self;
    
            self.present(messageVC, animated: false, completion: nil)
        }
    
        func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
            switch (result.rawValue) {
                case MessageComposeResult.cancelled.rawValue:
                print("Message was cancelled")
                self.dismiss(animated: true, completion: nil)
            case MessageComposeResult.failed.rawValue:
                print("Message failed")
                self.dismiss(animated: true, completion: nil)
            case MessageComposeResult.sent.rawValue:
                print("Message was sent")
                self.dismiss(animated: true, completion: nil)
            default:
                break;
            }
        }
  5. 3

    Per l’invio di iMessage in Swift 5 io uso il seguente codice

    Solo MessageUI pacchetto e implementare MFMessageComposeViewControllerDelegate

    import UIKit
    import MessageUI
    
    class ViewController: UIViewController, MFMessageComposeViewControllerDelegate {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func sendNewIMessage(_ sender: Any) {
            let messageVC = MFMessageComposeViewController()
            messageVC.body = "Enter a message details here";
            messageVC.recipients = ["recipients_number_here"]
            messageVC.messageComposeDelegate = self
            self.present(messageVC, animated: true, completion: nil)
        }
    
        func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
            switch (result) {
            case .cancelled:
                print("Message was cancelled")
                dismiss(animated: true, completion: nil)
            case .failed:
                print("Message failed")
                dismiss(animated: true, completion: nil)
            case .sent:
                print("Message was sent")
                dismiss(animated: true, completion: nil)
            default:
                break
            }
        }
    }
  6. -1
    @IBAction func sendMessageBtnClicked(sender: AnyObject) {
        var messageVC = MFMessageComposeViewController()
    
        messageVC.body = "Enter a message";
        messageVC.recipients = ["Enter tel-nr"]
        messageVC.messageComposeDelegate = self;
    
        self.presentViewController(messageVC, animated: false, completion: nil)
    }
    
    func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
        switch (result.value) {
        case MessageComposeResultCancelled.value:
          println("Message was cancelled")
          self.dismissViewControllerAnimated(true, completion: nil)
        case MessageComposeResultFailed.value:
          println("Message failed")
          self.dismissViewControllerAnimated(true, completion: nil)
        case MessageComposeResultSent.value:
          println("Message was sent")
         self.dismissViewControllerAnimated(true, completion: nil)
        default:
          break;
        }
    }
    • Questo va in crash in un simulatore di, perché non controllare canSendText(). Inoltre, recipients viene inserito nella finestra di composizione del messaggio. Nella maggior parte dei dispositivi, MMS permetterà di testo segnaposto per diventare verde, non corrisponde un numero in rubrica, e poi permettere all’utente di inviare un messaggio per il testo di esempio, che andrà da nessuna parte. (Potrebbe costare il dispositivo un messaggio all’utente, se il vettore le spese per esso.)

Lascia un commento