質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1039閲覧

[Swift] バーコードをスキャンして取得したISBNから、本の画像等の情報を取得したい。

kou009

総合スコア16

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

2クリップ

投稿2018/06/11 08:18

編集2018/06/11 08:21

本のフリマアプリ「カウル」の類似アプリを作っています。

本のバーコードを読み取って、
本の詳細なデータ(本の画像とタイトルと値段と著者名等)を取得したいです。
作りたいものはこんな感じです。↓
イメージ説明

バーコードを読み取って、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

本の詳細なデータ(本の画像とタイトルと値段と著者名等)を取得したいです。

openBDにAPIリクエストを行い内容を取得するのが良いのでは。
本の画像(書影)はあとはamazonのAPIでしょうか。
リクエスト数にもよりますが、キャッシュ(サーバー/アプリ内)を間に置くことをお勧めします。

投稿2018/06/11 11:26

編集2018/06/11 11:50
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kou009

2018/06/11 19:24

先に進めず困っていたので助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問