From dc0a1e23568adccc26e619fd00037cdb81e83c63 Mon Sep 17 00:00:00 2001 From: v504 Date: Mon, 25 Aug 2025 10:57:46 +0800 Subject: [PATCH] Refactor QRCodeParser and CreateQRCodeView to support new URL schemes for Instagram, Facebook, WhatsApp, and Viber; enhance input handling and user guidance in SocialInputView and InputComponentFactory for improved clarity and functionality. --- MyQrCode/Models/QRCodeParser.swift | 4 +- .../Components/InputComponentFactory.swift | 4 +- .../Views/Components/SocialInputView.swift | 28 ++++--------- MyQrCode/Views/CreateQRCodeView.swift | 42 +++++++++++++++++-- MyQrCode/Views/QRCodeDetailView.swift | 11 +++++ docs/QRCODE_DETAIL_VIEW_README.md | 2 +- 6 files changed, 62 insertions(+), 29 deletions(-) diff --git a/MyQrCode/Models/QRCodeParser.swift b/MyQrCode/Models/QRCodeParser.swift index c831229..9592873 100644 --- a/MyQrCode/Models/QRCodeParser.swift +++ b/MyQrCode/Models/QRCodeParser.swift @@ -193,7 +193,7 @@ class QRCodeParser { } // Viber - if trimmedContent.hasPrefix("viber://") { + if trimmedContent.hasPrefix("viber://add?number=") { return parseViber(trimmedContent) } @@ -574,7 +574,7 @@ class QRCodeParser { // MARK: - 解析Viber private static func parseViber(_ content: String) -> ParsedQRData { - let phone = content.replacingOccurrences(of: "viber://contact?number=", with: "") + let phone = content.replacingOccurrences(of: "viber://add?number=", with: "") return ParsedQRData( type: .viber, diff --git a/MyQrCode/Views/Components/InputComponentFactory.swift b/MyQrCode/Views/Components/InputComponentFactory.swift index 078ff4a..e21487d 100644 --- a/MyQrCode/Views/Components/InputComponentFactory.swift +++ b/MyQrCode/Views/Components/InputComponentFactory.swift @@ -280,7 +280,7 @@ struct InputComponentFactory { case .instagram: return "输入Instagram用户名..." case .facebook: - return "输入Facebook用户ID..." + return "输入Facebook用户ID或链接..." case .spotify: return "输入Spotify信息..." case .twitter: @@ -288,7 +288,7 @@ struct InputComponentFactory { case .whatsapp: return "输入WhatsApp电话号码(如:+1234567890)..." case .viber: - return "输入Viber信息..." + return "输入Viber电话号码(如:+1234567890)..." case .snapchat: return "输入Snapchat信息..." case .tiktok: diff --git a/MyQrCode/Views/Components/SocialInputView.swift b/MyQrCode/Views/Components/SocialInputView.swift index 6996518..bb4e8aa 100644 --- a/MyQrCode/Views/Components/SocialInputView.swift +++ b/MyQrCode/Views/Components/SocialInputView.swift @@ -52,7 +52,7 @@ struct SocialInputView: View { case .tiktok: return "用户名或链接" case .snapchat: return "用户名" case .whatsapp: return "输入WhatsApp电话号码" - case .viber: return "消息内容" + case .viber: return "电话号码" case .spotify: return "歌曲或播放列表链接" } } @@ -60,12 +60,12 @@ struct SocialInputView: View { var hint: String { switch self { case .instagram: return "输入Instagram用户名" - case .facebook: return "输入Facebook用户ID" + case .facebook: return "输入Facebook用户ID或链接" case .twitter: return "输入Twitter用户名或完整链接" case .tiktok: return "输入TikTok用户名或完整链接" case .snapchat: return "输入Snapchat用户名" case .whatsapp: return "输入WhatsApp消息内容" - case .viber: return "输入Viber消息内容" + case .viber: return "输入Viber电话号码" case .spotify: return "输入Spotify歌曲或播放列表链接" } } @@ -106,7 +106,7 @@ struct SocialInputView: View { // 用户名/链接 (必填) VStack(alignment: .leading, spacing: 8) { HStack { - Text(platform == .whatsapp ? "电话号码" : (platform == .viber ? "消息内容" : "用户名/链接")) + Text(platform == .whatsapp || platform == .viber ? "电话号码" : "用户名/链接") .font(.subheadline) .foregroundColor(.primary) Text("*") @@ -120,21 +120,7 @@ struct SocialInputView: View { .focused($focusedField, equals: .username) } - // 消息内容 (仅Viber) - if platform == .viber { - VStack(alignment: .leading, spacing: 8) { - HStack { - Text("消息内容") - .font(.subheadline) - .foregroundColor(.primary) - Spacer() - } - - TextField("输入消息内容", text: $message) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .focused($focusedField, equals: .message) - } - } + // 格式说明 VStack(alignment: .leading, spacing: 8) { @@ -180,7 +166,7 @@ struct SocialInputView: View { if platform == .instagram { return "• 输入Instagram用户名\n• 将生成instagram://user?username=用户名格式" } else if platform == .facebook { - return "• 输入Facebook用户ID\n• 将生成fb://profile/用户ID格式" + return "• 输入Facebook用户ID或完整链接\n• 将自动提取用户名并生成fb://profile/格式\n• 支持:username 或 https://facebook.com/username" } else { return "• 可以输入用户名(如:username)\n• 或输入完整链接(如:https://twitter.com/username)" } @@ -189,7 +175,7 @@ struct SocialInputView: View { case .whatsapp: return "• 输入WhatsApp电话号码(如:+1234567890)\n• 将生成whatsapp://send?phone=电话号码格式\n• 用户扫描后可直接打开WhatsApp聊天" case .viber: - return "• 输入Viber消息内容\n• 将生成可分享的链接" + return "• 输入Viber电话号码(如:+1234567890)\n• 将生成viber://add?number=格式\n• 用户扫描后可直接添加Viber联系人" case .spotify: return "• 输入歌曲或播放列表链接\n• 或输入Spotify ID" } diff --git a/MyQrCode/Views/CreateQRCodeView.swift b/MyQrCode/Views/CreateQRCodeView.swift index 58ce508..8d6d5d3 100644 --- a/MyQrCode/Views/CreateQRCodeView.swift +++ b/MyQrCode/Views/CreateQRCodeView.swift @@ -513,7 +513,9 @@ struct CreateQRCodeView: View { case .instagram: return "instagram://user?username=\(socialUsername)" case .facebook: - return "fb://profile/\(socialUsername)" + // 处理Facebook输入:支持用户名/ID或完整链接 + let facebookId = extractFacebookId(from: socialUsername) + return "fb://profile/\(facebookId)" case .spotify: return socialUsername.hasPrefix("http") ? socialUsername : "https://open.spotify.com/track/\(socialUsername)" case .twitter: @@ -521,8 +523,7 @@ struct CreateQRCodeView: View { case .whatsapp: return "whatsapp://send?phone=\(socialUsername)" case .viber: - let message = socialMessage.isEmpty ? "Hello" : socialMessage - return "viber://chat?number=\(socialUsername)&text=\(message.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? message)" + return "viber://add?number=\(socialUsername)" case .snapchat: return "https://snapchat.com/add/\(socialUsername)" case .tiktok: @@ -610,6 +611,41 @@ struct CreateQRCodeView: View { showingAlert = true } } + + // MARK: - Facebook ID提取辅助函数 + private func extractFacebookId(from input: String) -> String { + // 如果输入的是Facebook链接,提取用户名/ID + if input.hasPrefix("http") { + // 处理各种Facebook链接格式 + let patterns = [ + "https://www.facebook.com/", + "https://facebook.com/", + "http://www.facebook.com/", + "http://facebook.com/" + ] + + var cleanedInput = input + for pattern in patterns { + if cleanedInput.hasPrefix(pattern) { + cleanedInput = String(cleanedInput.dropFirst(pattern.count)) + break + } + } + + // 移除查询参数和路径 + if let questionMarkIndex = cleanedInput.firstIndex(of: "?") { + cleanedInput = String(cleanedInput[.. HistoryItem { + let content = "viber://add?number=+1234567890" + return makeBaseItem(in: context, content: content, qrType: .viber) + } } diff --git a/docs/QRCODE_DETAIL_VIEW_README.md b/docs/QRCODE_DETAIL_VIEW_README.md index 920c227..bae8f9b 100644 --- a/docs/QRCODE_DETAIL_VIEW_README.md +++ b/docs/QRCODE_DETAIL_VIEW_README.md @@ -95,7 +95,7 @@ Facebook: fb://profile/<用户ID> Spotify: spotify:track:<曲目ID> Twitter: https://twitter.com/<用户名> WhatsApp: whatsapp://send?phone=<电话号码> -Viber: viber://contact?number=<电话号码> +Viber: viber://add?number=<电话号码> Snapchat: snapchat://<用户名> TikTok: https://www.tiktok.com/@<用户名> ```