Bu dokümanda, basitleştirilmiş yerel proxy yönetimi için MobileProxy
kitaplığına odaklanarak Outline SDK'nın mobil uygulamalarınıza nasıl entegre edileceği açıklanmaktadır.
MobileProxy
, proxy işlevlerinin mobil uygulamalara entegrasyonunu kolaylaştırmak için tasarlanmış Go tabanlı bir kitaplıktır. Mobil kitaplıklar oluşturmak için Go Mobile'i kullanır. Böylece, uygulamanızın ağ kitaplıklarını trafiği yerel bir proxy üzerinden yönlendirecek şekilde yapılandırabilirsiniz.
MobileProxy içermeyen uygulama
MobileProxy ile uygulama
1. adım: MobileProxy mobil kitaplıklarını oluşturma
Go kodunu Android ve iOS için kitaplıklara derlemek üzere gomobile'i kullanın.
Outline SDK deposunu klonlayın:
git clone https://github.com/Jigsaw-Code/outline-sdk.git cd outline-sdk/x
Go Mobile ikililerini
go build
ile derleyin:go build -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
Psiphon Desteği Ekleme
Aşağıdaki ek adımları uygulayarak Psiphon ağını kullanma desteği ekleyebilirsiniz:
- Ağlarına erişim izni veren bir yapılandırma almak için Psiphon ekibiyle iletişime geçin. Bu işlem için sözleşme yapılması gerekebilir.
- Alınan Psiphon yapılandırmasını,
SmartDialer
yapılandırmanızınfallback
bölümüne ekleyin. -tags psiphon
işaretini kullanarak mobil proxy oluşturun: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
-tags psiphon
işareti gereklidir. Bu, kendi kodunuza lisans kısıtlamaları getirebilir. Onlardan özel lisans almayı düşünebilirsiniz.Mobil kitaplıklar oluşturun ve bunları 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çin. Daha fazla yardım için Go Mobile'in Android için uygulama oluşturma ve dağıtma başlıklı makalesine bakın.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 iOS için uygulama oluşturma ve dağıtma başlıklı makalesine bakın.
2. Adım: MobileProxy'yi çalıştırın
Uygulamanızın çalışma zamanında MobileProxy
yerel proxy'sini başlatın.
Dinamik strateji seçimi için statik bir aktarım yapılandırması veya Akıllı Proxy'yi kullanabilirsiniz.
Statik aktarım yapılandırması:
RunProxy
işlevini yerel bir adres ve aktarım yapılandırmasıyla 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, belirtilen test alanlarına göre DNS ve TLS stratejilerini dinamik olarak seçer. Yapılandırma stratejisini YAML biçiminde belirtmeniz gerekir (örnek).
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 istemcileri 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 özellikleri ile 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'den itibaren, WKWebsiteDataStore
özelliğini kullanarak bir WKWebView
öğesine proxy yapılandırması ekleyebilirsiniz:
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)
Gelişmiş: Özel mobil kitaplık oluşturma
Gelişmiş kullanım alanları için kendi mobil kitaplıklarınızı oluşturabilirsiniz:
- Go kitaplığı oluşturma: Gerekli SDK işlevlerini kapsayan bir Go paketi geliştirin.
- Mobil kitaplıklar oluşturma: Android Arşivleri (AAR) ve Apple Çerçeveleri oluşturmak için
gomobile bind
'yi kullanın. Örnekler: - Uygulamanıza entegre edin: Oluşturulan kitaplığı mobil uygulamanıza ekleyin.