Dodawanie pakietu Outline SDK do aplikacji mobilnej

Z tego dokumentu dowiesz się, jak zintegrować Outline SDK z aplikacją mobilną. Omówiono w nim bibliotekę MobileProxy, która upraszcza zarządzanie lokalnymi serwerami proxy.

MobileProxy to biblioteka w języku Go, która ma na celu usprawnienie integracji funkcji proxy w aplikacjach mobilnych. Używa ona GoMobile do generowania bibliotek mobilnych, co umożliwia konfigurowanie bibliotek sieciowych aplikacji w celu kierowania ruchu przez lokalny serwer proxy.

Aplikacja bez MobileProxy

Aplikacja z treściami bez MobileProxy

Aplikacja z MobileProxy

Aplikacja z treściami z MobileProxy

Krok 1. Tworzenie bibliotek mobilnych MobileProxy

Użyj gomobile, aby skompilować kod Go w biblioteki na Androida i iOS.

  1. Sklonuj repozytorium Outline SDK:

    git clone https://github.com/Jigsaw-Code/outline-sdk.git
    cd outline-sdk/x
    
  2. Utwórz binarne pliki Go Mobile za pomocą go build:

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

    Dodawanie obsługi Psiphon

    Aby dodać obsługę sieci Psiphon, wykonaj te dodatkowe czynności:

    • Skontaktuj się z zespołem Psiphon, aby uzyskać konfigurację, która zapewni Ci dostęp do ich sieci. Może być wymagana umowa.
    • Dodaj otrzymaną konfigurację Psiphon do sekcji fallback w konfiguracji SmartDialer.
    • Utwórz mobilny serwer proxy, używając flagi -tags psiphon:

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

    Flaga -tags psiphon jest wymagana, ponieważ kod źródłowy Psiphon jest licencjonowany na podstawie GPL, co może nakładać ograniczenia licencyjne na Twój kod. Możesz rozważyć uzyskanie od nich specjalnej licencji.

  3. Wygeneruj biblioteki mobilne i dodaj je do projektu:

    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
    

    Aby zaimportować wygenerowany pakiet out/mobileproxy.aar, w Android Studio kliknij Plik > Importuj projekt…. Więcej informacji znajdziesz w artykule Tworzenie i wdrażanie aplikacji na Androida w Go Mobile.

    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
    

    Przeciągnij pakiet out/mobileproxy.xcframework do projektu Xcode. Więcej informacji znajdziesz w artykule Tworzenie i wdrażanie aplikacji na iOS w Go Mobile.

Krok 2. Uruchom MobileProxy

Zainicjuj i uruchom lokalny serwer proxy MobileProxy w czasie wykonywania aplikacji. Do dynamicznego wyboru strategii możesz użyć statycznej konfiguracji transportu lub inteligentnego serwera proxy.

  • Statyczna konfiguracja transportu: użyj funkcji RunProxy z adresem lokalnym i konfiguracją transportu.

    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()
    
  • Inteligentny serwer proxy: inteligentny serwer proxy dynamicznie wybiera strategie DNS i TLS na podstawie określonych domen testowych. Musisz określić strategię konfiguracji w formacie YAML (przykład).

    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()
    

Krok 3. Skonfiguruj klientów HTTP i biblioteki sieciowe

Skonfiguruj biblioteki sieciowe, aby używały lokalnego adresu i portu serwera proxy.

Dart/Flutter HttpClient

Ustaw serwer proxy za pomocą HttpClient.findProxy.

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

OkHttp (Android)

Ustaw serwer proxy za pomocą OkHttpClient.Builder.proxy.

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

JVM (Java, Kotlin)

Skonfiguruj serwer proxy do użycia za pomocą właściwości systemowych:

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 Web View

Zastosowanie konfiguracji serwera proxy do wszystkich widoków internetowych w aplikacji za pomocą biblioteki 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
    )

Widok internetowy na iOS

Od iOS 17 możesz dodać konfigurację serwera proxy do WKWebView za pomocą WKWebsiteDataStore usługi:

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)

Zaawansowane: generowanie niestandardowej biblioteki mobilnej

W zaawansowanych przypadkach użycia możesz generować własne biblioteki mobilne:

  1. Utwórz bibliotekę Go: opracuj pakiet Go, który zawiera wymagane funkcje pakietu SDK.
  2. Generowanie bibliotek mobilnych: użyj gomobile bind do wygenerowania archiwów Androida (AAR) i ramek Apple. Przykłady:
  3. Integracja z aplikacją: dodaj wygenerowaną bibliotekę do aplikacji mobilnej.