【问题标题】:Sending SMS in iOS with Swift使用 Swift 在 iOS 中发送短信
【发布时间】:2014-12-08 14:55:30
【问题描述】:

首先,我真的很惊讶这不是重复的,因为在 Objective-C 中有大量的 stackoverflow 问题可以解决这个问题,但我还没有看到使用 Swift 的好答案。

我正在寻找的是 Swift 中的代码 sn-p,它将任意字符串作为文本消息的正文发送到给定的电话号码。本质上,我想要 Apple 官方文档中的 this 之类的东西,但使用的是 Swift 而不是 Objective-C。

我想这并不太难,因为在 Android 中只需几行代码即可完成。

编辑:我正在寻找的是 5-20 行 Swift 代码,我不同意这太宽泛了。在 Java(适用于 Android)中,解决方案如下所示:

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

现在这是 android 解决方案,它只有 11 行。 Java 往往比 Swift 冗长得多,所以我怀疑我要问的是“太宽泛”,我更有可能不知道如何使用 Objective-C MessageComposer 对象,因为我链接的文档上述在 Swift 中的用法还不清楚。

【问题讨论】:

  • 我已经编辑了帖子,我认为我打算问的问题并不太宽泛。请重新考虑结束这个问题,或者通过要求澄清我遗漏的细节来帮助我,这会使范围过于广泛。
  • 我还想指出这样一个事实,this question 是 Objective-C 的同一个问题,收到了 300 多个投票,并受到版主的保护(没有像我的那样被搁置) .我相信这个问题实际上会对社区变得非常有价值。
  • 明白。我是iOS的初学者,没有机会学习Objective C。一旦你知道它是如何完成的,翻译可能很容易,但我不知道它是如何完成的。 sn-p 可能会被许多像我这样的人使用。
  • 当然,但至少,编写 Swift 代码并参考 Objective-C 答案似乎很奇怪。然后,读者必须进行转换,而不是重用 sn-p。在 StackOverflow 上建立一系列 Swift 答案只会在未来对社区有益,因为 Swift 最终可能会成为编写 iOS 应用程序的主要语言。
  • 我链接的问题是 6 岁,但 Swift 语言要年轻得多。六年前不可能问出这个问题的快速版本。

标签: ios swift iphone sms imessage


【解决方案1】:

不确定你是否真的得到了答案。我也在进行类似的调查,发现了这个解决方案并让它发挥作用。

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

【讨论】:

  • 这个会发短信还是iMessage
  • 它只会将您带到消息应用程序。应用程序确定是消息还是 iMessage。
  • 如何分享网址和文字?
  • 考虑为 Swift 更新。比如现在是:func messageComposeViewController(_ controller: MFMessageComposeViewController, ...)
  • 为我工作,几乎没有编辑。 controller.recipients = ([self.phoneNumber.text] as! [String])
【解决方案2】:

Swift 3.0 解决方案:

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
    }

【讨论】:

    【解决方案3】:
    @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;
        }
    }
    

    【讨论】:

    • 这将在模拟器中崩溃,因为您没有检查canSendText()。此外,recipients 被放置在撰写窗口中。在大多数设备中,MMS 将允许占位符文本变为绿色,无法匹配联系人中的数字,然后让用户向您的示例文本发送消息,这将无济于事。 (如果运营商对此收费,可能会向设备用户收取信息费用。)
    【解决方案4】:

    斯威夫特 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;
            }
        }
    

    用户界面将如下所示:

    【讨论】:

      【解决方案5】:

      如果您不想依赖 UIViewController,请遵循 Swift 3.0 解决方案:

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

      你这样称呼作曲家:

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

      或使用惰性变量

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

      【讨论】:

        【解决方案6】:

        为了在 Swift 5 中发送 iMessage,我使用以下代码

        只需 MessageUI 封装并实现 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")
                case .failed:
                    print("Message failed")
                case .sent:
                    print("Message was sent")
                default:
                    return
                }
                dismiss(animated: true, completion: nil)
            }
        }
        

        【讨论】:

        • 谢谢,但是消息弹出并没有关闭,所以我需要将控制器添加到该行:controller.dismiss(animated: true, completion: nil)
        【解决方案7】:

        更简单的解决方案可能是打开 html 链接:

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

        确保您将空格替换为“%20”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-27
          • 1970-01-01
          • 2023-03-16
          • 2022-06-28
          • 2016-09-12
          • 1970-01-01
          • 2012-02-18
          • 2012-01-22
          相关资源
          最近更新 更多