Bagaimana Kami Melewati Pedoman Peninjauan dan Meluncurkan Server di Telepon

Hai, Habr. Nama saya Anton Loginov, saya adalah pengembang iOS di FINCH.

Baru-baru ini, kami menghadapi masalah menggunakan antarmuka berbasis web untuk perjudian. Dalam pembaruan selanjutnya dari Panduan Tinjauan AppStore, kolega dari Cupertino kembali memperketat aturan. Lebih khusus lagi, sekarang Apple dapat mengarahkan ulang aplikasi jika ada antarmuka berbasis web yang akan diklasifikasikan sebagai perjudian uang sungguhan.

Aplikasi kami sendiri adalah 90% perjudian, dan 10% sisanya digunakan untuk mengiklankan game ini. Beberapa dari mereka bekerja melalui webView, jadi kami perlu melindungi diri dari pengalihan dengan cara apa pun.

Apa yang bisa dilakukan:

  1. Ambil game-game ini di luar aplikasi utama.
    Dengan kata lain, tunda saja yang tak terhindarkan.
  2. Gunakan wadah untuk game yang bisa diperbarui tanpa rasa sakit.
    Kedengarannya bagus → mencoba menembus → membunuh beberapa hari untuk mempelajari Bereaksi dan Bereaksi Pribumi → menyadari bahwa “skiing not go” → tidak terdengar bagus.

    Ini adalah solusi yang sangat mahal, karena hanya ada sedikit waktu, dan permainan harus ditulis ulang dari awal. Ini semua tentang perutean internal - ini sepenuhnya terkait dengan urlPathComponents
  3. Sadari permainan itu secara asli.
    Panjang, mahal, dan lagi panjang. Di masa depan, mereka harus didukung secara berkelanjutan, tetapi kami tidak memiliki peluang seperti itu.
  4. Mensimulasikan perilaku server yang akan memberikan situs berbohong lokal dengan permainan.
    Kedengarannya gila, tapi ini pilihan yang saya pilih. Ini cepat, karena modifikasi minimal pada warisan permainan diperlukan.
    Kerugian yang diperkirakan termasuk: meningkatkan ukuran perakitan karena situs lokal berbohong, meningkatkan beban pada perangkat dengan memulai server.

Saya tidak menemukan artikel tentang Habré yang akan menjelaskan cara memulai server di telepon. Setelah memutuskan bahwa kasus ini cukup langka dan menarik, saya memutuskan untuk membicarakannya di sini di Habré.

Persiapan


Sementara vokalis pemberani kami mencoba mengurangi ukuran game sebanyak 16 kali (80 Mb -> 5 Mb) dan mengubah jalur internal menjadi relatif, saya memutuskan perpustakaan dengan memilih GCDWebServer. Ini adalah kerangka kerja ringan yang dengannya Anda dapat menaikkan server HTTP dalam beberapa baris kode.

Setelah memilih perpustakaan, tibalah jam belajar yang panjang dan memahami bagaimana server bekerja di bawah tenda, apa yang terjadi pada titik waktu tertentu, cara mengkonfigurasi server sehingga tidak membuang sumber daya sistem. Server kami belajar menangkap transisi, memprosesnya, dan saya belajar bekerja dengan server di sisi lain dari barikade.

Kustomisasi


func initWebServer() { //  let webServer = GCDWebServer() //       , ,     GET/POST : webServer.addDefaultHandler( forMethod: HTTPMethod.get.rawValue, request: GCDWebServerDataRequest.self) { [weak self] request in return self?.handle(request: request) } } 

Mulai


Sebenarnya, kami meresepkan parameter untuk memulai server kami dan menjalankan:

 do { try webServer.start(options: [GCDWebServerOption_BindToLocalhost: true, GCDWebServerOption_Port: 8080]) } catch { assertionFailure(error.localizedDescription) webServer.start(withPort: 8080, bonjourName: "PROJECT_NAME Web Server") } 

Proksi


gambar

Modul berkomunikasi secara internal dengan API, tetapi menggunakan baseURL sendiri untuk ini. Dalam kasus kami, localhost. Oleh karena itu, perlu untuk mengajarkan server untuk menentukan permintaan yang harus pergi ke API, dan mengubah baseURL mereka.

 // MARK: -     ,        Safari 

Berdasarkan hal di atas, perlu untuk mengonfigurasi penangan untuk tugas tertentu:

  • Berikan situs itu. (Ya, semuanya sederhana di sini) ;
  • Berikan beberapa statis dari Bundel. (Membongkar url permintaan, mengubah baseUrl menjadi bundleUrl, memberikan konten (js / media) ;
  • Dapatkan data terbaru. (Url yang dibongkar, ubah baseUrl, diminta, dikembalikan) ;
  • Kirim data baru. (Dan kami tidak memproses permintaan POST, mengacaukannya, mengonfigurasinya, mengirimnya) ;

Mari kita lakukan:

 private func handle(request: GCDWebServerRequest) -> GCDWebServerResponse? { // 1)   if request.url.pathComponents.contains(Endpoint.game.rawValue) { guard let indexURL = bundle.url(forResource: "index", withExtension: "html") else { return sendError(.noHTML(nil)) } do { let data = try Data(contentsOf: indexURL) let htmlString = String(data: data, encoding: .utf8) ?? "" return GCDWebServerDataResponse(html: htmlString) } catch { return sendError(.noHTML(error)) } // 2)   (js etc) } else if request.url.pathComponents.contains(Endpoint.nstatic.rawValue) { guard let resoursePath = bundle.resourcePath else { return sendError(.noJS(nil)) } let relativePath = request.url.pathComponents.joined(separator: "/") let absolutePath = resoursePath + relativePath.dropFirst() let staticURL = URL(fileURLWithPath: absolutePath) do { let data = try Data(contentsOf: staticURL) return GCDWebServerDataResponse(data: data, contentType: ContentType.js.description) } catch { return sendError(.noJS(error)) } // 3)    API } else if request.url.pathComponents.contains(Endpoint.api.rawValue) { var proxyRequest = request //  url,  , ,     let output = URLSession.shared.synchronousDataTask(with: proxyRequest) //    ,      let response = GCDWebServerDataResponse(data: outputData, contentType: ContentType.url.description) //     return response } } 

Kesimpulan


Itu menyenangkan dan gugup. Pertama, saya belum pernah melakukan hal seperti ini sebelumnya. Kedua, sampai saat ini kami tidak mengerti bagaimana ide-ide kami akan mempengaruhi aplikasi orang tua.

Kami membutuhkan sekitar 32 jam untuk mengimplementasikan: 8 untuk mengoptimalkan ukuran situs, 24 untuk merancang dan menulis fungsi ini.

Saat menulis artikel, saya sampai pada kesimpulan bahwa cara yang lebih populer untuk menggunakan teknologi ini adalah untuk mengembangkan asli tanpa menunggu backend siap.

Nah, untuk merangkum keuntungan dari pendekatan yang dipilih:

  • Hemat waktu backend dengan memberikannya model data
  • Kemampuan untuk menguji perilaku server apa pun
  • Untuk beralih dari Mock ke API asli, kita hanya perlu mematikan penangan tertentu

Terima kasih atas perhatian anda Jika Anda memiliki pengalaman serupa, maka beri tahu kami tentang hal itu di komentar.

Source: https://habr.com/ru/post/id471874/


All Articles