अपने मोबाइल ऐप्लिकेशन में Outline SDK टूल जोड़ना

इस दस्तावेज़ में, अपने मोबाइल ऐप्लिकेशन में Outline SDK टूल को इंटिग्रेट करने का तरीका बताया गया है. इसमें, आसानी से लोकल प्रॉक्सी मैनेज करने के लिए MobileProxy लाइब्रेरी पर फ़ोकस किया गया है.

MobileProxy, Go पर आधारित लाइब्रेरी है. इसे मोबाइल ऐप्लिकेशन में, प्रोक्सी की सुविधाओं को इंटिग्रेट करने के लिए डिज़ाइन किया गया है. यह मोबाइल लाइब्रेरी जनरेट करने के लिए, Go Mobile का इस्तेमाल करता है. इससे, अपने ऐप्लिकेशन की नेटवर्किंग लाइब्रेरी को कॉन्फ़िगर करके, ट्रैफ़िक को लोकल प्रोक्सी के ज़रिए रूट किया जा सकता है.

MobileProxy के बिना ऐप्लिकेशन

MobileProxy के बिना कॉन्टेंट ऐप्लिकेशन

MobileProxy का इस्तेमाल करने वाला ऐप्लिकेशन

MobileProxy वाला कॉन्टेंट ऐप्लिकेशन

पहला चरण: MobileProxy मोबाइल लाइब्रेरी बनाना

Android और iOS के लिए, Go कोड को लाइब्रेरी में कंपाइल करने के लिए, gomobile का इस्तेमाल करें.

  1. Outline SDK टूल के डेटा स्टोर करने की जगह को क्लोन करें:

    git clone https://github.com/Jigsaw-Code/outline-sdk.git
    cd outline-sdk/x
    
  2. go build की मदद से, Go Mobile के बाइनरी बनाएं:

    go build -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
    

    Psiphon के लिए सहायता जोड़ना

    Psiphon नेटवर्क का इस्तेमाल करने के लिए, इन अतिरिक्त चरणों को अपनाएं:

    • Psiphon की टीम से संपर्क करके, ऐसा कॉन्फ़िगरेशन पाएं जिससे आपको उनके नेटवर्क का ऐक्सेस मिल सके. इसके लिए, कानूनी समझौते की ज़रूरत पड़ सकती है.
    • Psiphon से मिला कॉन्फ़िगरेशन, अपने SmartDialer कॉन्फ़िगरेशन के fallback सेक्शन में जोड़ें.
    • -tags psiphon फ़्लैग का इस्तेमाल करके मोबाइल प्रॉक्सी बनाएं:

      go build -tags psiphon -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
      

    -tags psiphon फ़्लैग ज़रूरी है, क्योंकि Psiphon के कोडबेस को GPL के तहत लाइसेंस दिया गया है. इससे आपके कोड पर लाइसेंस से जुड़ी पाबंदियां लगाई जा सकती हैं. आपके पास उनसे कोई खास लाइसेंस लेने का विकल्प है.

  3. मोबाइल लाइब्रेरी जनरेट करें और उन्हें अपने प्रोजेक्ट में जोड़ें:

    Android

    PATH="$(pwd)/out:$PATH" gomobile bind -ldflags='-s -w' -target=android -androidapi=21 -o "$(pwd)/out/mobileproxy.aar" github.com/Jigsaw-Code/outline-sdk/x/mobileproxy
    

    जनरेट किया गया out/mobileproxy.aar बंडल इंपोर्ट करने के लिए, Android Studio में फ़ाइल > प्रोजेक्ट इंपोर्ट करें… को चुनें. ज़्यादा मदद पाने के लिए, Go Mobile की Android पर ऐप्लिकेशन बनाना और डिप्लॉय करना लेख पढ़ें.

    iOS

    PATH="$(pwd)/out:$PATH" gomobile bind -ldflags='-s -w' -target=ios -iosversion=11.0 -o "out/mobileproxy.xcframework" github.com/Jigsaw-Code/outline-sdk/x/mobileproxy
    

    out/mobileproxy.xcframework बंडल को Xcode प्रोजेक्ट में खींचें और छोड़ें. ज़्यादा मदद पाने के लिए, Go Mobile की iOS के लिए ऐप्लिकेशन बनाना और डिप्लॉय करना लेख पढ़ें.

दूसरा चरण: MobileProxy चलाना

अपने ऐप्लिकेशन के रनटाइम में, MobileProxy लोकल प्रॉक्सी को शुरू और चालू करें. डाइनैमिक रणनीति चुनने के लिए, स्टैटिक ट्रांसपोर्ट कॉन्फ़िगरेशन या स्मार्ट प्रॉक्सी का इस्तेमाल किया जा सकता है.

  • स्टैटिक ट्रांसपोर्ट कॉन्फ़िगरेशन: स्थानीय पते और ट्रांसपोर्ट कॉन्फ़िगरेशन के साथ RunProxy फ़ंक्शन का इस्तेमाल करें.

    Android

    import mobileproxy.*
    
    val dialer = StreamDialer("split:3")
    
    // Use port zero to let the system pick an open port for you.
    val proxy = Mobileproxy.runProxy("localhost:0", dialer)
    // Configure your networking library using proxy.host() and proxy.port() or proxy.address().
    // ...
    // Stop running the proxy.
    proxy.stop()
    

    iOS

    import Mobileproxy
    
    let dialer = MobileproxyStreamDialer("split:3")
    
    // Use port zero to let the system pick an open port for you.
    let proxy = MobileproxyRunProxy("localhost:0", dialer)
    // Configure your networking library using proxy.host() and proxy.port() or proxy.address().
    // ...
    // Stop running the proxy.
    proxy.stop()
    
  • स्मार्ट प्रॉक्सी: स्मार्ट प्रॉक्सी, टेस्ट के लिए चुने गए डोमेन के आधार पर, डीएनएस और TLS की रणनीतियों को डाइनैमिक तौर पर चुनता है. आपको कॉन्फ़िगरेशन की रणनीति को YAML फ़ॉर्मैट में बताना होगा (उदाहरण).

    Android

    val testDomains = Mobileproxy.newListFromLines("www.youtube.com\ni.ytimg.com")
    val strategiesConfig = "..."  // Config YAML.
    val dialer = Mobileproxy.newSmartStreamDialer(testDomains, strategiesConfig, Mobileproxy.newStderrLogWriter())
    
    // Use port zero to let the system pick an open port for you.
    val proxy = Mobileproxy.runProxy("localhost:0", dialer)
    // Configure your networking library using proxy.host() and proxy.port() or proxy.address().
    // ...
    // Stop running the proxy.
    proxy.stop()
    

    iOS

    import Mobileproxy
    
    var dialerError: NSError?
    let testDomains = MobileproxyNewListFromLines("www.youtube.com\ni.ytimg.com")
    let strategiesConfig = "..."  // Config YAML.
    let dialer = MobileproxyNewSmartStreamDialer(
        testDomains,
        strategiesConfig,
        MobileproxyNewStderrLogWriter(),
        &dialerError
    )
    
    var proxyError: NSError?
    // Use port zero to let the system pick an open port for you.
    MobileproxyRunProxy("localhost:0", dialer, &proxyError)
    // Configure your networking library using proxy.host() and proxy.port() or proxy.address().
    // ...
    // Stop running the proxy.
    proxy.stop()
    

तीसरा चरण: एचटीटीपी क्लाइंट और नेटवर्किंग लाइब्रेरी कॉन्फ़िगर करना

लोकल प्रॉक्सी पते और पोर्ट का इस्तेमाल करने के लिए, अपनी नेटवर्किंग लाइब्रेरी कॉन्फ़िगर करें.

Dart/Flutter HttpClient

HttpClient.findProxy की मदद से प्रॉक्सी सेट करें.

HttpClient client = HttpClient();
client.findProxy = (Uri uri) {
  return "PROXY " + proxy.address();
};

OkHttp (Android)

OkHttpClient.Builder.proxy की मदद से प्रॉक्सी सेट करें.

val proxyConfig = Proxy(Proxy.Type.HTTP, InetSocketAddress(proxy.host(), proxy.port()))
val client = OkHttpClient.Builder().proxy(proxyConfig).build()

जेवीएम (Java, Kotlin)

system properties के साथ इस्तेमाल करने के लिए, प्रॉक्सी को कॉन्फ़िगर करें:

System.setProperty("http.proxyHost", proxy.host())
System.setProperty("http.proxyPort", String.valueOf(proxy.port()))
System.setProperty("https.proxyHost", proxy.host())
System.setProperty("https.proxyPort", String.valueOf(proxy.port()))

Android वेब व्यू

androidx.webview लाइब्रेरी का इस्तेमाल करके, अपने ऐप्लिकेशन के सभी वेब व्यू पर प्रॉक्सी कॉन्फ़िगरेशन लागू करें:

ProxyController.getInstance()
    .setProxyOverride(
        ProxyConfig.Builder()
            .addProxyRule(this.proxy!!.address())
            .build(),
        {}, // execution context for the following callback - do anything needed here once the proxy is applied, like refreshing web views
        {} // callback to be called once the ProxyConfig is applied
    )

iOS वेब व्यू

iOS 17 में, WKWebView में प्रॉक्सी कॉन्फ़िगरेशन जोड़ा जा सकता है. इसके लिए, WKWebView की WKWebsiteDataStore प्रॉपर्टी का इस्तेमाल करें:

let configuration = WKWebViewConfiguration()
let endpoint = NWEndpoint.hostPort(host: NWEndpoint.Host(proxyHost), port: NWEndpoint.Port(proxyPort)!)
let proxyConfig = ProxyConfiguration.init(httpCONNECTProxy: endpoint)
let websiteDataStore = WKWebsiteDataStore.default()
websiteDataStore.proxyConfigurations = [proxyConfig]
let webview = WKWebView(configuration: configuration)

बेहतर सुविधा: कस्टम मोबाइल लाइब्रेरी जनरेट करना

बेहतर इस्तेमाल के उदाहरणों के लिए, अपनी मोबाइल लाइब्रेरी जनरेट की जा सकती हैं:

  1. Go लाइब्रेरी बनाना: SDK टूल की ज़रूरी सुविधाओं को रैप करके, Go पैकेज बनाएं.
  2. मोबाइल लाइब्रेरी जनरेट करना: Android Archive (AAR) और Apple फ़्रेमवर्क बनाने के लिए, gomobile bind का इस्तेमाल करें. उदाहरण:
  3. अपने ऐप्लिकेशन में इंटिग्रेट करना: जनरेट की गई लाइब्रेरी को अपने मोबाइल ऐप्लिकेशन में जोड़ें.