Skip to main content

Overview

LinkPayload is a public enum that represents the payload data passed to link tap handlers. It provides type-safe access to link data, distinguishing between URL links and string-based links. Source: Sources/MarkdownView/Supplements/LinkPayload.swift

Definition

public enum LinkPayload {
    case url(URL)
    case string(String)
}

Cases

url
URL
A link with a valid URL object. This case is used for standard web links or any links that can be parsed as URLs.
case .url(let url):
    UIApplication.shared.open(url)
string
String
A link represented as a raw string. This case is used for malformed URLs, custom URL schemes, or links that don’t parse as valid URLs.
case .string(let string):
    print("Link string: \(string)")

Usage

LinkPayload is primarily used with MarkdownTextView’s linkHandler closure:
markdownView.linkHandler = { payload, range, point in
    switch payload {
    case .url(let url):
        // Handle valid URL
        UIApplication.shared.open(url)
        
    case .string(let string):
        // Handle string link
        print("Tapped link: \(string)")
    }
}

Common patterns

Opening URLs

markdownView.linkHandler = { payload, range, point in
    guard case .url(let url) = payload else { return }
    UIApplication.shared.open(url)
}

Custom URL schemes

markdownView.linkHandler = { payload, range, point in
    switch payload {
    case .url(let url) where url.scheme == "myapp":
        // Handle custom scheme
        handleCustomScheme(url)
        
    case .url(let url):
        // Handle standard URLs
        UIApplication.shared.open(url)
        
    case .string(let string):
        // Handle malformed links
        print("Invalid link: \(string)")
    }
}

Logging and analytics

markdownView.linkHandler = { payload, range, point in
    let linkString: String
    switch payload {
    case .url(let url):
        linkString = url.absoluteString
    case .string(let string):
        linkString = string
    }
    
    analytics.log("link_tapped", properties: ["url": linkString])
    
    if case .url(let url) = payload {
        UIApplication.shared.open(url)
    }
}

Build docs developers (and LLMs) love