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.

main
v504 2 months ago
parent 6a8d380352
commit 988d36cd52

@ -84,5 +84,37 @@
landmarkType = "14">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "E235C7A9-AA94-4714-83CE-AFB86F88A6B5"
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "MyQrCode/Views/CreateQRCodeView.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "145"
endingLineNumber = "145"
landmarkName = "createInputComponentForType()"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
uuid = "937652B7-5A6D-4691-903E-F45D0841A211"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "MyQrCode/Views/Components/InputComponentFactory.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "233"
endingLineNumber = "233"
landmarkName = "createInputComponent(for:emailConfig:wifiConfig:contactConfig:locationConfig:calendarConfig:socialConfig:phoneConfig:urlConfig:textConfig:)"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>

@ -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,

@ -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:

@ -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)
}
// (WhatsAppViber)
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
)
}
}

@ -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)"

@ -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)

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

Loading…
Cancel
Save