覆盖或自定义默认的“longpress mailto:”行为
问题描述:
目前我正在开发一个电子邮件应用程序,并希望通过我的应用程序打开所有带有mailto方案的链接,而不是默认的Apple Mail应用程序。覆盖或自定义默认的“longpress mailto:”行为
举例来说,我有这样一个
<a href="mailto:[email protected]\>mailto_test</a>
在UIWebView中或UITextView的(无所谓哪一个,他们也有类似的行为)
的链接。
当我长按该链接的iOS会显示UIAlertController有3个选项:
第一个选项,“新邮件”,会打开默认的邮件应用程序。所以我的问题是如何覆盖这种行为?我如何强制这个选项启动我自己的电子邮件应用程序?
对于那些认为这是不可能的 - 看看iOS的Gmail应用程序。 Gmail开发者已经实现了我所问的内容,但我不明白。
答
在文本视图中,链接行为完全取决于您。给文本视图委托并实现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
文本后的默认效果。所以我们添加一个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只是邮件的URL。
UIWebView中已被弃用。你应该使用WKWebView。 – matt
@matt我想知道它是如何改变任何事情的,它是如何与我的问题相关的 – user1248568
你发现答案是什么吗?现在我真的很好奇 –