این سند طرح کلی نحوه ادغام کردن Outline SDK را در برنامههای تلفن همراهتان ارائه میکند
و بر کتابخانه MobileProxy تمرکز میکند تا مدیریت پراکسی محلی را
ساده کند.
MobileProxy کتابخانهای مبتنی بر Go است که برای ساده کردن یکپارچهسازی
عملکرد پراکسی در برنامههای تلفن همراه طراحی شده است. از Go
Mobile استفاده میکند تا کتابخانههای تلفن همراه را تولید کند و شما را قادر کند
کتابخانههای شبکهسازی برنامهتان را پیکربندی کنید تا ترافیک را ازطریق
پراکسی محلی هدایت کنید.
برنامه بدون MobileProxy

برنامه با MobileProxy

مرحله ۱: ساختن کتابخانههای تلفن همراه MobileProxy
از gomobile استفاده کنید تا کد Go را در کتابخانههای Android و iOS ترجمه کنید.
همسانهسازی کردن مخزن Outline SDK:
git clone https://github.com/Jigsaw-Code/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اضافه کنید. ساختن «پراکسی تلفن همراه» بااستفاده از پرچم
-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/Jigsaw-Code/outline-sdk/x/mobileproxyدر «استودیو Android»، فایل > وارد کردن پروژه… را انتخاب کنید تا بسته
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 بکشید. برای راهنمایی بیشتر، Building and deploying to iOS (ساختن و پیادهسازی در iOS) مربوط به Go Mobile را ببینید.
مرحله ۲: اجرا کردن 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()پراکسی هوشمند: «پراکسی هوشمند» رهنمودهای ساناد و «امنیت لایه انتقال» را براساس دامنههای آزمایشی معینشدهای بهطور پویا انتخاب میکند. باید رهنمود پیکربندی را در قالب 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()
مرحله ۳: پیکربندی کردن کارخواه 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
پیکربندی پراکسی را روی همه نماهای وب در برنامهتان
با
کتابخانه 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
از iOS نسخه ۱۷، میتوانید پیکربندی پراکسی را بااستفاده از property (خصوصیت) WKWebsiteDataStore آن، به WKWebView اضافه کنید:
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)
پیشرفته: تولید کردن کتابخانه سفارشی تلفن همراه
در موارد استفاده پیشرفته، میتوانید کتابخانههای تلفن همراه خودتان را تولید کنید:
- ساختن کتابخانه Go: بسته Go را توسعه دهید تا عملکردهای «کیت توسعه نرمافزار» (SDK) لازم را بستهبندی کند.
- تولید کردن کتابخانههای تلفن همراه: از
gomobile bindاستفاده کنید تا Android Archives (AAR) و چارچوبهای Apple تولید کنید. مثالها: - ادغام کردن در برنامهتان: کتابخانه تولیدشده را به برنامه تلفن همراهتان اضافه کنید.