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

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

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

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

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

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

MobileProxy की सुविधा वाला कॉन्टेंट ऐप्लिकेशन

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

Go कोड को Android और iOS के लिए लाइब्रेरी में कंपाइल करने के लिए, 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 से मिले कॉन्फ़िगरेशन को, fallback सेक्शन में जोड़ें. यह सेक्शन, SmartDialer कॉन्फ़िगरेशन में मौजूद होता है.
    • -tags psiphon फ़्लैग का इस्तेमाल करके, मोबाइल प्रॉक्सी बनाएं:

      go build -tags psiphon -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
      
    • अपने नेटिव कोड में, Psiphon को स्मार्ट डायलर के साथ रजिस्टर करें.

    -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 में File > Import Project… को चुनें. ज़्यादा मदद के लिए, Go Mobile का Android पर बनाना और डिप्लॉय करना लेख पढ़ें.

    iOS

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

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

दूसरा चरण: MobileProxy को चलाएं

  1. अपने ऐप्लिकेशन के रनटाइम में 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()
    
  • स्मार्ट प्रॉक्सी: स्मार्ट प्रॉक्सी, तय किए गए टेस्ट डोमेन के आधार पर, डीएनएस और टीएलएस की रणनीतियों को डाइनैमिक तरीके से चुनती है. आपको कॉन्फ़िगरेशन की रणनीति को 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()
    
  1. इसके बाद, अगर Psiphon का इस्तेमाल किया जा रहा है, तो अपने नेटिव कोड में Smart Dialer के विकल्पों के साथ Psiphon को रजिस्टर करें.

Android:

import mobileproxy.Mobileproxy
import psiphon.Psiphon

// ...

val testDomains = Mobileproxy.newListFromLines("www.google.com\ni.ytimg.com")
// You can get a Psiphon config from the Psiphon team at sponsor@psiphon.ca.
val psiphonConfig = "<YOUR_PSIPHON_CONFIG_JSON_HERE>"
val config = """
dns:
  - {system: {}}
tls:
  - ""
fallback:
  - {"psiphon": \(psiphonConfig)}
"""

val options = Mobileproxy.newSmartDialerOptions(testDomains, config)

// Register Psiphon
Psiphon.registerConfig(options, "psiphon")

try {
    // Create the dialer
    val dialer = options.newStreamDialer()
    // ... use the dialer
} catch (e: Exception) {
    // Handle error
}

iOS:

import Mobileproxy
import Psiphon

// ...

let testDomains = MobileproxyNewListFromLines("www.google.com\ni.ytimg.com")
// You can get a Psiphon config from the Psiphon team at sponsor@psiphon.ca.
let psiphonConfig = "<YOUR_PSIPHON_CONFIG_JSON_HERE>"
let config = """
dns:
  - {system: {}}
tls:
  - ""
fallback:
  - {"psiphon": \(psiphonConfig)}
"""

let options = MobileproxyNewSmartDialerOptions(testDomains, config)

// Register Psiphon
PsiphonRegisterConfig(options, "psiphon")

do {
    // Create the dialer
    let dialer = try options.newStreamDialer()
    // ... use the dialer
} catch {
    // Handle error
}

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

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

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.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 में प्रॉक्सी कॉन्फ़िगरेशन जोड़ा जा सकता है. इसके लिए, 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. अपने ऐप्लिकेशन में इंटिग्रेट करें: जनरेट की गई लाइब्रेरी को अपने मोबाइल ऐप्लिकेशन में जोड़ें.