mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
tonsite url handling
This commit is contained in:
parent
8cc282e2c3
commit
db1541b2c4
@ -419,6 +419,7 @@ plist_fragment(
|
|||||||
<key>CFBundleURLSchemes</key>
|
<key>CFBundleURLSchemes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>tg</string>
|
<string>tg</string>
|
||||||
|
<string>tonsite</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
|
@ -10,7 +10,7 @@ import AccountContext
|
|||||||
import WebKit
|
import WebKit
|
||||||
import AppBundle
|
import AppBundle
|
||||||
|
|
||||||
private final class IpfsSchemeHandler: NSObject, WKURLSchemeHandler {
|
/*private final class IpfsSchemeHandler: NSObject, WKURLSchemeHandler {
|
||||||
private final class PendingTask {
|
private final class PendingTask {
|
||||||
let sourceTask: any WKURLSchemeTask
|
let sourceTask: any WKURLSchemeTask
|
||||||
var urlSessionTask: URLSessionTask?
|
var urlSessionTask: URLSessionTask?
|
||||||
@ -71,6 +71,81 @@ private final class IpfsSchemeHandler: NSObject, WKURLSchemeHandler {
|
|||||||
self.pendingTasks.append(PendingTask(sourceTask: urlSchemeTask))
|
self.pendingTasks.append(PendingTask(sourceTask: urlSchemeTask))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func webView(_ webView: WKWebView, stop urlSchemeTask: any WKURLSchemeTask) {
|
||||||
|
if let index = self.pendingTasks.firstIndex(where: { $0.sourceTask === urlSchemeTask }) {
|
||||||
|
let task = self.pendingTasks[index]
|
||||||
|
self.pendingTasks.remove(at: index)
|
||||||
|
task.cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
private final class TonSchemeHandler: NSObject, WKURLSchemeHandler {
|
||||||
|
private final class PendingTask {
|
||||||
|
let sourceTask: any WKURLSchemeTask
|
||||||
|
var urlSessionTask: URLSessionTask?
|
||||||
|
let isCompleted = Atomic<Bool>(value: false)
|
||||||
|
|
||||||
|
init(sourceTask: any WKURLSchemeTask) {
|
||||||
|
self.sourceTask = sourceTask
|
||||||
|
|
||||||
|
var mappedHost: String = ""
|
||||||
|
if let host = sourceTask.request.url?.host {
|
||||||
|
mappedHost = host
|
||||||
|
mappedHost = mappedHost.replacingOccurrences(of: "-", with: "-h")
|
||||||
|
mappedHost = mappedHost.replacingOccurrences(of: ".", with: "-d")
|
||||||
|
}
|
||||||
|
|
||||||
|
var mappedPath = ""
|
||||||
|
if let path = sourceTask.request.url?.path, !path.isEmpty {
|
||||||
|
mappedPath = path
|
||||||
|
if !path.hasPrefix("/") {
|
||||||
|
mappedPath = "/\(mappedPath)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mappedUrl = "https://\(mappedHost).magic.org\(mappedPath)"
|
||||||
|
let isCompleted = self.isCompleted
|
||||||
|
self.urlSessionTask = URLSession.shared.dataTask(with: URLRequest(url: URL(string: mappedUrl)!), completionHandler: { data, response, error in
|
||||||
|
if isCompleted.swap(true) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if let error {
|
||||||
|
sourceTask.didFailWithError(error)
|
||||||
|
} else {
|
||||||
|
if let response {
|
||||||
|
sourceTask.didReceive(response)
|
||||||
|
}
|
||||||
|
if let data {
|
||||||
|
sourceTask.didReceive(data)
|
||||||
|
}
|
||||||
|
sourceTask.didFinish()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
self.urlSessionTask?.resume()
|
||||||
|
}
|
||||||
|
|
||||||
|
func cancel() {
|
||||||
|
if let urlSessionTask = self.urlSessionTask {
|
||||||
|
self.urlSessionTask = nil
|
||||||
|
if !self.isCompleted.swap(true) {
|
||||||
|
switch urlSessionTask.state {
|
||||||
|
case .running, .suspended:
|
||||||
|
urlSessionTask.cancel()
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var pendingTasks: [PendingTask] = []
|
||||||
|
|
||||||
|
func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) {
|
||||||
|
self.pendingTasks.append(PendingTask(sourceTask: urlSchemeTask))
|
||||||
|
}
|
||||||
|
|
||||||
func webView(_ webView: WKWebView, stop urlSchemeTask: any WKURLSchemeTask) {
|
func webView(_ webView: WKWebView, stop urlSchemeTask: any WKURLSchemeTask) {
|
||||||
if let index = self.pendingTasks.firstIndex(where: { $0.sourceTask === urlSchemeTask }) {
|
if let index = self.pendingTasks.firstIndex(where: { $0.sourceTask === urlSchemeTask }) {
|
||||||
let task = self.pendingTasks[index]
|
let task = self.pendingTasks[index]
|
||||||
@ -95,10 +170,7 @@ final class BrowserWebContent: UIView, BrowserContent, UIScrollViewDelegate {
|
|||||||
init(context: AccountContext, url: String) {
|
init(context: AccountContext, url: String) {
|
||||||
let configuration = WKWebViewConfiguration()
|
let configuration = WKWebViewConfiguration()
|
||||||
|
|
||||||
if context.sharedContext.immediateExperimentalUISettings.browserExperiment {
|
configuration.setURLSchemeHandler(TonSchemeHandler(), forURLScheme: "tonsite")
|
||||||
configuration.setURLSchemeHandler(IpfsSchemeHandler(), forURLScheme: "ipns")
|
|
||||||
configuration.setURLSchemeHandler(IpfsSchemeHandler(), forURLScheme: "ipfs")
|
|
||||||
}
|
|
||||||
|
|
||||||
self.webView = WKWebView(frame: CGRect(), configuration: configuration)
|
self.webView = WKWebView(frame: CGRect(), configuration: configuration)
|
||||||
self.webView.allowsLinkPreview = false
|
self.webView.allowsLinkPreview = false
|
||||||
|
@ -251,16 +251,10 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
|
|||||||
|> deliverOnMainQueue).startStandalone(next: handleResolvedUrl)
|
|> deliverOnMainQueue).startStandalone(next: handleResolvedUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
if context.sharedContext.immediateExperimentalUISettings.browserExperiment {
|
if let scheme = parsedUrl.scheme, (scheme == "tg" || scheme == context.sharedContext.applicationBindings.appSpecificScheme) {
|
||||||
if let scheme = parsedUrl.scheme, (scheme == "tg" || scheme == context.sharedContext.applicationBindings.appSpecificScheme) {
|
if parsedUrl.host == "tonsite" {
|
||||||
if parsedUrl.host == "ipfs" {
|
if let value = URL(string: "tonsite:/" + parsedUrl.path) {
|
||||||
if let value = URL(string: "ipfs:/" + parsedUrl.path) {
|
parsedUrl = value
|
||||||
parsedUrl = value
|
|
||||||
}
|
|
||||||
} else if parsedUrl.host == "ton" {
|
|
||||||
if let value = URL(string: "ton:/" + parsedUrl.path) {
|
|
||||||
parsedUrl = value
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1008,10 +1002,8 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
|
|||||||
if parsedUrl.scheme == "http" || parsedUrl.scheme == "https" {
|
if parsedUrl.scheme == "http" || parsedUrl.scheme == "https" {
|
||||||
isInternetUrl = true
|
isInternetUrl = true
|
||||||
}
|
}
|
||||||
if context.sharedContext.immediateExperimentalUISettings.browserExperiment {
|
if parsedUrl.scheme == "tonsite" {
|
||||||
if parsedUrl.scheme == "ipfs" || parsedUrl.scheme == "ipns" || parsedUrl.scheme == "ton" {
|
isInternetUrl = true
|
||||||
isInternetUrl = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if isInternetUrl {
|
if isInternetUrl {
|
||||||
@ -1045,7 +1037,8 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
|
|||||||
let _ = (settings
|
let _ = (settings
|
||||||
|> deliverOnMainQueue).startStandalone(next: { settings in
|
|> deliverOnMainQueue).startStandalone(next: { settings in
|
||||||
if settings.defaultWebBrowser == nil {
|
if settings.defaultWebBrowser == nil {
|
||||||
if isCompact && context.sharedContext.immediateExperimentalUISettings.browserExperiment {
|
//TODO:release check !isCompact
|
||||||
|
if isCompact || "".isEmpty {
|
||||||
let controller = BrowserScreen(context: context, subject: .webPage(url: parsedUrl.absoluteString))
|
let controller = BrowserScreen(context: context, subject: .webPage(url: parsedUrl.absoluteString))
|
||||||
navigationController?.pushViewController(controller)
|
navigationController?.pushViewController(controller)
|
||||||
} else {
|
} else {
|
||||||
|
@ -130,13 +130,8 @@ public func parseInternalUrl(sharedContext: SharedAccountContext, query: String)
|
|||||||
if !pathComponents.isEmpty && !pathComponents[0].isEmpty {
|
if !pathComponents.isEmpty && !pathComponents[0].isEmpty {
|
||||||
let peerName: String = pathComponents[0]
|
let peerName: String = pathComponents[0]
|
||||||
|
|
||||||
if sharedContext.immediateExperimentalUISettings.browserExperiment {
|
if query.hasPrefix("tonsite/") {
|
||||||
if query.hasPrefix("ipfs/") {
|
return .externalUrl(url: "tonsite://" + String(query[query.index(query.startIndex, offsetBy: "tonsite/".count)...]))
|
||||||
return .externalUrl(url: "ipfs://" + String(query[query.index(query.startIndex, offsetBy: "ipfs/".count)...]))
|
|
||||||
}
|
|
||||||
if query.hasPrefix("ton/") {
|
|
||||||
return .externalUrl(url: "ton://" + String(query[query.index(query.startIndex, offsetBy: "ton/".count)...]))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if pathComponents[0].hasPrefix("+") || pathComponents[0].hasPrefix("%20") {
|
if pathComponents[0].hasPrefix("+") || pathComponents[0].hasPrefix("%20") {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user