本のフリマアプリ「カウル」の類似アプリを作っています。
本のバーコードを読み取って、
本の詳細なデータ(本の画像とタイトルと値段と著者名等)を取得したいです。
作りたいものはこんな感じです。↓
バーコードを読み取って、ISBNを取得するということはできました。
本の情報を取得するにはどうしたらいいのでしょうか?
バーコードをスキャンして、ISBNを取得するまでのコードです。
Swift
1 2 3import UIKit 4import AVFoundation 5import AudioToolbox 6 7class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 8 9 var captureDevice:AVCaptureDevice? 10 var videoPreviewLayer:AVCaptureVideoPreviewLayer? 11 var captureSession:AVCaptureSession? 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 navigationItem.title = "Scanner" 17 view.backgroundColor = .white 18 19 captureDevice = AVCaptureDevice.default(for: .video) 20 // Check if captureDevice returns a value and unwrap it 21 if let captureDevice = captureDevice { 22 23 do { 24 let input = try AVCaptureDeviceInput(device: captureDevice) 25 26 captureSession = AVCaptureSession() 27 guard let captureSession = captureSession else { return } 28 captureSession.addInput(input) 29 30 let captureMetadataOutput = AVCaptureMetadataOutput() 31 captureSession.addOutput(captureMetadataOutput) 32 33 captureMetadataOutput.setMetadataObjectsDelegate(self, queue: .main) 34 captureMetadataOutput.metadataObjectTypes = [.code128, .qr, .ean13, .ean8, .code39] //AVMetadataObject.ObjectType 35 36 captureSession.startRunning() 37 38 videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 39 videoPreviewLayer?.videoGravity = .resizeAspectFill 40 videoPreviewLayer?.frame = view.layer.bounds 41 view.layer.addSublayer(videoPreviewLayer!) 42 43 } catch { 44 print("Error Device Input") 45 } 46 47 } 48 49 view.addSubview(codeLabel) 50 codeLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 51 codeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 52 codeLabel.heightAnchor.constraint(equalToConstant: 50).isActive = true 53 codeLabel.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true 54 55 } 56 57 override func didReceiveMemoryWarning() { 58 super.didReceiveMemoryWarning() 59 // Dispose of any resources that can be recreated. 60 } 61 62 let codeLabel:UILabel = { 63 let codeLabel = UILabel() 64 codeLabel.backgroundColor = .white 65 codeLabel.translatesAutoresizingMaskIntoConstraints = false 66 return codeLabel 67 }() 68 69 let codeFrame:UIView = { 70 let codeFrame = UIView() 71 codeFrame.layer.borderColor = UIColor.green.cgColor 72 codeFrame.layer.borderWidth = 2 73 codeFrame.frame = CGRect.zero 74 codeFrame.translatesAutoresizingMaskIntoConstraints = false 75 return codeFrame 76 }() 77 78 func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { 79 80 captureSession?.stopRunning() 81 guard let objects = metadataObjects as? [AVMetadataObject] else { return } 82 var detectionString: String? = nil 83 let barcodeTypes = [AVMetadataObject.ObjectType.ean8, AVMetadataObject.ObjectType.ean13] 84 for metadataObject in objects { 85 loop: for type in barcodeTypes { 86 guard metadataObject.type == type else { continue } 87 guard self.videoPreviewLayer?.transformedMetadataObject(for: metadataObject) is AVMetadataMachineReadableCodeObject else { continue } 88 if let object = metadataObject as? AVMetadataMachineReadableCodeObject { 89 detectionString = object.stringValue 90 break loop 91 } 92 } 93 var text = "" 94 guard let value = detectionString else { continue } 95 text += "読み込んだ値:\t(value)" 96 text += "\n" 97 guard let isbn = convartISBN(value: value) else { continue } 98 text += "ISBN:\t(isbn)" 99 print("text (text)") 100 101 } 102 103 104 105 } 106 107 108 private func convartISBN(value: String) -> String? { 109 let v = NSString(string: value).longLongValue 110 let prefix: Int64 = Int64(v / 10000000000) 111 guard prefix == 978 || prefix == 979 else { return nil } 112 let isbn9: Int64 = (v % 10000000000) / 10 113 var sum: Int64 = 0 114 var tmpISBN = isbn9 115 /* 116 for var i = 10; i > 0 && tmpISBN > 0; i -= 1 { 117 let divisor: Int64 = Int64(pow(10, Double(i - 2))) 118 sum += (tmpISBN / divisor) * Int64(i) 119 tmpISBN %= divisor 120 } 121 */ 122 123 var i = 10 124 while i > 0 && tmpISBN > 0 { 125 let divisor: Int64 = Int64(pow(10, Double(i - 2))) 126 sum += (tmpISBN / divisor) * Int64(i) 127 tmpISBN %= divisor 128 i -= 1 129 } 130 131 let checkdigit = 11 - (sum % 11) 132 return String(format: "%lld%@", isbn9, (checkdigit == 10) ? "X" : String(format: "%lld", checkdigit % 11)) 133 } 134 135} 136 137
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/11 19:24