Senden von SMS in iOS mit Swift


78

Zunächst einmal bin ich wirklich überrascht, dass dies kein Duplikat ist, da es Tonnen von Stackoverflow-Fragen gibt, die dies in Objective-C lösen, aber ich habe noch keine gute Antwort gefunden, die Swift verwendet hat.

Was ich suche, ist ein Code-Snippet in Swift, das eine beliebige Zeichenfolge als Text einer Textnachricht an eine bestimmte Telefonnummer sendet. Im Grunde würde ich gerne so etwas wie dies von Apples offizieller Dokumentation, sondern in Swift statt Objective-C.

Ich stelle mir vor, dass dies nicht allzu schwierig ist, da es in Android in nur wenigen Codezeilen möglich ist.

EDIT: Was ich suche, sind 5-20 Zeilen Swift-Code, ich stimme nicht zu, dass dies zu breit ist. In Java (für Android) sieht die Lösung folgendermaßen aus:

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

Dies ist die Android-Lösung, und es sind nur 11 Zeilen. Java ist in der Regel viel ausführlicher als Swift, daher bezweifle ich, dass das, was ich frage, "zu weit gefasst" ist. Es ist wahrscheinlicher, dass ich nicht weiß, wie das Objective-C MessageComposer-Objekt verwendet wird, da die Dokumentation, die ich verlinkt habe oben ist unklar in Bezug auf die Verwendung in Swift.


2
Ich habe den Beitrag bearbeitet und denke, dass die Frage, die ich stellen möchte, nicht zu weit gefasst ist. Bitte überdenken Sie das Schließen dieser Frage oder helfen Sie mir, indem Sie um Klärung von Details bitten, die ich weglasse und die den Anwendungsbereich zu weit gefasst machen.
Johncorser

2
Ich möchte auch darauf hinweisen, dass diese Frage dieselbe Frage für Objective-C ist und über 300 positive Stimmen erhalten hat und von Moderatoren geschützt wurde (nicht wie meine auf Eis gelegt). Ich glaube, diese Frage könnte für die Community tatsächlich sehr wertvoll werden.
Johncorser

6
Verstanden. Ich bin ein Anfänger in iOS und hatte keine Gelegenheit, Ziel C zu lernen. Die Übersetzung mag einfach sein, wenn Sie wissen, wie es gemacht wird, aber ich weiß nicht, wie es gemacht wird. Das Snippet wird wahrscheinlich von vielen anderen wie mir verwendet.
Johncorser

1
Sicher, aber zumindest scheint es seltsam, Swift-Code zu schreiben und sich auf Objective-C-Antworten zu beziehen. Der Leser muss dann die Konvertierung durchführen, anstatt ein Snippet wiederzuverwenden. Der Aufbau eines Repertoires an Swift-Antworten auf StackOverflow wird in Zukunft nur noch für die Community von Vorteil sein, da Swift möglicherweise die Hauptsprache wird, in der iOS-Apps geschrieben werden.
Johncorser

2
Die Frage, die ich verlinkt habe, ist 6 Jahre alt, aber die Swift-Sprache ist viel, viel jünger. Die schnelle Version der Frage hätte vor sechs Jahren nicht gestellt werden können.
Johncorser

Antworten:


127

Ich bin mir nicht sicher, ob du wirklich die Antwort hast. Ich war auf einer ähnlichen Jagd und bin auf diese Lösung gestoßen und habe sie zum Laufen gebracht.

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

würde dies eine SMS oder iMessage senden
Oren Edrich

2
Sie gelangen einfach zur Messaging-App. Die App ermittelt, ob es sich um eine Nachricht oder eine iMessage handelt.
Sivag1

Wie teile ich URL und Text?
kishor0011

Erwägen Sie ein Update für Swift für. Zum Beispiel ist es jetzt: func messageComposeViewController (_ controller: MFMessageComposeViewController, ...)
crimson_penguin

arbeitete für mich mit wenig bearbeiten. controller.recipients = ([self.phoneNumber.text] as! [String])
Rakshitha Muranga Rodrigo

29

Swift 3.0-Lösung:

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
    }

15

Zum Senden von iMessage in Swift 5 verwende ich folgenden Code

Einfach MessageUI- Paket und MFMessageComposeViewControllerDelegate implementieren

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")
        case .failed:
            print("Message failed")
        case .sent:
            print("Message was sent")
        default:
            return
        }
        dismiss(animated: true, completion: nil)
    }
}

Vielen Dank, aber das Nachrichten-Popup wird nicht geschlossen, daher musste ich den Controller zur Zeile hinzufügen: controller.dismiss (animiert: true, Vervollständigung: null)
David Sanford

5

Wenn Sie nicht von einem UIViewController abhängig sein möchten, befolgen Sie eine Swift 3.0- Lösung:

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

Sie nennen den Komponisten folgendermaßen:

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

oder mit einem faulen var

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

5

Swift 3, 4, 5

@IBAction func sendSmsClick(_ sender: AnyObject) {
        guard MFMessageComposeViewController.canSendText() else {
            return
        }

        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;
        }
    }

Die Benutzeroberfläche sieht folgendermaßen aus: Geben Sie hier die Bildbeschreibung ein


0

Einfachere Lösung kann sein, HTML-Link zu öffnen:

let mPhoneNumber = "1111111111";
let mMessage = "hello%20phone";
if let url = URL(string: "sms://" + mPhoneNumber + "&body="+mMessage) {
    UIApplication.shared.open(url)
}

Stellen Sie sicher, dass Sie Leerzeichen durch "% 20" ersetzt haben.


-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;
    }
}

Dies wird in einem Simulator abstürzen, da Sie nicht überprüfen canSendText(). Wird auch recipientsim Erstellungsfenster platziert. In den meisten Geräten lässt MMS zu, dass der Platzhaltertext grün wird, nicht mit einer Nummer in Kontakten übereinstimmt, und lässt den Benutzer dann eine Nachricht an Ihren Beispieltext senden, die nirgendwohin führt. (Möglicherweise kostet der Gerätebenutzer eine Nachricht, wenn der
Netzbetreiber dafür
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.