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.
Antworten:
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 } }
quelle
controller.recipients = ([self.phoneNumber.text] as! [String])
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 }
quelle
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) } }
quelle
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()
quelle
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:
quelle
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.
quelle
@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; } }
quelle
canSendText()
. Wird auchrecipients
im 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