2014-10-13 16 views
40

Przede wszystkim, jestem naprawdę zaskoczony, że nie jest to duplikat, ponieważ istnieje mnóstwo pytań stackoverflow, które rozwiązują ten w Objective-C, ale muszę jeszcze zobaczyć dobrą odpowiedź, że używane Swift.Wysyłanie SMS w iOS z Swift

Co szukam to fragment kodu w Swift, który wysyła dowolny ciąg jako ciała wiadomości tekstowej do danego numeru telefonu. Zasadniczo chciałbym coś w rodzaju oficjalnej dokumentacji Apple, ale w Swift zamiast Objective-C.

sobie wyobrazić, nie jest to zbyt trudne, jak można to zrobić w ciągu zaledwie kilku linii kodu w Androidzie.

EDIT: Co Szukam jest 5-20 linie kodu SWIFT, nie zgadzam się, że jest zbyt szeroka. W Javie (dla Androida), rozwiązanie wygląda tak:

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

Teraz jest to android rozwiązanie, i to tylko 11 linie. Java wydaje się być dużo bardziej gadatliwa niż Swift, więc wątpię, że to, o co pytam, jest "zbyt szerokie", jest bardziej prawdopodobne, że nie wiem, jak używać obiektu Objective-C MessageComposer, ponieważ dokumentacja, którą połączyłem powyższe jest niejasne w odniesieniu do użytkowania w Swift.

+0

I edycji posta i myślę, że pytanie, które ja zamierzają prosić nie jest zbyt szeroki. Proszę rozważyć zamknięcie tego pytania lub pomóc mi, prosząc o wyjaśnienie szczegółów, które pomijam, które sprawiają, że zakres jest zbyt szeroki. – johncorser

+0

Chciałbym również zwrócić uwagę na fakt, że [to pytanie] (http://stackoverflow.com/questions/10848/how-to-programmatically-send-sms-on-the-iphone) jest to samo pytanie Cel-C i otrzymał ponad 300 przegranych i był chroniony przez moderatorów (nie zawieszony tak jak mój był). Wierzę, że to pytanie może w rzeczywistości stać się dość cenne dla społeczności. – johncorser

+0

Konwersja Obj-C na Swift nie jest trudna. Pytanie, które po prostu prosi o tłumaczenie, powołując się na kod, który został już napisany, nie jest szczególnie użyteczne. – jtbandes

Odpowiedz

77

Nie jestem pewien, czy naprawdę masz odpowiedź. Byłem w podobnym polowaniu i natknąłem się na to rozwiązanie i sprawiłem, że zadziałało.

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

to spowodowałoby wysłanie wiadomości tekstowej lub iMessage –

+0

Po prostu przeniesie Cię do aplikacji Wiadomości. Aplikacja określa, czy jest to wiadomość, czy iMessage. – sivag1

+0

Jak udostępnić URL i tekst? – kishor0011

18

Swift 3.0 Rozwiązanie:

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

możemy ukryć informacje o odbiorcach. –

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

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

Jeśli nie chcesz polegać na UIViewController, następuje Swift 3.0 rozwiązanie :

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

zadzwonić kompozytor ten sposób:

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

lub za pomocą lazy var

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