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