diff --git a/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 59f6b4a..f668fcf 100644 --- a/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -94,8 +94,8 @@ filePath = "MyQrCode/Views/CreateQRCodeView.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "145" - endingLineNumber = "145" + startingLineNumber = "139" + endingLineNumber = "139" landmarkName = "createInputComponentForType()" landmarkType = "7"> diff --git a/MyQrCode/Models/HistoryEnums.swift b/MyQrCode/Models/HistoryEnums.swift index f486ac5..ce1b5cf 100644 --- a/MyQrCode/Models/HistoryEnums.swift +++ b/MyQrCode/Models/HistoryEnums.swift @@ -42,7 +42,7 @@ public enum QRCodeType: String, CaseIterable { case instagram = "Instagram" case facebook = "Facebook" case spotify = "Spotify" - case twitter = "Twitter" + case twitter = "X" case whatsapp = "WhatsApp" case viber = "Viber" case snapchat = "Snapchat" diff --git a/MyQrCode/Models/QRCodeParser.swift b/MyQrCode/Models/QRCodeParser.swift index 9592873..4ff226b 100644 --- a/MyQrCode/Models/QRCodeParser.swift +++ b/MyQrCode/Models/QRCodeParser.swift @@ -182,8 +182,8 @@ class QRCodeParser { return parseSpotify(trimmedContent) } - // Twitter - if trimmedContent.contains("twitter.com") { + // X (Twitter) + if trimmedContent.hasPrefix("twitter://user?screen_name=") || trimmedContent.contains("x.com") || trimmedContent.contains("twitter.com") { return parseTwitter(trimmedContent) } @@ -203,7 +203,7 @@ class QRCodeParser { } // TikTok - if trimmedContent.contains("tiktok.com") { + if trimmedContent.contains("tiktok.com") || trimmedContent.contains("www.tiktok.com") { return parseTikTok(trimmedContent) } @@ -548,13 +548,19 @@ class QRCodeParser { ) } - // MARK: - 解析Twitter + // MARK: - 解析X (Twitter) private static func parseTwitter(_ content: String) -> ParsedQRData { - let username = content.components(separatedBy: "/").dropLast().last ?? "" + var username = "" + + if content.hasPrefix("twitter://user?screen_name=") { + username = content.replacingOccurrences(of: "twitter://user?screen_name=", with: "") + } else if content.contains("x.com") || content.contains("twitter.com") { + username = content.components(separatedBy: "/").dropLast().last ?? "" + } return ParsedQRData( type: .twitter, - title: "Twitter", + title: "X", subtitle: "用户名: \(username)", icon: "bird" ) @@ -598,7 +604,19 @@ class QRCodeParser { // MARK: - 解析TikTok private static func parseTikTok(_ content: String) -> ParsedQRData { - let username = content.components(separatedBy: "@").last?.replacingOccurrences(of: "/", with: "") ?? "" + var username = "" + + if content.contains("www.tiktok.com") { + // 处理 https://www.tiktok.com/@username 格式 + if let atIndex = content.lastIndex(of: "@") { + username = String(content[content.index(after: atIndex)...]) + } + } else if content.contains("tiktok.com") { + // 处理 https://tiktok.com/@username 格式 + if let atIndex = content.lastIndex(of: "@") { + username = String(content[content.index(after: atIndex)...]) + } + } return ParsedQRData( type: .tiktok, diff --git a/MyQrCode/Views/Components/InputComponentFactory.swift b/MyQrCode/Views/Components/InputComponentFactory.swift index e21487d..ce627f0 100644 --- a/MyQrCode/Views/Components/InputComponentFactory.swift +++ b/MyQrCode/Views/Components/InputComponentFactory.swift @@ -284,7 +284,7 @@ struct InputComponentFactory { case .spotify: return "输入Spotify信息..." case .twitter: - return "输入Twitter信息..." + return "输入X信息..." case .whatsapp: return "输入WhatsApp电话号码(如:+1234567890)..." case .viber: diff --git a/MyQrCode/Views/Components/SocialInputView.swift b/MyQrCode/Views/Components/SocialInputView.swift index bb4e8aa..0083502 100644 --- a/MyQrCode/Views/Components/SocialInputView.swift +++ b/MyQrCode/Views/Components/SocialInputView.swift @@ -11,7 +11,7 @@ struct SocialInputView: View { enum SocialPlatform: String, CaseIterable { case instagram = "Instagram" case facebook = "Facebook" - case twitter = "Twitter" + case twitter = "X" case tiktok = "Tiktok" case snapchat = "Snapchat" case whatsapp = "Whatsapp" @@ -22,7 +22,7 @@ struct SocialInputView: View { switch self { case .instagram: return "Instagram" case .facebook: return "Facebook" - case .twitter: return "Twitter" + case .twitter: return "X" case .tiktok: return "TikTok" case .snapchat: return "Snapchat" case .whatsapp: return "WhatsApp" @@ -48,8 +48,8 @@ struct SocialInputView: View { switch self { case .instagram: return "用户名或链接" case .facebook: return "用户名或链接" - case .twitter: return "用户名或链接" - case .tiktok: return "用户名或链接" + case .twitter: return "用户名" + case .tiktok: return "用户名" case .snapchat: return "用户名" case .whatsapp: return "输入WhatsApp电话号码" case .viber: return "电话号码" @@ -61,7 +61,7 @@ struct SocialInputView: View { switch self { case .instagram: return "输入Instagram用户名" case .facebook: return "输入Facebook用户ID或链接" - case .twitter: return "输入Twitter用户名或完整链接" + case .twitter: return "输入X用户名或完整链接" case .tiktok: return "输入TikTok用户名或完整链接" case .snapchat: return "输入Snapchat用户名" case .whatsapp: return "输入WhatsApp消息内容" @@ -106,7 +106,8 @@ struct SocialInputView: View { // 用户名/链接 (必填) VStack(alignment: .leading, spacing: 8) { HStack { - Text(platform == .whatsapp || platform == .viber ? "电话号码" : "用户名/链接") + // 根据平台显示不同的提示 + Text(getInputLabel()) .font(.subheadline) .foregroundColor(.primary) Text("*") @@ -160,16 +161,38 @@ struct SocialInputView: View { } } + // MARK: - 根据平台获取输入标签 + private func getInputLabel() -> String { + switch platform { + case .instagram: + return "Instagram用户名" + case .facebook: + return "用户ID或链接" + case .twitter: + return "X用户名" + case .tiktok: + return "TikTok用户名" + case .snapchat: + return "Snapchat用户名" + case .whatsapp: + return "WhatsApp电话号码" + case .viber: + return "Viber电话号码" + case .spotify: + return "歌曲链接或ID" + } + } + private func getFormatHint() -> String { switch platform { - case .instagram, .facebook, .twitter, .tiktok: - if platform == .instagram { - return "• 输入Instagram用户名\n• 将生成instagram://user?username=用户名格式" - } else if platform == .facebook { - return "• 输入Facebook用户ID或完整链接\n• 将自动提取用户名并生成fb://profile/格式\n• 支持:username 或 https://facebook.com/username" - } else { - return "• 可以输入用户名(如:username)\n• 或输入完整链接(如:https://twitter.com/username)" - } + case .instagram: + return "• 输入Instagram用户名\n• 将生成instagram://user?username=用户名格式" + case .facebook: + return "• 输入Facebook用户ID或完整链接\n• 将自动提取用户名并生成fb://profile/格式\n• 支持:username 或 https://facebook.com/username" + case .twitter: + return "• 可以输入用户名(如:username)\n• 将生成twitter://user?screen_name=格式\n• 用户扫描后可直接打开X应用" + case .tiktok: + return "• 输入TikTok用户名(如:username)\n• 将生成https://www.tiktok.com/@username格式\n• 用户扫描后可直接访问TikTok主页" case .snapchat: return "• 输入Snapchat用户名\n• 例如:username" case .whatsapp: @@ -186,6 +209,6 @@ struct SocialInputView: View { SocialInputView( username: .constant(""), message: .constant(""), - platform: .instagram + platform: .tiktok ) } diff --git a/MyQrCode/Views/CreateQRCodeView.swift b/MyQrCode/Views/CreateQRCodeView.swift index 8d6d5d3..70c963a 100644 --- a/MyQrCode/Views/CreateQRCodeView.swift +++ b/MyQrCode/Views/CreateQRCodeView.swift @@ -103,12 +103,6 @@ struct CreateQRCodeView: View { private var inputAndPreviewSection: some View { ScrollView { VStack(spacing: 24) { - // 输入提示 - InputHintView.info( - hint: getContentHint() - ) - .padding(.horizontal, 20) - // 内容输入区域 VStack(spacing: 16) { // 使用InputComponentFactory动态选择输入组件 @@ -517,9 +511,9 @@ struct CreateQRCodeView: View { let facebookId = extractFacebookId(from: socialUsername) return "fb://profile/\(facebookId)" case .spotify: - return socialUsername.hasPrefix("http") ? socialUsername : "https://open.spotify.com/track/\(socialUsername)" + return "https://open.spotify.com/track/\(socialUsername)" case .twitter: - return "https://twitter.com/\(socialUsername)" + return "twitter://user?screen_name=\(socialUsername)" case .whatsapp: return "whatsapp://send?phone=\(socialUsername)" case .viber: @@ -527,7 +521,33 @@ struct CreateQRCodeView: View { case .snapchat: return "https://snapchat.com/add/\(socialUsername)" case .tiktok: - return "https://tiktok.com/@\(socialUsername)" + return "https://www.tiktok.com/@\(socialUsername)" + } + } + + // MARK: - 生成社交媒体内容 + private func generateSocialMediaContent() -> String { + switch selectedQRCodeType { + case .instagram: + return "instagram://user?username=\(socialUsername)" + case .facebook: + // 处理Facebook输入:支持用户名/ID或完整链接 + let facebookId = extractFacebookId(from: socialUsername) + return "fb://profile/\(facebookId)" + case .spotify: + return "https://open.spotify.com/track/\(socialUsername)" + case .twitter: + return "twitter://user?screen_name=\(socialUsername)" + case .whatsapp: + return "whatsapp://send?phone=\(socialUsername)" + case .viber: + return "viber://add?number=\(socialUsername)" + case .snapchat: + return "https://snapchat.com/add/\(socialUsername)" + case .tiktok: + return "https://www.tiktok.com/@\(socialUsername)" + default: + return socialUsername } } @@ -589,7 +609,7 @@ struct CreateQRCodeView: View { case .calendar: historyItem.content = "事件: \(eventTitle)" case .instagram, .facebook, .spotify, .twitter, .snapchat, .tiktok, .whatsapp, .viber: - historyItem.content = "\(selectedQRCodeType.displayName): \(socialUsername)" + historyItem.content = generateSocialMediaContent() case .phone, .sms: historyItem.content = "电话: \(phoneNumber)" case .url: diff --git a/docs/HISTORY_FEATURE_README.md b/docs/HISTORY_FEATURE_README.md index 1b7a111..12ee498 100644 --- a/docs/HISTORY_FEATURE_README.md +++ b/docs/HISTORY_FEATURE_README.md @@ -34,7 +34,7 @@ - `Instagram`: Instagram链接 - `Facebook`: Facebook链接 - `Spotify`: Spotify音乐 -- `Twitter`: Twitter链接 +- `X`: X链接 - `WhatsApp`: WhatsApp消息 - `Viber`: Viber消息 - `Snapchat`: Snapchat链接 diff --git a/docs/QRCODE_DETAIL_VIEW_README.md b/docs/QRCODE_DETAIL_VIEW_README.md index bae8f9b..f831bfb 100644 --- a/docs/QRCODE_DETAIL_VIEW_README.md +++ b/docs/QRCODE_DETAIL_VIEW_README.md @@ -93,7 +93,7 @@ END:VEVENT Instagram: instagram://user?username=<用户名> Facebook: fb://profile/<用户ID> Spotify: spotify:track:<曲目ID> -Twitter: https://twitter.com/<用户名> +X: twitter://user?screen_name=<用户名> WhatsApp: whatsapp://send?phone=<电话号码> Viber: viber://add?number=<电话号码> Snapchat: snapchat://<用户名> @@ -277,7 +277,7 @@ ScrollView { - **Instagram**: 用户主页 - **Facebook**: 页面或用户 - **Spotify**: 音乐曲目 -- **Twitter**: 用户主页 +- **X**: 用户主页 - **WhatsApp**: 聊天链接 - **Viber**: 联系人 - **Snapchat**: 用户