文系iOSエンジニアの備忘録

エンジニア iOS Swift

SwiftでQRコード実装する場合(駅での仕様を想定)

どうもおはようございます、こんにちは、こんばんは。

ちるたろうです。

QRコード実装

はじめに

SwiftにはCore Image という標準で提供されているAPIを利用してQRコードを作成することができます。 QRコード作成、読み取りに関するOSSなどもいくつかありました。 今回は、一番標準的な実装で検証しました。

実装内容

@IBoutlet var QRImageView: UIIMageView! 
let text = "https://XXXX.com" // 今回は文字列でURL取得を想定。
guard let data = text.data(using: .utf8) else { return nil }
guard let QR = CIFilter(name: "CIQRCodeGenerator", parameters: ["inputMessage": data]) else { return nil }
let transform = CGAffineTransform(scaleX: 10, y: 10)
guard let ciImage = QR.outputImage?.transformed(by: transform) else { return nil }
guard let cgImage = CIContext().createCGImage(ciImage, from: ciImage.extent) else { return nil }
QRImageView.image = UIImage(cgImage: cgImage) 

可用性はOS X v10.9以降とiOS 7.0以降で利用できるので問題なし。

・表示例

f:id:chiltarou1224:20200727005146p:plain

参考: CIFilter 公式ドキュメント

QRコード実装に必要な情報

どんな文字列情報が必要なのか。

  • 人数
  • 読み取り期間
  • 区間(一日乗車券だから必要ない?)
  • 乗車可能かの判定? など。

おそらく改札で使用する場合は、入場中かその乗車券が有効期間か、など状態はサーバが持つことになる。

考えうる障害

テストをどのようにするか

検証機のようなものがあるのか?

読み取り機にQRをうまく認識されるかのようなテストケースも実際に開発段階でどこまで対応できるか。

ネットワークエラーでQRコードが端末上にうまく表示できない場合などは出来そう。

セキュリティ面

コピー対策やスクショ対策など。 例えば切符を購入した場合、1枚のQRコード切符を複数人でコピーして利用される。

→ こちらは、海外の例でいうと改札通過時は当該のQRコードが有効かどうかのみをチェックし、出場時に必要な条件を満たしているのかを確認する。この場合、有効かどうかはIDの確認だけで良い。

  切符の1枚1枚にユニークIDを埋め込んでおけば、最初の1枚が改札を通過した瞬間にそのIDでの入場は無効となり、コピーを使っての複数人乗車はできなくなる。

  乗車中、あるいは物理的に離れた場所にあるところで短時間に利用が確認された場合、後から利用されたものをロックする。

他の決済手段との競合

Suica」と違いアプリの場合は1日乗車券が購入できるようにしたいが、どのくらい上記のICカード利用者がアプリを通じて利用するか不明。

通勤の場合は、ポイント付与や割引もあるのであまり利用されないのではないか。

ApplePayを入れるとマネタイズの観点からおいしくない。

複数人乗車の場合

どのようなやり方があるのかは未検討。

参考:https://www.watch.impress.co.jp/docs/series/suzukij/1232490.html

 

ブログの投稿は基本毎日19時頃する予定です。

コメントや反応もらえると嬉しいです!よろしくお願いいたします!