Ana içeriğe geç

Outline SDK'yı mobil uygulamanıza ekleme

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ılmayan içerik uygulaması

MobileProxy kullanılan uygulama

MobileProxy kullanılan içerik uygulaması

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.

  1. Outline SDK deposunu klonlayın:
git clone https://github.com/OutlineFoundation/outline-sdk.git
cd outline-sdk/x
  1. 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ın `fallback` 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.

  1. 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/OutlineFoundation/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 "$(pwd)/out/mobileproxy.xcframework" github.com/OutlineFoundation/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:

  1. Go kitaplığı oluşturma: Zorunlu SDK işlevlerini sarmalayan bir Go paketi oluşturun.

  2. Mobil uygulama kitaplıkları oluşturma: Android Archive (AAR) ve Apple çerçeveleri oluşturmak için gomobile bind komutunu kullanın. Örnekler:

  3. Uygulamanıza entegre etme: Oluşturulan kitaplığı mobil uygulamanıza ekleyin.