1 // Copyright 2015-present 650 Industries. All rights reserved. 2 3 import Foundation 4 5 @objc 6 public class EXDevLauncherUrl: NSObject { 7 @objc 8 public var url: URL 9 10 @objc 11 public var queryParams: [String: String] 12 13 @objc 14 public init(_ url: URL) { 15 self.queryParams = EXDevLauncherURLHelper.getQueryParamsForUrl(url) 16 self.url = url 17 18 if (EXDevLauncherURLHelper.isDevLauncherURL(url)) { 19 if let urlParam = self.queryParams["url"] { 20 if let urlFromParam = URL.init(string: urlParam) { 21 self.url = EXDevLauncherURLHelper.replaceEXPScheme(urlFromParam, to: "http") 22 } 23 } 24 } 25 26 super.init() 27 } 28 } 29 30 @objc 31 public class EXDevLauncherURLHelper: NSObject { 32 @objc 33 public static func isDevLauncherURL(_ url: URL?) -> Bool { 34 return url?.host == "expo-development-client" 35 } 36 37 @objc 38 public static func hasUrlQueryParam(_ url: URL) -> Bool { 39 var hasUrlQueryParam = false 40 41 let components = URLComponents.init(url: url, resolvingAgainstBaseURL: false) 42 43 for queryItem in components?.queryItems ?? [] { 44 if queryItem.name == "url" && queryItem.value != nil { 45 hasUrlQueryParam = true 46 break 47 } 48 } 49 50 return hasUrlQueryParam 51 } 52 53 @objc 54 public static func replaceEXPScheme(_ url: URL, to scheme: String) -> URL { 55 var components = URLComponents.init(url: url, resolvingAgainstBaseURL: false)! 56 if (components.scheme == "exp") { 57 components.scheme = scheme 58 } 59 return components.url! 60 } 61 62 @objc 63 public static func getQueryParamsForUrl(_ url: URL) -> [String: String] { 64 let components = URLComponents.init(url: url, resolvingAgainstBaseURL: false) 65 var dict: [String: String] = [:] 66 67 for parameter in components?.queryItems ?? [] { 68 dict[parameter.name] = parameter.value?.removingPercentEncoding ?? "" 69 } 70 71 return dict 72 } 73 } 74