在SwiftUI中发生邮件时,通常需要收集设备和App信息,否则无法定位反馈的问题。
例如,最近有多个用户留言或邮件反馈“存钱猪猪”的“存入/取出”按钮,无法点击。我在本地测试和Xcode均无法复现这一问题。
猜测可能是最新的iOS版本或其他原因导致,但又无法通过邮件获取用户的设备信息,因此需要在邮件中收集设备和App信息。
收集设备和App信息
在用户通过邮件反馈时,在邮件正文中预填设备信息:
import SwiftUI
struct ContentView: View {
var body: some View {
Button("Send Feedback") {
sendEmail()
}
}
func sendEmail() {
let email = "fangjunyu.com@gmail.com"
let subject = "Feedback"
// 收集设备和 App 信息
let systemVersion = UIDevice.current.systemVersion
let deviceModel = UIDevice.current.model
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"
let body = """
---
设备型号: \(deviceModel)
iOS版本: \(systemVersion)
App版本: \(appVersion) (\(buildNumber))
---
请在这行上方输入您的反馈:
"""
// URL 编码参数
let urlString = "mailto:\(email)?subject=\(subject)&body=\(body)"
.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
if let url = URL(string: urlString ?? "") {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
} else {
// 处理无法打开邮件应用的情况
print("Cannot open Mail app.")
}
}
}
}
用户点击按钮并触发邮件功能时,设备信息自动带上。
根据需要,可以把UserDefaults或CoreData中的状态参数拼接进去。

UIDevice.current.model在iOS中只会返回一个大类,例如iPhonne不管是iPhone 13 mini、15Pro还是SE,都会显示“iPhone”,其他类型也是同理,并不会告知具体的机型。
如果想要在反馈邮件中准确获取“iPhone 13 mini”这种型号,可以使用utsname.machine(硬件标识符)。
示例代码:
import UIKit
func deviceIdentifier() -> String {
var systemInfo = utsname()
uname(&systemInfo)
return withUnsafePointer(to: &systemInfo.machine) { ptr in
String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self))
}
}
func deviceName() -> String {
let identifier = deviceIdentifier()
switch identifier {
case "iPhone14,4": return "iPhone 13 mini"
case "iPhone14,5": return "iPhone 13"
case "iPhone14,2": return "iPhone 13 Pro"
case "iPhone14,3": return "iPhone 13 Pro Max"
// 这里继续补充更多机型
default: return identifier
}
}
使用deviceName()获取设备具体型号:
let deviceModel = deviceName()

总结
SwiftUI使用邮件收集设备和App信息时,将信息预填到邮箱正文中,帮助开发者定位问题原因。
获取设备具体型号时,需要自己维护映射表。也可以使用DeviceKit第三方库,进行映射。
相关文章
1、SwiftUI使用MessageUI框架发送邮件:https://fangjunyu.com/2024/06/05/%e4%bd%bf%e7%94%a8swiftui%e5%8f%91%e9%80%81%e9%82%ae%e4%bb%b6/
2、SwiftUI实现发送邮件功能:https://fangjunyu.com/2024/10/19/swift%e5%ae%9e%e7%8e%b0%e5%8f%91%e9%80%81%e9%82%ae%e4%bb%b6%e5%8a%9f%e8%83%bd/
3、DeviceKit:https://github.com/devicekit/DeviceKit