覆盖或自定义默认" longpress mailto:"行为

时间:2017-10-10 13:57:35

标签: ios uiwebview uitextview

目前我正在开发一个电子邮件应用程序,并希望通过我的应用程序打开所有带有mailto方案的链接,而不是默认的Apple的邮件应用程序。

例如,我有一个像这样的链接

<a href="mailto:email@example.com\>mailto_test</a>
UIWebView或UITextView中的

(与哪一个无关,它们具有相似的行为)。

当我长按此链接时,iOS会向UIAlertController显示3个选项:

enter image description here

第一个选项&#34; New Message&#34;,将打开默认的Mail应用程序。所以我的问题是如何覆盖这种行为?如何强制此选项启动我自己的电子邮件应用程序?

对于那些认为不可能的人 - 请看一下iOS Gmail应用。 Gmail开发者已经实现了我所询问的内容,但我不明白这一点。

3 个答案:

答案 0 :(得分:4)

在文本视图中,链接行为完全取决于您。为文本视图提供委托并实施textView(_:shouldInteractWith:in:interaction:)。长按是.presentActions互动。返回false并替换您自己的回复。您可以设置自己的.actionSheet警报,该警报看起来就像默认警报一样,但可以按照您的要求进行操作。

答案 1 :(得分:1)

解决方案是将邮件链接的默认点击操作更改为您想要的方式。

制作一个UITextView示例:

假设我们有UITextView textView,其attributeString

<a href="mailto:email@example.com\>mailto_test</a>

,其documentType是html。代码如下:

let textView = UITextView(frame: view.bounds)
textView.frame.origin.y += 100

let attrStr = try! NSAttributedString(
    data: "<a href=\"mailto:email@example.com\">mailto_test</a>".data(using: .utf8, allowLossyConversion: true)!,
    options:[.documentType: NSAttributedString.DocumentType.html],
    documentAttributes: nil)

textView.attributedText = attrStr
view.addSubview(textView)

这是默认效果,在屏幕中按下mailto_test文本后,本机邮件应用程序功能被唤醒。因此,我们向delegate添加textView以修改点击操作。

textView.isEditable = false
textView.dataDetectorTypes = .link
textView.delegate = self

以下是控制特定点击操作的委托功能:

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
    print(URL)
    return false
}

每当您按下邮件链接时,调用的函数都不会调用本机邮件应用程序。而URL只是邮件网址。

答案 2 :(得分:0)

你正在寻找这样的东西,对吗?您可以从任何地方打开应用程序,点击电子邮件URL。

enter image description here

我现在无法找到确切答案,但您想将自己的应用添加为网址计划(Apple documentation

修改:more apple documentation