Bu belgede, Outline SDK'yı mobil uygulamalarınıza nasıl entegre edeceğiniz açıklanmaktadır. Basitleştirilmiş yerel proxy yönetimi için MobileProxy
kitaplığına odaklanılmıştır.
Go temelli bir kitaplık olan MobileProxy
, proxy işlevlerini mobil uygulamalara entegrasyonunu iyileştirmek için tasarlanmıştır. Mobil uygulama kitaplıklarını oluşturmak için Go Mobile'dan yararlanır. Böylece, uygulamanızın ağ kitaplıklarını trafiği yerel bir proxy üzerinden yönlendirecek şekilde yapılandırabilirsiniz.
MobileProxy kullanılmayan uygulama
MobileProxy kullanılan uygulama
1. adım: MobileProxy mobil uygulama kitaplıklarını oluşturun
Go kodunu Android ve iOS'e yönelik kitaplıklar hâlinde derlemek için gomobile'ı kullanın.
Outline SDK deposunu klonlayın:
git clone https://github.com/Jigsaw-Code/outline-sdk.git cd outline-sdk/x
go build
ile Go Mobile ikili programlarını derleyin:go build -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
Psiphon desteği ekleme
Şu ek adımları izleyerek Psiphon ağını kullanma desteği ekleyebilirsiniz:
- Psiphon ekibine ulaşarak ağlarına erişim sağlayan bir yapılandırma alın. Bunun için bir sözleşmenizin olması gerekebilir.
- Aldığınız Psiphon yapılandırmasını,
SmartDialer
yapılandırmanızınfallback
bölümüne ekleyin. -tags psiphon
işaretini kullanarak MobileProxy'yi derleyin:go build -tags psiphon -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
Psiphon kod tabanı GPL kapsamında lisanslandığından kodunuza lisans kısıtlamaları uygulanabilir. Bu nedenle
-tags psiphon
işareti zorunludur. Psiphon ekibinden özel bir lisans almanız önerilir.Mobil uygulama kitaplıklarını oluşturun ve projenize ekleyin:
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
Oluşturulan
out/mobileproxy.aar
paketini içe aktarmak için Android Studio'da Dosya > Projeyi İçe Aktar… seçeneğini belirleyin. Daha fazla yardım için Go Mobile'ın Building and deploying to Android (Uygulama derleme ve Android'e dağıtma) başlıklı bölümünü inceleyin.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
paketini Xcode projesine sürükleyin. Daha fazla yardım için Go Mobile'ın Building and deploying to Android (Uygulama derleme ve iOS'e dağıtma) başlıklı bölümünü inceleyin.
2. adım: MobileProxy'yi çalıştırın
MobileProxy
yerel proxy'sini uygulamanızın çalışma zamanında başlatın.
Dinamik strateji seçimi için statik bir araç yapısı ya da akıllı proxy kullanabilirsiniz.
Statik araç yapılandırması: Yerel bir adres ve araç yapılandırmasıyla
RunProxy
işlevini kullanın.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()
Akıllı proxy: Akıllı proxy, DNS ve TLS stratejilerini belirtilen test alan adlarına göre dinamik olarak seçer. Yapılandırma stratejisini YAML biçiminde (örnek) belirtmeniz gerekir.
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()
3. adım: HTTP istemcilerini ve ağ kitaplıklarını yapılandırın
Ağ kitaplıklarınızı yerel proxy adresini ve bağlantı noktasını kullanacak şekilde yapılandırın.
Dart/Flutter HttpClient
Proxy'yi HttpClient.findProxy
ile ayarlayın.
HttpClient client = HttpClient();
client.findProxy = (Uri uri) {
return "PROXY " + proxy.address();
};
OkHttp (Android)
Proxy'yi OkHttpClient.Builder.proxy
ile ayarlayın.
val proxyConfig = Proxy(Proxy.Type.HTTP, InetSocketAddress(proxy.host(), proxy.port()))
val client = OkHttpClient.Builder().proxy(proxyConfig).build()
JVM (Java, Kotlin)
Proxy'yi sistem özellikleriyle kullanılacak şekilde yapılandırın:
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 Görünümü
androidx.webview
kitaplığını kullanarak uygulamanızdaki tüm web görünümlerine bir proxy yapılandırması uygulayın:
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 Web Görünümü
iOS 17 sürümünden itibaren, WKWebsiteDataStore
özelliğini kullanarak WKWebView
görünümüne proxy yapılandırması uygulayabilirsiniz:
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)
İleri düzey: Özel mobil uygulama kitaplığı oluşturma
İleri düzey kullanım alanları için kendi mobil uygulama kitaplıklarınızı oluşturabilirsiniz:
- Go kitaplığı oluşturma: Zorunlu SDK işlevlerini sarmalayan bir Go paketi oluşturun.
- Mobil uygulama kitaplıkları oluşturma: Android Archive (AAR) ve Apple çerçeveleri oluşturmak için
gomobile bind
komutunu kullanın. Örnekler: - Uygulamanıza entegre etme: Oluşturulan kitaplığı mobil uygulamanıza ekleyin.