เพิ่ม Outline SDK ลงในแอปบนอุปกรณ์เคลื่อนที่

เอกสารนี้จะอธิบายวิธีผสานรวม Outline SDK เข้ากับแอปพลิเคชันบนอุปกรณ์เคลื่อนที่ โดยมุ่งเน้นที่ไลบรารี MobileProxy เพื่อการจัดการพร็อกซีในเครื่องที่ง่ายขึ้น

MobileProxy เป็นไลบรารีที่ใช้ Go ซึ่งออกแบบมาเพื่อปรับปรุงการผสานรวมฟังก์ชันการทำงานของพร็อกซีในแอปบนอุปกรณ์เคลื่อนที่ โดยใช้ Go Mobile เพื่อสร้างไลบรารีสำหรับอุปกรณ์เคลื่อนที่ ซึ่งจะช่วยให้คุณกำหนดค่าไลบรารีเครือข่ายของแอปเพื่อกำหนดเส้นทางการรับส่งข้อมูลผ่านพร็อกซีในเครื่องได้

แอปที่ไม่มี MobileProxy

แอปเนื้อหาที่ไม่มี MobileProxy

แอปที่มี MobileProxy

แอปเนื้อหาที่มี MobileProxy

ขั้นตอนที่ 1: การสร้างคลัง MobileProxy บนอุปกรณ์เคลื่อนที่

ใช้ gomobile เพื่อคอมไพล์โค้ด Go เป็นไลบรารีสำหรับ Android และ iOS

  1. โคลนที่เก็บ Outline SDK โดยทำดังนี้

    git clone https://github.com/Jigsaw-Code/outline-sdk.git
    cd outline-sdk/x
    
  2. สร้างไบนารีของ Go Mobile ด้วย go build

    go build -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
    

    การเพิ่มการสนับสนุน Psiphon

    คุณสามารถเพิ่มการรองรับเพื่อใช้เครือข่าย Psiphon โดยทำตามขั้นตอนเพิ่มเติมต่อไปนี้

    • โปรดติดต่อทีม Psiphon เพื่อขอการกําหนดค่าที่ให้สิทธิ์เข้าถึงเครือข่าย ซึ่งอาจต้องมีการทำสัญญา
    • เพิ่มการกําหนดค่า Psiphon ที่ได้รับลงในส่วน fallback ของการกําหนดค่า SmartDialer
    • สร้างพร็อกซีของอุปกรณ์เคลื่อนที่โดยใช้ Flag -tags psiphon โดยทำดังนี้

      go build -tags psiphon -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
      

    ต้องใช้ Flag -tags psiphon เนื่องจากโค้ดฐานของ Psiphon ได้รับอนุญาตภายใต้ GPL ซึ่งอาจมีการจำกัดใบอนุญาตในโค้ดของคุณเอง คุณอาจต้องพิจารณาขอใบอนุญาตพิเศษจากบริษัทดังกล่าว

  3. สร้างไลบรารีสำหรับอุปกรณ์เคลื่อนที่และเพิ่มลงในโปรเจ็กต์

    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
    

    ใน Android Studio ให้เลือกไฟล์ > นําเข้าโปรเจ็กต์… เพื่อนําเข้ากลุ่ม out/mobileproxy.aar ที่สร้างขึ้น ดูความช่วยเหลือเพิ่มเติมได้ในการสร้างและทำให้ใช้งานได้ใน Android ของ 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
    

    ลากแพ็กเกจ out/mobileproxy.xcframework ไปยังโปรเจ็กต์ Xcode หากต้องการความช่วยเหลือเพิ่มเติม โปรดดูการสร้างและทำให้ใช้งานได้ใน iOS ของ Go Mobile

ขั้นตอนที่ 2: เรียกใช้ MobileProxy

เริ่มต้นและเริ่มพร็อกซี MobileProxy ในพื้นที่ภายในรันไทม์ของแอป คุณสามารถใช้การกำหนดค่าการขนส่งแบบคงที่หรือ Smart Proxy เพื่อเลือกกลยุทธ์แบบไดนามิกได้

  • การกำหนดค่าการขนส่งแบบคงที่: ใช้ฟังก์ชัน RunProxy กับการกำหนดค่าที่อยู่และการกำหนดค่าการขนส่งในเครื่อง

    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()
    
  • พร็อกซีอัจฉริยะ: พร็อกซีอัจฉริยะจะเลือกกลยุทธ์ DNS และ TLS แบบไดนามิกตามโดเมนทดสอบที่ระบุ คุณต้องระบุกลยุทธ์การกําหนดค่าในรูปแบบ YAML (ตัวอย่าง)

    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: กำหนดค่าไคลเอ็นต์ HTTP และไลบรารีการทํางานของเครือข่าย

กำหนดค่าไลบรารีเครือข่ายให้ใช้ที่อยู่และพอร์ตพร็อกซีในเครื่อง

HttpClient ของ Dart/Flutter

ตั้งค่าพร็อกซีด้วย HttpClient.findProxy

HttpClient client = HttpClient();
client.findProxy = (Uri uri) {
  return "PROXY " + proxy.address();
};

OkHttp (Android)

ตั้งค่าพร็อกซีด้วย OkHttpClient.Builder.proxy

val proxyConfig = Proxy(Proxy.Type.HTTP, InetSocketAddress(proxy.host(), proxy.port()))
val client = OkHttpClient.Builder().proxy(proxyConfig).build()

JVM (Java, Kotlin)

กำหนดค่าพร็อกซีเพื่อใช้กับพร็อพเพอร์ตี้ของระบบ

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

ใช้การกำหนดค่าพร็อกซีกับมุมมองเว็บทั้งหมดในแอปพลิเคชันด้วยบรรณานุกรม 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
    )

iOS Web View

ตั้งแต่ iOS 17 เป็นต้นไป คุณสามารถเพิ่มการกําหนดค่าพร็อกซีลงใน WKWebView โดยใช้WKWebsiteDataStore พร็อพเพอร์ตี้ ดังนี้

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)

ขั้นสูง: สร้างคลังสำหรับอุปกรณ์เคลื่อนที่ที่กำหนดเอง

สำหรับกรณีการใช้งานขั้นสูง คุณสามารถสร้างคลังสำหรับอุปกรณ์เคลื่อนที่ของคุณเองได้ ดังนี้

  1. สร้างไลบรารี Go: พัฒนาแพ็กเกจ Go ที่รวมฟังก์ชันการทำงานของ SDK ที่จําเป็น
  2. สร้างไลบรารีสำหรับอุปกรณ์เคลื่อนที่: ใช้ gomobile bind เพื่อสร้างไฟล์เก็บถาวร Android (AAR) และเฟรมเวิร์ก Apple ตัวอย่าง
  3. ผสานรวมลงในแอป: เพิ่มไลบรารีที่สร้างขึ้นลงในแอปพลิเคชันบนอุปกรณ์เคลื่อนที่