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

แอปที่มี MobileProxy

ขั้นตอนที่ 1: การสร้างไลบรารี MobileProxy สำหรับมือถือ
ใช้ gomobile เพื่อคอมไพล์โค้ด Go ลงในไลบรารีสำหรับ Android และ iOS
- โคลนที่เก็บ Outline SDK
git clone https://github.com/OutlineFoundation/outline-sdk.git
cd outline-sdk/x
- สร้างไบนารี 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`
- สร้าง Mobile Proxy โดยใช้แฟล็ก `-tags psiphon`
go build -tags psiphon -o "$(pwd)/out/" golang.org/x/mobile/cmd/gomobile golang.org/x/mobile/cmd/gobind
จำเป็นต้องใช้แฟล็ก -tags psiphon เนื่องจากฐานของโค้ด Psiphon ได้รับใบอนุญาตภายใต้ GPL ซึ่งสามารถบังคับใช้ข้อจำกัดของใบอนุญาตกับโค้ดของคุณเองได้ คุณจึงอาจต้องพิจารณาขอรับใบอนุญาตพิเศษจากทีมดังกล่าว
- สร้างไลบรารีมือถือและเพิ่มไปยังโปรเจ็กต์ของคุณ โดยทำดังนี้
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
ใน Android Studio ให้เลือก ไฟล์ > นำเข้าโปรเจ็กต์… เพื่อนำเข้าแพ็กเกจ out/mobileproxy.aar ที่สร้าง โปรดดูความช่วยเหลือเพิ่มเติมที่บทความการสร้างและการติดตั้งใช้งานกับ Android ของ Go Mobile
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 ไปยังโปรเจ็กต์ 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()
- Smart Proxy: Smart Proxy จะเลือกกลยุทธ์ 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 และไลบรารีระบบเครือข่าย
กำหนดค่าไลบรารีระบบเครือข่ายเพื่อใช้ที่อยู่พร็อกซีและพอร์ตในระบบ
Dart/Flutter HttpClient
ตั้งค่าพร็อกซีด้วย
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)
ขั้นสูง: สร้างไลบรารีมือถือที่กำหนดเอง
สำหรับ Use Case ขั้นสูง คุณสร้างไลบรารีมือถือของคุณเองได้
-
สร้างไลบรารี Go: พัฒนาแพ็กเกจ Go ที่รวมฟังก์ชันการทำงาน SDK ที่จำเป็นเข้าด้วยกัน
-
สร้างไลบรารีมือถือ: ใช้
gomobile bindเพื่อสร้าง Android ARchive (AAR) และ Apple Framework โดยตัวอย่างมีดังนี้ -
ผสานรวมลงในแอป: เพิ่มไลบรารีที่สร้างขึ้นลงในแอปพลิเคชันบนมือถือ