diff --git a/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 5143a7d..59f6b4a 100644 --- a/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -84,5 +84,37 @@ landmarkType = "14"> + + + + + + + + diff --git a/MyQrCode/Models/QRCodeParser.swift b/MyQrCode/Models/QRCodeParser.swift index 698f007..c831229 100644 --- a/MyQrCode/Models/QRCodeParser.swift +++ b/MyQrCode/Models/QRCodeParser.swift @@ -168,12 +168,12 @@ class QRCodeParser { } // Instagram - if trimmedContent.contains("instagram.com") { + if trimmedContent.hasPrefix("instagram://user?username=") { return parseInstagram(trimmedContent) } // Facebook - if trimmedContent.contains("facebook.com") { + if trimmedContent.hasPrefix("fb://profile/") { return parseFacebook(trimmedContent) } @@ -188,7 +188,7 @@ class QRCodeParser { } // WhatsApp - if trimmedContent.contains("wa.me") { + if trimmedContent.hasPrefix("whatsapp://send?phone=") { return parseWhatsApp(trimmedContent) } @@ -514,7 +514,7 @@ class QRCodeParser { // MARK: - 解析Instagram private static func parseInstagram(_ content: String) -> ParsedQRData { - let username = content.components(separatedBy: "/").dropLast().last ?? "" + let username = content.replacingOccurrences(of: "instagram://user?username=", with: "") return ParsedQRData( type: .instagram, @@ -526,12 +526,12 @@ class QRCodeParser { // MARK: - 解析Facebook private static func parseFacebook(_ content: String) -> ParsedQRData { - let pageId = content.components(separatedBy: "/").dropLast().last ?? "" + let profileId = content.replacingOccurrences(of: "fb://profile/", with: "") return ParsedQRData( type: .facebook, title: "Facebook", - subtitle: "页面: \(pageId)", + subtitle: "用户ID: \(profileId)", icon: "person.2" ) } @@ -562,7 +562,7 @@ class QRCodeParser { // MARK: - 解析WhatsApp private static func parseWhatsApp(_ content: String) -> ParsedQRData { - let phone = content.replacingOccurrences(of: "https://wa.me/", with: "") + let phone = content.replacingOccurrences(of: "whatsapp://send?phone=", with: "") return ParsedQRData( type: .whatsapp, diff --git a/MyQrCode/Views/Components/InputComponentFactory.swift b/MyQrCode/Views/Components/InputComponentFactory.swift index 9479740..078ff4a 100644 --- a/MyQrCode/Views/Components/InputComponentFactory.swift +++ b/MyQrCode/Views/Components/InputComponentFactory.swift @@ -278,15 +278,15 @@ struct InputComponentFactory { case .calendar: return "输入日历事件信息..." case .instagram: - return "输入Instagram信息..." + return "输入Instagram用户名..." case .facebook: - return "输入Facebook信息..." + return "输入Facebook用户ID..." case .spotify: return "输入Spotify信息..." case .twitter: return "输入Twitter信息..." case .whatsapp: - return "输入WhatsApp信息..." + return "输入WhatsApp电话号码(如:+1234567890)..." case .viber: return "输入Viber信息..." case .snapchat: diff --git a/MyQrCode/Views/Components/SocialInputView.swift b/MyQrCode/Views/Components/SocialInputView.swift index f6395d8..6996518 100644 --- a/MyQrCode/Views/Components/SocialInputView.swift +++ b/MyQrCode/Views/Components/SocialInputView.swift @@ -12,9 +12,9 @@ struct SocialInputView: View { case instagram = "Instagram" case facebook = "Facebook" case twitter = "Twitter" - case tiktok = "TikTok" + case tiktok = "Tiktok" case snapchat = "Snapchat" - case whatsapp = "WhatsApp" + case whatsapp = "Whatsapp" case viber = "Viber" case spotify = "Spotify" @@ -51,7 +51,7 @@ struct SocialInputView: View { case .twitter: return "用户名或链接" case .tiktok: return "用户名或链接" case .snapchat: return "用户名" - case .whatsapp: return "消息内容" + case .whatsapp: return "输入WhatsApp电话号码" case .viber: return "消息内容" case .spotify: return "歌曲或播放列表链接" } @@ -59,8 +59,8 @@ struct SocialInputView: View { var hint: String { switch self { - case .instagram: return "输入Instagram用户名或完整链接" - case .facebook: return "输入Facebook用户名或完整链接" + case .instagram: return "输入Instagram用户名" + case .facebook: return "输入Facebook用户ID" case .twitter: return "输入Twitter用户名或完整链接" case .tiktok: return "输入TikTok用户名或完整链接" case .snapchat: return "输入Snapchat用户名" @@ -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,8 +120,8 @@ struct SocialInputView: View { .focused($focusedField, equals: .username) } - // 消息内容 (仅WhatsApp和Viber) - if platform == .whatsapp || platform == .viber { + // 消息内容 (仅Viber) + if platform == .viber { VStack(alignment: .leading, spacing: 8) { HStack { Text("消息内容") @@ -177,11 +177,17 @@ struct SocialInputView: View { private func getFormatHint() -> String { switch platform { case .instagram, .facebook, .twitter, .tiktok: - return "• 可以输入用户名(如:username)\n• 或输入完整链接(如:https://instagram.com/username)" + if platform == .instagram { + return "• 输入Instagram用户名\n• 将生成instagram://user?username=用户名格式" + } else if platform == .facebook { + return "• 输入Facebook用户ID\n• 将生成fb://profile/用户ID格式" + } else { + return "• 可以输入用户名(如:username)\n• 或输入完整链接(如:https://twitter.com/username)" + } case .snapchat: return "• 输入Snapchat用户名\n• 例如:username" case .whatsapp: - return "• 输入WhatsApp消息内容\n• 将生成可分享的链接" + return "• 输入WhatsApp电话号码(如:+1234567890)\n• 将生成whatsapp://send?phone=电话号码格式\n• 用户扫描后可直接打开WhatsApp聊天" case .viber: return "• 输入Viber消息内容\n• 将生成可分享的链接" case .spotify: @@ -196,4 +202,4 @@ struct SocialInputView: View { message: .constant(""), platform: .instagram ) -} \ No newline at end of file +} diff --git a/MyQrCode/Views/CreateQRCodeView.swift b/MyQrCode/Views/CreateQRCodeView.swift index d41a963..58ce508 100644 --- a/MyQrCode/Views/CreateQRCodeView.swift +++ b/MyQrCode/Views/CreateQRCodeView.swift @@ -511,16 +511,15 @@ struct CreateQRCodeView: View { ical += "END:VEVENT" return ical case .instagram: - return "https://instagram.com/\(socialUsername)" + return "instagram://user?username=\(socialUsername)" case .facebook: - return "https://facebook.com/\(socialUsername)" + return "fb://profile/\(socialUsername)" case .spotify: return socialUsername.hasPrefix("http") ? socialUsername : "https://open.spotify.com/track/\(socialUsername)" case .twitter: return "https://twitter.com/\(socialUsername)" case .whatsapp: - let message = socialMessage.isEmpty ? "Hello" : socialMessage - return "https://wa.me/\(socialUsername)?text=\(message.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? message)" + return "whatsapp://send?phone=\(socialUsername)" case .viber: let message = socialMessage.isEmpty ? "Hello" : socialMessage return "viber://chat?number=\(socialUsername)&text=\(message.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? message)" diff --git a/MyQrCode/Views/QRCodeDetailView.swift b/MyQrCode/Views/QRCodeDetailView.swift index c5ecca4..81f59aa 100644 --- a/MyQrCode/Views/QRCodeDetailView.swift +++ b/MyQrCode/Views/QRCodeDetailView.swift @@ -356,6 +356,12 @@ struct ShareSheet: UIViewControllerRepresentable { return NavigationView { QRCodeDetailView(historyItem: item) } } +#Preview("WhatsApp") { + let ctx = PreviewData.context + let item = PreviewData.whatsappSample(in: ctx) + return NavigationView { QRCodeDetailView(historyItem: item) } +} + #Preview("Text") { let ctx = PreviewData.context let item = PreviewData.textSample(in: ctx) @@ -424,10 +430,15 @@ private enum PreviewData { } static func instagramSample(in context: NSManagedObjectContext) -> HistoryItem { - let content = "https://www.instagram.com/example_user/" + let content = "instagram://user?username=example_user" return makeBaseItem(in: context, content: content, qrType: .instagram) } + static func whatsappSample(in context: NSManagedObjectContext) -> HistoryItem { + let content = "whatsapp://send?phone=+1234567890" + return makeBaseItem(in: context, content: content, qrType: .whatsapp) + } + static func textSample(in context: NSManagedObjectContext) -> HistoryItem { let content = "Hello, this is a text message!" return makeBaseItem(in: context, content: content, qrType: .text) diff --git a/docs/QRCODE_DETAIL_VIEW_README.md b/docs/QRCODE_DETAIL_VIEW_README.md index 16863ec..920c227 100644 --- a/docs/QRCODE_DETAIL_VIEW_README.md +++ b/docs/QRCODE_DETAIL_VIEW_README.md @@ -90,11 +90,11 @@ LOCATION:Office END:VEVENT // 社交媒体 -Instagram: https://www.instagram.com/<用户名>/ -Facebook: https://www.facebook.com/<用户名或页面ID> +Instagram: instagram://user?username=<用户名> +Facebook: fb://profile/<用户ID> Spotify: spotify:track:<曲目ID> Twitter: https://twitter.com/<用户名> -WhatsApp: https://wa.me/<电话号码> +WhatsApp: whatsapp://send?phone=<电话号码> Viber: viber://contact?number=<电话号码> Snapchat: snapchat://<用户名> TikTok: https://www.tiktok.com/@<用户名>