SwiftUI通过邮件收集设备和App信息
SwiftUI通过邮件收集设备和App信息

SwiftUI通过邮件收集设备和App信息

在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

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注