Outline SDK'sını mobil uygulamanıza ekleme

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

MobileProxy ile uygulama

MobileProxy ile içerik uygulaması

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.

  1. Outline SDK deposunu klonlayın:

    git clone https://github.com/Jigsaw-Code/outline-sdk.git
    cd outline-sdk/x
    
  2. 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ın fallback 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.

  3. 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:

  1. Go kitaplığı oluşturma: Gerekli SDK işlevlerini kapsayan bir Go paketi geliştirin.
  2. Mobil kitaplıklar oluşturma: Android Arşivleri (AAR) ve Apple Çerçeveleri oluşturmak için gomobile bind'yi kullanın. Örnekler:
  3. Uygulamanıza entegre edin: Oluşturulan kitaplığı mobil uygulamanıza ekleyin.