覆盖或自定义默认的“longpress mailto:”行为

问题描述:

目前我正在开发一个电子邮件应用程序,并希望通过我的应用程序打开所有带有mailto方案的链接,而不是默认的Apple Mail应用程序。覆盖或自定义默认的“longpress mailto:”行为

举例来说,我有这样一个

<a href="mailto:[email protected]\>mailto_test</a> 
在UIWebView中或UITextView的(无所谓哪一个,他们也有类似的行为)

的链接。

当我长按该链接的iOS会显示UIAlertController有3个选项:

enter image description here

第一个选项,“新邮件”,会打开默认的邮件应用程序。所以我的问题是如何覆盖这种行为?我如何强制这个选项启动我自己的电子邮件应用程序?

对于那些认为这是不可能的 - 看看iOS的Gmail应用程序。 Gmail开发者已经实现了我所问的内容,但我不明白。

+1

UIWebView中已被弃用。你应该使用WKWebView。 – matt

+0

@matt我想知道它是如何改变任何事情的,它是如何与我的问题相关的 – user1248568

+0

你发现答案是什么吗?现在我真的很好奇 –

在文本视图中,链接行为完全取决于您。给文本视图委托并实现textView(_:shouldInteractWith:in:interaction:)。长按是.presentActions互动。返回false并替换您自己的回复。你可以建立你自己的.actionSheet警报,看起来就像默认的警报,但做你想要的。

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

做一个UITextView例如:

假设我们有UITextView TextView的,其attributeString

<a href="mailto:[email protected]\>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 protected]\">mailto_test</a>".data(using: .utf8, allowLossyConversion: true)!, 
    options:[.documentType: NSAttributedString.DocumentType.html], 
    documentAttributes: nil) 

textView.attributedText = attrStr 
view.addSubview(textView) 

这是压在屏幕的机邮件应用程序功能唤醒了mailto_test文本后的默认效果。所以我们添加一个delegatetextView来修改点击动作。

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只是邮件的URL。

您正在寻找类似的东西,对吧?您可以在任何地方点击电子邮件网址来打开您的应用程序。

enter image description here

我无法找到确切的答案,现在,但你想你的应用程序添加为URL方案(Apple documentation

编辑:more apple documentation