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/@<用户名>