当iPhone上的短信应用程序未在后台运行时,无法在短信链接中预填电话号码和短信正文。

6
HTML允许您使用此链接轻松地与短信应用程序进行交互:
<a href="sms:">Send a SMS</a>

然而,不同的操作系统也允许您使用以下方法预填电话号码和短信内容:

<a href="sms:1234567890?body=Pre-Populted%20Message">Link</a>

在安卓设备上,或者
<a href="sms:1234567890&body=Pre-Populted%20Message">Link</a>

在iOS 8+上

这个问题在这个问题中有很好的解释。

然而我注意到一个问题,在iPhone上无法找到解决方案:如果短信应用程序没有在您的iPhone后台运行,点击链接将会打开短信应用程序但不会在新消息中预填充电话号码和消息正文。

由于Google AdWords也使用这种功能,所以我也测试了他们的链接,但不幸的是他们也遇到了同样的问题,因此我怀疑是否有解决方案,但仍想与社区进行核实。


嘿,已经快3年了,我仍然遇到和你一样的问题。你尝试向苹果报告了吗?你设法解决了吗? - Łukasz Jagodziński
@ŁukaszJagodziński 请看下面的答案。在较新的iOS版本中应该已经修复了,但如果没有,请尝试我使用的解决方案。 - DMEM
2个回答

0

你应该使用 Apple 的 MessageUI 包

   import MessageUI

在viewController里面编写以下代码发送消息

   if MFMessageComposeViewController.canSendText() {
            let vc = MFMessageComposeViewController()
            vc.messageComposeDelegate = self
            vc.recipients = ["PHONE_NUMBER"]
            vc.body = "MESSAGE_BODY"
            self.presentVC(vc)
   }

不要忘记实现委托函数 //MARK:- MessageUI 委托

extension VIEWCONTROLLER_CLASS: MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate {
   func messageComposeViewController(_ controller: 
   MFMessageComposeViewController, didFinishWith result: 
   MessageComposeResult) {
          switch result {
           case .cancelled:
               controller.dismiss(animated: true, completion: nil)
           case .sent:
               controller.dismiss(animated: true, completion: nil)
           case .failed:
               controller.dismiss(animated: true, completion: nil)
          }
    }

   func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
          controller.dismiss(animated: true, completion: nil)
   }
 }

看起来是针对iOS应用的解决方案。我需要一个针对Web的解决方案。 - DMEM
抱歉,我认为这是一个关于iOS应用程序的问题。我对网站没有任何想法。 - Sand'sHell811

0
我几年前向苹果报告了一个漏洞,我相信他们已经修复了。为了支持旧版iOS,我只是应用了一个简单的脚本,它会访问链接,等待半秒钟,然后再次访问它:
<html>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<a href="#" onclick="window.open('openSMS.php?number=5556667777&text=TEXT_TO_PRE_POPULATE');
                      wait(500);
                      window.open('openSMS.php?number=5556667777&text=TEXT_TO_PRE_POPULATE');">
Click here to open the SMS app
</a>
    
</body>
</html>

其中 openSMS.php 是:

<?php

        // Include and instantiate the class.
        require_once 'Mobile-Detect-2.8.25/Mobile_Detect.php';
        $detect = new Mobile_Detect;
        
        // Get parameters
        $number = $_GET['number'];
        $text = $_GET['text'];
        $url;
         
        // Check for a specific platform with the help of the magic methods:
        if( $detect->isiOS() ){
            $url = "sms:" . $number . "&body=" . $text;         
        } else if( $detect->isAndroidOS() ){
            $url = "sms:" . $number . "?body=" . $text;
        } else if ($detect->isMobile()){
            $url = "sms:" . $number . "?body=" . $text;
        } else {
            
        }
        
        header('Location: '.$url);
?>

不幸的是,等待一段时间并再次以程序方式点击链接是无效的。当您离开浏览器时,您无法执行JS。因此,只有当您回到浏览器时才能使用。然后它会要求再次打开链接,这远非完美,而且它只适用于Safari。它在Chrome iOS上不起作用。苹果没有修复这个至少三年的错误。他们不在乎开发人员... - Łukasz Jagodziński
哦,实际上我必须向苹果道歉,因为他们在我今天安装的最新iOS更新中修复了这个漏洞。他们确实倾听用户的声音:)。需要注意的重要事情是,我已将其报告为消息应用程序问题。以前大多数漏洞都被报告为Web漏洞,而那里没有得到修复。但看起来消息应用程序团队更加乐于助人:)。 - Łukasz Jagodziński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接