From bdd547d8db7763cf582d4d7d4ebe70c307be79cf Mon Sep 17 00:00:00 2001 From: EYHN Date: Fri, 21 Mar 2025 12:35:34 +0800 Subject: [PATCH] fix(ios): send affine version on sign in (#11058) --- .../ios/App/App.xcodeproj/project.pbxproj | 4 ++++ .../apps/ios/App/App/AppConfigManager.swift | 20 +++++++++++++++++++ .../ios/App/App/Plugins/Auth/AuthPlugin.swift | 3 ++- packages/frontend/apps/ios/App/Podfile.lock | 8 ++++---- .../frontend/apps/ios/capacitor.config.ts | 14 ++++++++++++- packages/frontend/apps/ios/package.json | 1 + 6 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 packages/frontend/apps/ios/App/App/AppConfigManager.swift diff --git a/packages/frontend/apps/ios/App/App.xcodeproj/project.pbxproj b/packages/frontend/apps/ios/App/App.xcodeproj/project.pbxproj index 19ee2a0387..887d8da2a4 100644 --- a/packages/frontend/apps/ios/App/App.xcodeproj/project.pbxproj +++ b/packages/frontend/apps/ios/App/App.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 9D90BE2B2CCB9876006677DB /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 9D90BE1F2CCB9876006677DB /* config.xml */; }; 9D90BE2D2CCB9876006677DB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9D90BE222CCB9876006677DB /* Main.storyboard */; }; 9D90BE2E2CCB9876006677DB /* public in Resources */ = {isa = PBXBuildFile; fileRef = 9D90BE232CCB9876006677DB /* public */; }; + 9DAE9BD92D8D1AB0000C1D5A /* AppConfigManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DAE9BD82D8D1AA9000C1D5A /* AppConfigManager.swift */; }; 9DEC59432D323EE40027CEBD /* Mutex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DEC59422D323EE00027CEBD /* Mutex.swift */; }; 9DFCD1462D27D1D70028C92B /* libaffine_mobile_native.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DFCD1452D27D1D70028C92B /* libaffine_mobile_native.a */; }; C4C97C7C2D030BE000BC2AD1 /* affine_mobile_native.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C97C6F2D0307B700BC2AD1 /* affine_mobile_native.swift */; }; @@ -56,6 +57,7 @@ 9D90BE202CCB9876006677DB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9D90BE212CCB9876006677DB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 9D90BE232CCB9876006677DB /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + 9DAE9BD82D8D1AA9000C1D5A /* AppConfigManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConfigManager.swift; sourceTree = ""; }; 9DEC59422D323EE00027CEBD /* Mutex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mutex.swift; sourceTree = ""; }; 9DFCD1452D27D1D70028C92B /* libaffine_mobile_native.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libaffine_mobile_native.a; sourceTree = ""; }; AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; @@ -177,6 +179,7 @@ 9D90BE242CCB9876006677DB /* App */ = { isa = PBXGroup; children = ( + 9DAE9BD82D8D1AA9000C1D5A /* AppConfigManager.swift */, 9DEC59422D323EE00027CEBD /* Mutex.swift */, 9D52FC422D26CDB600105D0A /* JSValueContainerExt.swift */, 9D90BE1A2CCB9876006677DB /* Plugins */, @@ -354,6 +357,7 @@ 5075136E2D1925BC00AD60C0 /* IntelligentsPlugin.swift in Sources */, 5075136A2D1924C600AD60C0 /* RootViewController.swift in Sources */, C4C97C7C2D030BE000BC2AD1 /* affine_mobile_native.swift in Sources */, + 9DAE9BD92D8D1AB0000C1D5A /* AppConfigManager.swift in Sources */, C4C97C7D2D030BE000BC2AD1 /* affine_mobile_nativeFFI.h in Sources */, 9D5622962D64A6A5009F1BE4 /* AuthPlugin.swift in Sources */, C4C97C7E2D030BE000BC2AD1 /* affine_mobile_nativeFFI.modulemap in Sources */, diff --git a/packages/frontend/apps/ios/App/App/AppConfigManager.swift b/packages/frontend/apps/ios/App/App/AppConfigManager.swift new file mode 100644 index 0000000000..0042a27511 --- /dev/null +++ b/packages/frontend/apps/ios/App/App/AppConfigManager.swift @@ -0,0 +1,20 @@ +import Foundation + +final class AppConfigManager { + struct AppConfig: Decodable { + let affineVersion: String + } + + static var affineVersion: String? = nil + + static func getAffineVersion() -> String { + if affineVersion == nil { + let file = Bundle(for: AppConfigManager.self).url(forResource: "capacitor.config", withExtension: "json")! + let data = try! Data(contentsOf: file) + let config = try! JSONDecoder().decode(AppConfig.self, from: data) + affineVersion = config.affineVersion + } + + return affineVersion! + } +} diff --git a/packages/frontend/apps/ios/App/App/Plugins/Auth/AuthPlugin.swift b/packages/frontend/apps/ios/App/App/Plugins/Auth/AuthPlugin.swift index ccc39c57a1..8f48412499 100644 --- a/packages/frontend/apps/ios/App/App/Plugins/Auth/AuthPlugin.swift +++ b/packages/frontend/apps/ios/App/App/Plugins/Auth/AuthPlugin.swift @@ -82,7 +82,7 @@ public class AuthPlugin: CAPPlugin, CAPBridgedPlugin { let (data, response) = try await self.fetch(endpoint, method: "POST", action: "/api/auth/sign-in", headers: [ "x-captcha-token": verifyToken, - "x-captcha-challenge": challenge, + "x-captcha-challenge": challenge ], body: ["email": email, "password": password]) if response.statusCode >= 400 { @@ -157,6 +157,7 @@ public class AuthPlugin: CAPPlugin, CAPBridgedPlugin { request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = try JSONEncoder().encode(body!) } + request.setValue(AppConfigManager.getAffineVersion(), forHTTPHeaderField: "x-affine-version") request.timeoutInterval = 10 // time out 10s let (data, response) = try await URLSession.shared.data(for: request); diff --git a/packages/frontend/apps/ios/App/Podfile.lock b/packages/frontend/apps/ios/App/Podfile.lock index 6f8293c9ea..2e0978f2fd 100644 --- a/packages/frontend/apps/ios/App/Podfile.lock +++ b/packages/frontend/apps/ios/App/Podfile.lock @@ -1,11 +1,11 @@ PODS: - - Capacitor (7.0.1): + - Capacitor (7.1.0): - CapacitorCordova - CapacitorApp (7.0.0): - Capacitor - CapacitorBrowser (7.0.0): - Capacitor - - CapacitorCordova (7.0.1) + - CapacitorCordova (7.1.0) - CapacitorHaptics (7.0.0): - Capacitor - CapacitorKeyboard (7.0.0): @@ -40,10 +40,10 @@ EXTERNAL SOURCES: :path: "../../../../../node_modules/@capacitor/keyboard" SPEC CHECKSUMS: - Capacitor: 23fff43571a4d1e3ee7d67b5a3588c6e757c2913 + Capacitor: 68ff8eabbcce387e69767c13b5fbcc1c5399eabc CapacitorApp: 45cb7cbef4aa380b9236fd6980033eb5cde6fcd2 CapacitorBrowser: 352a66541b15ceadae1d703802b11979023705e3 - CapacitorCordova: 63d476958d5022d76f197031e8b7ea3519988c64 + CapacitorCordova: 866217f32c1d25b326c568a10ea3ed0c36b13e29 CapacitorHaptics: 1fba3e460e7614349c6d5f868b1fccdc5c87b66d CapacitorKeyboard: 2c26c6fccde35023c579fc37d4cae6326d5e6343 CryptoSwift: 967f37cea5a3294d9cce358f78861652155be483 diff --git a/packages/frontend/apps/ios/capacitor.config.ts b/packages/frontend/apps/ios/capacitor.config.ts index 050cad7b2b..8dda1ee4e0 100644 --- a/packages/frontend/apps/ios/capacitor.config.ts +++ b/packages/frontend/apps/ios/capacitor.config.ts @@ -1,10 +1,22 @@ +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + import type { CapacitorConfig } from '@capacitor/cli'; import { KeyboardResize } from '@capacitor/keyboard'; -const config: CapacitorConfig = { +const packageJson = JSON.parse( + readFileSync(resolve(__dirname, './package.json'), 'utf-8') +); + +interface AppConfig { + affineVersion: string; +} + +const config: CapacitorConfig & AppConfig = { appId: 'app.affine.pro', appName: 'AFFiNE', webDir: 'dist', + affineVersion: packageJson.version, ios: { scheme: 'AFFiNE', path: '.', diff --git a/packages/frontend/apps/ios/package.json b/packages/frontend/apps/ios/package.json index 9eadfd4e52..4b83b2449c 100644 --- a/packages/frontend/apps/ios/package.json +++ b/packages/frontend/apps/ios/package.json @@ -7,6 +7,7 @@ "scripts": { "build": "affine bundle", "dev": "affine bundle --dev", + "xcode": "cap open ios", "sync": "cap sync", "sync:dev": "CAP_SERVER_URL=http://localhost:8080 cap sync" },