// // WeChatSportVC.swift // Twear // // Created by yangbin on 2021/12/26. // import UIKit import Photos import MBProgressHUD import Alamofire class WeChatSportVC: UIViewController { @IBOutlet weak var QRCodeImageView: UIImageView! @IBOutlet weak var textView: UITextView! override func viewDidLoad() { super.viewDidLoad() title = LocString("微信运动") QRCodeImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(saveImage(_:)))) let hud = MBProgressHUD.showAdded(to: QRCodeImageView, animated: true) hud.bezelView.style = .solidColor hud.bezelView.backgroundColor = .clear // MBProgressHUD.showInView("", icon: nil, view: ) var macStr = CurDevice.mac macStr = macStr.replacingOccurrences(of: ":", with: "", options: .literal, range: nil) let url = "http://www.hodafone.com.cn/qwear/deviceRegisterQuery.php?device_mac=\(macStr)" Alamofire.request(url).responseData { responseData in if let data = responseData.data, let dataStr = String.init(data: data, encoding: .utf8) { if let left = dataStr.range(of: "http://")?.lowerBound, let right = dataStr.range(of: "
authorize_result")?.lowerBound { let qrticket = dataStr[left..authorize_result")!.lowerBound] // dataStr String " \r\n\r\n\r\n\t\r\n\t手表二维码获取\r\n\r\n\r\n\r\n\r\n

Welcome to Qwear Sport World!

\r\n\r\nmac = 00E012345755
qrticket = \":{\"errcode\":100020,\"errmsg\":\"account quota not enough\"
authorize_result = device id invalid
\r\n \r\n \r\n " } } let q1 = "\(LocString("绑定微信运动前的准备"))\n\n" let a1 = LocString("1.解绑设备(苹果手机还需在系统蓝牙中忽略设备)\n2.开启手机蓝牙\n3.确保手表(手环)蓝牙是断开的\n\n") let q2 = "\(LocString("微信运动的绑定方法"))\n\n" let a2 = LocString("1.本界面的图片已经存储于手机相册,打开微信'扫一扫'功能\n2.右上角选择'从相册选取二维码'\n3.找到存储于手机中的图片,识别二维码\n4.在弹出的页面中选择”绑定设备”,进入公众号,完成绑定。\n\n") let q3 = "\(LocString("怎么知道我的设备添加了微信运动?"))\n\n" let a3 = LocString("关闭APP(苹果手机需要在蓝牙中忽略设备),打开微信运动可以看到设备是连接状态,说明你已经添加了微信运动。\n\n") let q4 = "\(LocString("怎么删除微信运动?"))\n\n" let a4 = LocString("打开微信-我-设置-设备-选择设备-删除设备\n\n") let q5 = "\(LocString("我添加了微信运动,为什么手环(手表)的数据更新不了?"))\n\n" let a5 = LocString("原因1:如果你微信运动绑定了手机或者其他的设备,微信运动只会显示数据最大的那一个.\n原因2:如果微信运动没有连接上设备,数据也同步不了\n\n") let q6 = "\(LocString("每次使用微信运动都需要解绑设备或者忽略设备吗?"))\n\n" let a6 = LocString("1.不需要,只是在第一次添加微信运动的时候需要这样做,这样做是为了释放设备蓝牙,使微信可以搜索到设备。(如果设备已经被手机连上,微信运动是无法搜索到设备的)\n2.绑定微信运动后,APP和微信运动可以同时连接设备,互不影响。") let string = NSMutableAttributedString(string: q1+a1+q2+a2+q3+a3+q4+a4+q5+a5+q6+a6) string.addAttributes([.font: RegularFont(17)], range: NSMakeRange(0, q1.count)) string.addAttributes([.font: RegularFont(15)], range: NSMakeRange(q1.count, a1.count)) string.addAttributes([.font: RegularFont(17)], range: NSMakeRange(q1.count+a1.count, q2.count)) string.addAttributes([.font: RegularFont(15)], range: NSMakeRange(q1.count+a1.count+q2.count, a2.count)) string.addAttributes([.font: RegularFont(17)], range: NSMakeRange((q1+a1+q2+a2).count, q3.count)) string.addAttributes([.font: RegularFont(15)], range: NSMakeRange((q1+a1+q2+a2+q3).count, a3.count)) string.addAttributes([.font: RegularFont(17)], range: NSMakeRange((q1+a1+q2+a2+q3+a3).count, q4.count)) string.addAttributes([.font: RegularFont(15)], range: NSMakeRange((q1+a1+q2+a2+q3+a3+q4).count, a4.count)) string.addAttributes([.font: RegularFont(17)], range: NSMakeRange((q1+a1+q2+a2+q3+a3+q4+a4).count, q5.count)) string.addAttributes([.font: RegularFont(15)], range: NSMakeRange((q1+a1+q2+a2+q3+a3+q4+a4+q5).count, a5.count)) string.addAttributes([.font: RegularFont(17)], range: NSMakeRange((q1+a1+q2+a2+q3+a3+q4+a4+q5+a5).count, q6.count)) string.addAttributes([.font: RegularFont(15)], range: NSMakeRange((q1+a1+q2+a2+q3+a3+q4+a4+q5+a5+q6).count, a6.count)) textView.attributedText = string } func createQRCode(_ qrticket: String) { let filter = CIFilter.init(name: "CIQRCodeGenerator") filter?.setDefaults() /// Add Data //链接转换 let data = qrticket.data(using: .utf8) filter?.setValue(data, forKeyPath: "inputMessage") /// Out Put let outputImage = filter?.outputImage /// Show QRCode QRCodeImageView.image = createUIImageFromCIImage(image: outputImage!, size: SCREEN_WIDTH) } func createUIImageFromCIImage(image: CIImage, size: CGFloat) -> UIImage { let extent = image.extent.integral let scale = min(size / extent.width, size / extent.height) /// Create bitmap let width: size_t = size_t(extent.width * scale) let height: size_t = size_t(extent.height * scale) let cs: CGColorSpace = CGColorSpaceCreateDeviceGray() let bitmap: CGContext = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: cs, bitmapInfo: 1)! /// let context = CIContext.init() let bitmapImage = context.createCGImage(image, from: extent) bitmap.interpolationQuality = .none bitmap.scaleBy(x: scale, y: scale) bitmap.draw(bitmapImage!, in: extent) let scaledImage = bitmap.makeImage() return UIImage.init(cgImage: scaledImage!) } @objc private func saveImage(_ gestureRecognizer: UITapGestureRecognizer) { if QRCodeImageView.image == nil { return } // 判断权限 switch PHPhotoLibrary.authorizationStatus() { case .authorized: self.saveImage() case .notDetermined: PHPhotoLibrary.requestAuthorization { [weak self] (status) in if status == .authorized { self?.saveImage() } else { MBProgressHUD.showh(LocString("请在“设置-隐私-照片“选项中,允许'HDF wear'访问你的照片")) } } case .restricted, .denied: let alert = UIAlertController(title: LocString("提示"), message: LocString("请在“设置-隐私-照片“选项中,允许'HDF wear'访问你的照片"), preferredStyle: .alert) let confirm = UIAlertAction(title: LocString("确定"), style: .default) alert.addAction(confirm) default: break } } private func saveImage() { //UIImageView.image must be used from main thread only DispatchQueue.main.async { if let image = self.QRCodeImageView.image { PHPhotoLibrary.shared().performChanges({ PHAssetChangeRequest.creationRequestForAsset(from: image) }, completionHandler: { (isSuccess, error) in if isSuccess {// 成功 MBProgressHUD.showh("已保存到系统相册") } }) } } } deinit { print("deinit\(NSStringFromClass(type(of: self)))!!!!!!!") } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ }