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 MobileProxy
Krok 1. Tworzenie bibliotek mobilnych MobileProxy
Użyj gomobile, aby skompilować kod Go w biblioteki na Androida i iOS.
Sklonuj repozytorium Outline SDK:
git clone https://github.com/Jigsaw-Code/outline-sdk.git cd outline-sdk/x
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 konfiguracjiSmartDialer
. 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.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:
- Utwórz bibliotekę Go: opracuj pakiet Go, który zawiera wymagane funkcje pakietu SDK.
- Generowanie bibliotek mobilnych: użyj
gomobile bind
do wygenerowania archiwów Androida (AAR) i ramek Apple. Przykłady: - Integracja z aplikacją: dodaj wygenerowaną bibliotekę do aplikacji mobilnej.