@vppos/react-native-nfc 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/LICENSE +20 -0
  2. package/NFCSDK.podspec +40 -0
  3. package/android/build.gradle +85 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifest.xml +31 -0
  6. package/android/src/main/AndroidManifestNew.xml +30 -0
  7. package/android/src/main/java/com/nfcsdk/ChipReader.kt +237 -0
  8. package/android/src/main/java/com/nfcsdk/NFCSDKModule.kt +78 -0
  9. package/android/src/main/java/com/nfcsdk/NFCSDKPackage.kt +17 -0
  10. package/android/src/main/java/com/nfcsdk/NFCScanActivity.kt +299 -0
  11. package/android/src/main/java/com/nfcsdk/utils/Dg13Parser.kt +278 -0
  12. package/android/src/main/java/com/nfcsdk/utils/FaceExtractor.kt +40 -0
  13. package/android/src/main/java/com/nfcsdk/utils/MrzUtils.kt +75 -0
  14. package/android/src/main/res/drawable/bg_nfc_bottom_sheet.xml +13 -0
  15. package/android/src/main/res/drawable/bg_nfc_sheet_handle.xml +9 -0
  16. package/android/src/main/res/layout/activity_nfc.xml +110 -0
  17. package/android/src/main/res/values/styles.xml +10 -0
  18. package/android/src/main/res/xml/nfc_tech_filter.xml +8 -0
  19. package/ios/ChipReader.swift +258 -0
  20. package/ios/NFCSDK-Bridging-Header.h +2 -0
  21. package/ios/NFCSDK.mm +9 -0
  22. package/ios/NFCSDK.swift +112 -0
  23. package/ios/NFCSDKSession.swift +5 -0
  24. package/ios/utils/DG13Parser.swift +302 -0
  25. package/ios/utils/MrzUtils.swift +49 -0
  26. package/lib/module/errors.js +9 -0
  27. package/lib/module/errors.js.map +1 -0
  28. package/lib/module/index.js +118 -0
  29. package/lib/module/index.js.map +1 -0
  30. package/lib/module/package.json +1 -0
  31. package/lib/module/types.js +2 -0
  32. package/lib/module/types.js.map +1 -0
  33. package/lib/typescript/package.json +1 -0
  34. package/lib/typescript/src/errors.d.ts +4 -0
  35. package/lib/typescript/src/errors.d.ts.map +1 -0
  36. package/lib/typescript/src/index.d.ts +80 -0
  37. package/lib/typescript/src/index.d.ts.map +1 -0
  38. package/lib/typescript/src/types.d.ts +45 -0
  39. package/lib/typescript/src/types.d.ts.map +1 -0
  40. package/package.json +155 -0
  41. package/src/errors.ts +6 -0
  42. package/src/index.tsx +141 -0
  43. package/src/types.ts +45 -0
  44. package/vendor/ios-passport-reader/CHANGELOG +362 -0
  45. package/vendor/ios-passport-reader/CODE_OF_CONDUCT.md +77 -0
  46. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/AppDelegate.swift +39 -0
  47. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/Contents.json +158 -0
  48. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40.png +0 -0
  49. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png +0 -0
  50. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png +0 -0
  51. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png +0 -0
  52. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png +0 -0
  53. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72.png +0 -0
  54. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png +0 -0
  55. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76.png +0 -0
  56. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png +0 -0
  57. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png +0 -0
  58. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50.png +0 -0
  59. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50@2x.png +0 -0
  60. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small.png +0 -0
  61. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@2x.png +0 -0
  62. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@3x.png +0 -0
  63. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon.png +0 -0
  64. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon@2x.png +0 -0
  65. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/ios-marketing.png +0 -0
  66. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@2x.png +0 -0
  67. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@3x.png +0 -0
  68. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad.png +0 -0
  69. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad@2x.png +0 -0
  70. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/Contents.json +6 -0
  71. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/background.imageset/Contents.json +21 -0
  72. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/background.imageset/background.png +0 -0
  73. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/head.imageset/Contents.json +21 -0
  74. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Assets.xcassets/head.imageset/head.png +0 -0
  75. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Base.lproj/LaunchScreen.storyboard +25 -0
  76. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Extensions/FileManagerExt.swift +16 -0
  77. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Extensions/StringExt.swift +40 -0
  78. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Extensions/UIApplicationExt.swift +21 -0
  79. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Info.plist +77 -0
  80. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Model/PassportUtils.swift +76 -0
  81. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Model/SettingsStore.swift +107 -0
  82. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/NFCPassportReader.entitlements +10 -0
  83. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/SceneDelegate.swift +57 -0
  84. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/DetailsView.swift +197 -0
  85. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/ExportPassportView.swift +164 -0
  86. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/HelperViews/CheckBoxView.swift +48 -0
  87. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/HelperViews/ViewExt.swift +20 -0
  88. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/HelperViews/ViewModifiers.swift +41 -0
  89. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/MRZEntryView.swift +125 -0
  90. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/MRZScannerViewController.swift +90 -0
  91. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/MainView.swift +214 -0
  92. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/PassportSummaryView.swift +111 -0
  93. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/PassportView.swift +73 -0
  94. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/SettingsView.swift +63 -0
  95. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/Views/StoredPassportView.swift +152 -0
  96. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/masterList.pem +32 -0
  97. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp/readme.md +10 -0
  98. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcodeproj/project.pbxproj +695 -0
  99. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcodeproj/xcshareddata/xcschemes/NFCPassportReader.xcscheme +106 -0
  100. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcworkspace/contents.xcworkspacedata +10 -0
  101. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  102. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderApp.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +8 -0
  103. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/DataGroupParsingTests.swift +189 -0
  104. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/Info.plist +22 -0
  105. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/NFCPassportReaderTests.swift +260 -0
  106. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/NFCPassportReaderAppTests/PACETests.swift +112 -0
  107. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/Podfile +22 -0
  108. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/Podfile.lock +35 -0
  109. package/vendor/ios-passport-reader/Examples/Example_CocoaPods/README.md +2 -0
  110. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/AppDelegate.swift +39 -0
  111. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/Contents.json +158 -0
  112. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40.png +0 -0
  113. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png +0 -0
  114. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png +0 -0
  115. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png +0 -0
  116. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png +0 -0
  117. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72.png +0 -0
  118. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png +0 -0
  119. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76.png +0 -0
  120. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png +0 -0
  121. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png +0 -0
  122. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50.png +0 -0
  123. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small-50@2x.png +0 -0
  124. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small.png +0 -0
  125. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@2x.png +0 -0
  126. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon-small@3x.png +0 -0
  127. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon.png +0 -0
  128. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/icon@2x.png +0 -0
  129. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/ios-marketing.png +0 -0
  130. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@2x.png +0 -0
  131. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon@3x.png +0 -0
  132. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad.png +0 -0
  133. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/AppIcon.appiconset/notification-icon~ipad@2x.png +0 -0
  134. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/Contents.json +6 -0
  135. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/background.imageset/Contents.json +21 -0
  136. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/background.imageset/background.png +0 -0
  137. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/head.imageset/Contents.json +21 -0
  138. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Assets.xcassets/head.imageset/head.png +0 -0
  139. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Base.lproj/LaunchScreen.storyboard +25 -0
  140. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Extensions/FileManagerExt.swift +16 -0
  141. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Extensions/StringExt.swift +40 -0
  142. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Extensions/UIApplicationExt.swift +21 -0
  143. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Info.plist +79 -0
  144. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Model/PassportUtils.swift +99 -0
  145. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Model/SettingsStore.swift +98 -0
  146. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Model/SettingsStoreCAN.swift +75 -0
  147. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/LICENSE +21 -0
  148. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/PreviewView.swift +34 -0
  149. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/StringUtils.swift +160 -0
  150. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/ViewController.swift +320 -0
  151. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/MrzScanner/VisionViewController.swift +163 -0
  152. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/NFCPassportReader.entitlements +10 -0
  153. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/SceneDelegate.swift +58 -0
  154. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/CANViews/CanKeyView.swift +251 -0
  155. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/CANViews/MRZEntryViewCanKey.swift +65 -0
  156. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/CANViews/PassportViewCAN.swift +73 -0
  157. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/DetailsView.swift +193 -0
  158. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/ExportPassportView.swift +164 -0
  159. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/HelperViews/CheckBoxView.swift +48 -0
  160. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/HelperViews/ViewExt.swift +20 -0
  161. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/HelperViews/ViewModifiers.swift +41 -0
  162. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/MRZEntryView.swift +125 -0
  163. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/MRZScannerViewController.swift +90 -0
  164. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/MainView.swift +264 -0
  165. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/PassportSummaryView.swift +111 -0
  166. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/PassportView.swift +73 -0
  167. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/SettingsView.swift +47 -0
  168. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/Views/StoredPassportView.swift +149 -0
  169. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/masterList.pem +32 -0
  170. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp/readme.md +10 -0
  171. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/project.pbxproj +683 -0
  172. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  173. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +25 -0
  174. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderApp.xcodeproj/xcshareddata/xcschemes/NFCPassportReader.xcscheme +106 -0
  175. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/DataGroupParsingTests.swift +190 -0
  176. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/Info.plist +22 -0
  177. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/NFCPassportReaderTests.swift +260 -0
  178. package/vendor/ios-passport-reader/Examples/Example_SPM/NFCPassportReaderAppTests/PACETests.swift +112 -0
  179. package/vendor/ios-passport-reader/LICENSE +21 -0
  180. package/vendor/ios-passport-reader/NFCPassportReader.podspec +27 -0
  181. package/vendor/ios-passport-reader/Package.swift +29 -0
  182. package/vendor/ios-passport-reader/README.md +141 -0
  183. package/vendor/ios-passport-reader/Sources/NFCPassportReader/AES_3DES_DESEncryption.swift +377 -0
  184. package/vendor/ios-passport-reader/Sources/NFCPassportReader/BACHandler.swift +194 -0
  185. package/vendor/ios-passport-reader/Sources/NFCPassportReader/ChipAuthenticationHandler.swift +224 -0
  186. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroupHash.swift +16 -0
  187. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroupParser.swift +36 -0
  188. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/ActiveAuthenticationInfo.swift +69 -0
  189. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/COM.swift +61 -0
  190. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/CardAccess.swift +38 -0
  191. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/ChipAuthenticationInfo.swift +135 -0
  192. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/ChipAuthenticationPublicKeyInfo.swift +53 -0
  193. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup.swift +103 -0
  194. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup1.swift +111 -0
  195. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup11.swift +66 -0
  196. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup12.swift +75 -0
  197. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup14.swift +37 -0
  198. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup15.swift +46 -0
  199. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup2.swift +163 -0
  200. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroup7.swift +46 -0
  201. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/DataGroupId.swift +105 -0
  202. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/NotImplementedDG.swift +16 -0
  203. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/PACEInfo.swift +415 -0
  204. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/SOD.swift +240 -0
  205. package/vendor/ios-passport-reader/Sources/NFCPassportReader/DataGroups/SecurityInfo.swift +136 -0
  206. package/vendor/ios-passport-reader/Sources/NFCPassportReader/Errors.swift +148 -0
  207. package/vendor/ios-passport-reader/Sources/NFCPassportReader/Logging.swift +32 -0
  208. package/vendor/ios-passport-reader/Sources/NFCPassportReader/Models/FaceImageInfo.swift +161 -0
  209. package/vendor/ios-passport-reader/Sources/NFCPassportReader/NFCPassportModel.swift +540 -0
  210. package/vendor/ios-passport-reader/Sources/NFCPassportReader/NFCViewDisplayMessage.swift +60 -0
  211. package/vendor/ios-passport-reader/Sources/NFCPassportReader/OpenSSLUtils.swift +705 -0
  212. package/vendor/ios-passport-reader/Sources/NFCPassportReader/PACEHandler.swift +627 -0
  213. package/vendor/ios-passport-reader/Sources/NFCPassportReader/PassportReader.swift +387 -0
  214. package/vendor/ios-passport-reader/Sources/NFCPassportReader/Resources/PrivacyInfo.xcprivacy +14 -0
  215. package/vendor/ios-passport-reader/Sources/NFCPassportReader/ResponseAPDU.swift +25 -0
  216. package/vendor/ios-passport-reader/Sources/NFCPassportReader/SecureMessaging.swift +301 -0
  217. package/vendor/ios-passport-reader/Sources/NFCPassportReader/SecureMessagingSessionKeyGenerator.swift +156 -0
  218. package/vendor/ios-passport-reader/Sources/NFCPassportReader/SimpleASN1DumpParser.swift +173 -0
  219. package/vendor/ios-passport-reader/Sources/NFCPassportReader/TagReader.swift +374 -0
  220. package/vendor/ios-passport-reader/Sources/NFCPassportReader/Utils.swift +430 -0
  221. package/vendor/ios-passport-reader/Sources/NFCPassportReader/X509Wrapper.swift +168 -0
  222. package/vendor/ios-passport-reader/scripts/README.md +45 -0
  223. package/vendor/ios-passport-reader/scripts/extract.py +197 -0
@@ -0,0 +1,197 @@
1
+ //
2
+ // DetailsView.swift
3
+ // NFCPassportReaderApp
4
+ //
5
+ // Created by Andy Qua on 30/10/2019.
6
+ // Copyright © 2019 Andy Qua. All rights reserved.
7
+ //
8
+
9
+ import SwiftUI
10
+ import NFCPassportReader
11
+
12
+ struct Item : Identifiable {
13
+ var id = UUID()
14
+ var title : String
15
+ var value : String
16
+
17
+ var textColor : Color {
18
+ return value.hasPrefix("FAILED") ? Color.red : Color.primary
19
+ }
20
+ }
21
+
22
+
23
+ struct DetailsView : View {
24
+ private var passport: NFCPassportModel
25
+ private var sectionNames = ["Chip information", "Verification information", "Document signing certificate", "Country signing certificate", "Security Info details", "Datagroup Hashes"]
26
+ private var sections = [[Item]]()
27
+
28
+ init( passport : NFCPassportModel ) {
29
+ self.passport = passport
30
+ sections.append(getChipInfoSection(self.passport))
31
+ sections.append(getVerificationDetailsSection(self.passport))
32
+ sections.append(getCertificateSigningCertDetails(certItems:self.passport.documentSigningCertificate?.getItemsAsDict()))
33
+ sections.append(getCertificateSigningCertDetails(certItems:self.passport.countrySigningCertificate?.getItemsAsDict()))
34
+ sections.append(getSecurityInfosSection(self.passport))
35
+ sections.append(getDataGroupHashesSection(self.passport))
36
+ }
37
+
38
+ var body: some View {
39
+ VStack {
40
+ List {
41
+ ForEach( 0 ..< self.sectionNames.count ) { i in
42
+ if self.sections[i].count > 0 {
43
+ SectionGroup(sectionTitle: self.sectionNames[i], items: self.sections[i])
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+
50
+ func getChipInfoSection(_ passport: NFCPassportModel) -> [Item] {
51
+ // Build Chip info section
52
+ let chipInfo = [Item(title:"LDS Version", value: passport.LDSVersion),
53
+ Item(title:"Data groups present", value: passport.dataGroupsPresent.joined(separator: ", ")),
54
+ Item(title:"Data groups read", value: passport.dataGroupsAvailable.map { $0.getName()}.joined(separator: ", "))]
55
+
56
+ return chipInfo
57
+ }
58
+
59
+ func getVerificationDetailsSection(_ passport: NFCPassportModel) -> [Item] {
60
+ // Build Verification Info section
61
+ var activeAuth : String = "Not supported"
62
+ if passport.activeAuthenticationSupported {
63
+ activeAuth = passport.activeAuthenticationPassed ? "SUCCESS\nSignature verified" : "FAILED\nCould not verify signature"
64
+ }
65
+ var chipAuth : String = "Not supported"
66
+ if passport.isChipAuthenticationSupported {
67
+ switch( passport.chipAuthenticationStatus ) {
68
+ case .notDone:
69
+ chipAuth = "Supported - Not done"
70
+ case .success:
71
+ chipAuth = "SUCCESS\nSignature verified"
72
+ case .failed:
73
+ chipAuth = "FAILED\nCould not verify signature"
74
+ }
75
+ }
76
+
77
+ var authType : String = "Authentication not done"
78
+ if passport.PACEStatus == .success {
79
+ authType = "PACE"
80
+ } else if passport.BACStatus == .success {
81
+ authType = "BAC"
82
+ }
83
+
84
+ // Do PACE Info
85
+ var paceStatus = "Not Supported"
86
+ if passport.isPACESupported {
87
+ switch( passport.PACEStatus ) {
88
+ case .notDone:
89
+ paceStatus = "Supported - Not done"
90
+ case .success:
91
+ paceStatus = "SUCCESS"
92
+ case .failed:
93
+ paceStatus = "FAILED"
94
+ }
95
+ }
96
+
97
+ let verificationDetails : [Item] = [
98
+ Item(title: "Access Control", value: authType),
99
+ Item(title: "PACE", value: paceStatus),
100
+ Item(title: "Chip Authentication", value: chipAuth),
101
+ Item(title: "Active Authentication", value: activeAuth),
102
+ Item(title: "Document Signing Certificate", value: passport.documentSigningCertificateVerified ? "SUCCESS\nSOD Signature verified" : "FAILED\nCouldn't verify SOD signature"),
103
+ Item(title: "Country signing Certificate", value: passport.passportCorrectlySigned ? "SUCCESS\nmatched to country signing certificate" : "FAILED\nCouldn't build trust chain"),
104
+ Item(title: "Data group hashes", value: passport.passportDataNotTampered ? "SUCCESS\nAll hashes match" : "FAILED\nCouldn't match hashes" )
105
+ ]
106
+
107
+ return verificationDetails
108
+ }
109
+
110
+ func getCertificateSigningCertDetails( certItems : [CertificateItem : String]? ) -> [Item] {
111
+ let titles : [String] = ["Serial number", "Signature algorithm", "Public key algorithm", "Certificate fingerprint", "Issuer", "Subject", "Valid from", "Valid to"]
112
+
113
+ var items = [Item]()
114
+ if certItems?.count ?? 0 == 0 {
115
+ items.append( Item(title:"Certificate details", value: "NOT FOUND" ) )
116
+ } else {
117
+ for title in titles {
118
+ let ci = CertificateItem(rawValue:title)!
119
+ items.append( Item(title:title, value: certItems?[ci] ?? "") )
120
+ }
121
+ }
122
+ return items
123
+ }
124
+
125
+ func getDataGroupHashesSection(_ passport: NFCPassportModel) -> [Item] {
126
+ var dgHashes = [Item]()
127
+ for id in DataGroupId.allCases {
128
+ if let hash = passport.dataGroupHashes[id] {
129
+ dgHashes.append( Item(title:hash.id, value:hash.match ? "MATCHED" : "UNMATCHED"))
130
+ dgHashes.append( Item(title:"SOD Hash", value: hash.sodHash))
131
+ dgHashes.append( Item(title:"Computed Hash", value: hash.computedHash))
132
+ }
133
+ }
134
+ return dgHashes
135
+ }
136
+
137
+ func getSecurityInfosSection( _ passport : NFCPassportModel) -> [Item] {
138
+ guard let dg14 = passport.getDataGroup(.DG14) as? DataGroup14 else { return [] }
139
+
140
+ var items = [Item]()
141
+ for secInfo in dg14.securityInfos {
142
+ var title : String = ""
143
+ var value : String = ""
144
+ if let cai = secInfo as? ChipAuthenticationInfo {
145
+ title = "ChipAuthenticationInfo"
146
+ value = "\(secInfo.getProtocolOIDString())\n\(secInfo.getObjectIdentifier())\nUses Key Id: \(cai.getKeyId())"
147
+ } else if let capki = secInfo as? ChipAuthenticationPublicKeyInfo {
148
+ title = "ChipAuthenticationPublicKeyInfo"
149
+ value = "\(secInfo.getProtocolOIDString())\n\(secInfo.getObjectIdentifier())\nKey Id: \(capki.getKeyId())"
150
+ } else if let pacei = secInfo as? PACEInfo {
151
+ title = "PACEInfo"
152
+ value = "\(pacei.getProtocolOIDString())\n\(pacei.getObjectIdentifier())\nParameter ID: \(pacei.getParameterId() ?? -1)"
153
+ } else if let activeAuthInfo = secInfo as? ActiveAuthenticationInfo {
154
+ title = "ActiveAuthenticationInfo"
155
+ value =
156
+ "\(activeAuthInfo.getProtocolOIDString())\n\(activeAuthInfo.getSignatureAlgorithmOIDString() ?? "")"
157
+ }
158
+
159
+ items.append( Item(title:title, value: value))
160
+
161
+ }
162
+ return items
163
+ }
164
+ }
165
+
166
+ struct SectionGroup : View {
167
+ var sectionTitle : String
168
+ var items : [Item]
169
+
170
+ var body: some View {
171
+ Section(header: Text(sectionTitle)) {
172
+ ForEach(self.items) { item in
173
+ VStack(alignment:.leading, spacing:0) {
174
+ Text(item.title)
175
+ .font(.headline)
176
+ Text(item.value)
177
+ .foregroundColor(item.textColor)
178
+ .lineLimit(nil)
179
+ }
180
+ }
181
+ }
182
+ }
183
+ }
184
+
185
+
186
+ struct DetailsView_Previews: PreviewProvider {
187
+
188
+ static var previews: some View {
189
+ let settings = SettingsStore()
190
+ let passport = NFCPassportModel()
191
+ return DetailsView(passport:passport)
192
+ .environmentObject(settings)
193
+ .environment( \.colorScheme, .light)
194
+ }
195
+ }
196
+
197
+
@@ -0,0 +1,164 @@
1
+ //
2
+ // ExportPassportView.swift
3
+ // NFCPassportReaderApp
4
+ //
5
+ // Created by Andy Qua on 11/02/2021.
6
+ // Copyright © 2021 Andy Qua. All rights reserved.
7
+ //
8
+
9
+ import SwiftUI
10
+ import NFCPassportReader
11
+
12
+ struct MultipleSelectionRow: View {
13
+ var title: String
14
+ var isSelected: Bool
15
+ var action: () -> Void
16
+
17
+ var body: some View {
18
+ Button(action: self.action) {
19
+ HStack {
20
+ Text(self.title)
21
+ if self.isSelected {
22
+ Spacer()
23
+ Image(systemName: "checkmark")
24
+ }
25
+ }
26
+ }
27
+ .foregroundColor(.primary)
28
+ }
29
+ }
30
+
31
+ struct ExportPassportView: View {
32
+ @EnvironmentObject var settings: SettingsStore
33
+
34
+ @State var items: [DataGroupId] = []
35
+ @State var selections: [DataGroupId] = []
36
+ @State var isAASupported : Bool = false
37
+ @State var includeAA : Bool = false
38
+
39
+ var body: some View {
40
+ Form {
41
+ Section(header: Text("Select Passport items to export"), footer:Text("* contains personal information")) {
42
+ List {
43
+ ForEach(items, id: \.self) { item in
44
+ MultipleSelectionRow(title: dgToText(item), isSelected: self.selections.contains(item)) {
45
+ if self.selections.contains(item) {
46
+ self.selections.removeAll(where: { $0 == item })
47
+ }
48
+ else {
49
+ self.selections.append(item)
50
+ }
51
+ }
52
+ }
53
+ }
54
+ if isAASupported {
55
+ Toggle("Include Active Authentication Challenge/Response?", isOn: $includeAA)
56
+ .foregroundColor(.primary)
57
+ }
58
+ }
59
+ Button(action: {
60
+ sharePassport()
61
+ }, label: {
62
+ Text("Export selected passport details")
63
+ .font(.title3)
64
+ })
65
+ .foregroundColor(.primary)
66
+ }
67
+ .navigationTitle("Export passport")
68
+ .onAppear() {
69
+ if let passport = settings.passport {
70
+ items = [.SOD, .COM]
71
+ items.append(contentsOf: DataGroupId.allCases.filter { passport.dataGroupsAvailable.contains($0) } )
72
+
73
+ // Default select only the DGs that contain no personal info.
74
+ selections = [.SOD, .COM, .DG14, .DG15]
75
+ isAASupported = passport.activeAuthenticationSupported
76
+ if isAASupported {
77
+ includeAA = true
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+
84
+ extension ExportPassportView {
85
+ func sharePassport() {
86
+ do {
87
+ let dict = settings.passport!.dumpPassportData( selectedDataGroups:selections,includeActiveAuthenticationData: includeAA)
88
+ let data = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
89
+
90
+ let temporaryURL = URL(fileURLWithPath: NSTemporaryDirectory() + "passport.json")
91
+ try data.write(to: temporaryURL)
92
+
93
+ let av = UIActivityViewController(activityItems: [temporaryURL], applicationActivities: nil)
94
+
95
+ let keyWindow = UIApplication.shared.connectedScenes
96
+ .filter({$0.activationState == .foregroundActive})
97
+ .map({$0 as? UIWindowScene})
98
+ .compactMap({$0})
99
+ .first?.windows
100
+ .filter({$0.isKeyWindow}).first
101
+
102
+ keyWindow?.rootViewController?.present(av, animated: true, completion: nil)
103
+ } catch {
104
+ print( "ERROR - \(error)" )
105
+ }
106
+ }
107
+
108
+ func dgToText( _ dg : DataGroupId ) -> String {
109
+ switch ( dg ) {
110
+ case .SOD:
111
+ return "SOD - Document Security Object"
112
+ case .COM:
113
+ return "COM - Header and DG Presence"
114
+ case .DG1:
115
+ return "DG1* - MRZ Info"
116
+ case .DG2:
117
+ return "DG2* - Face image"
118
+ case .DG3:
119
+ return "DG3* - Fingerprints"
120
+ case .DG4:
121
+ return "DG4* - Iris"
122
+ case .DG5:
123
+ return "DG5* - Displayed portrait"
124
+ case .DG6:
125
+ return "DG6 - Reserved"
126
+ case .DG7:
127
+ return "DG7* - Signature"
128
+ case .DG8:
129
+ return "DG8* - Data features"
130
+ case .DG9:
131
+ return "DG9* - Structure features"
132
+ case .DG10:
133
+ return "DG10* - Substance features"
134
+ case .DG11:
135
+ return "DG11* - Additional personal info"
136
+ case .DG12:
137
+ return "DG12* - Additional document info"
138
+ case .DG13:
139
+ return "DG13* - Optional details"
140
+ case .DG14:
141
+ return "DG14 - Security options"
142
+ case .DG15:
143
+ return "DG15 - Active Auth PubKey"
144
+ case .DG16:
145
+ return "DG16 - Person(s) to notify"
146
+ default:
147
+ return "Unknown"
148
+ }
149
+ }
150
+
151
+ }
152
+
153
+
154
+ struct ExportPassportView_Previews: PreviewProvider {
155
+ static var previews: some View {
156
+ let settings = SettingsStore()
157
+ settings.passport = NFCPassportModel()
158
+
159
+ return NavigationView {
160
+ ExportPassportView()
161
+ }
162
+ .environmentObject(settings)
163
+ }
164
+ }
@@ -0,0 +1,48 @@
1
+ //
2
+ // CheckBoxView.swift
3
+ // NFCPassportReaderApp
4
+ //
5
+ // Created by Andy Qua on 10/02/2021.
6
+ // Copyright © 2021 Andy Qua. All rights reserved.
7
+ //
8
+
9
+ import SwiftUI
10
+
11
+ struct CheckBoxButtonStyle: ButtonStyle {
12
+
13
+ func makeBody(configuration: Self.Configuration) -> some View {
14
+ configuration.label
15
+ .foregroundColor(.secondary)
16
+ }
17
+ }
18
+
19
+
20
+ struct CheckBoxView: View {
21
+ @Binding var checked: Bool
22
+ var text : String
23
+
24
+ var body: some View {
25
+ HStack() {
26
+
27
+ Button(action: {
28
+ withAnimation {
29
+ self.checked.toggle()
30
+ }
31
+ }) {
32
+ HStack(alignment: .center, spacing: 10) {
33
+ Text(text)
34
+ Image(systemName:self.checked ? "checkmark.square.fill" : "square")
35
+ }
36
+ }
37
+ .frame(height: 44, alignment: .center)
38
+ .padding(.trailing)
39
+ .buttonStyle(CheckBoxButtonStyle())
40
+ }
41
+ }
42
+ }
43
+
44
+ struct CheckBoxView_Previews: PreviewProvider {
45
+ static var previews: some View {
46
+ CheckBoxView( checked: .constant(true), text:"Are you on?")
47
+ }
48
+ }
@@ -0,0 +1,20 @@
1
+ //
2
+ // ViewExt.swift
3
+ // NFCPassportReaderApp
4
+ //
5
+ // Created by Andy Qua on 11/02/2021.
6
+ // Copyright © 2021 Andy Qua. All rights reserved.
7
+ //
8
+
9
+ import SwiftUI
10
+ import UIKit
11
+
12
+ extension View {
13
+ func hideKeyboard() {
14
+ UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
15
+ }
16
+
17
+ func visibility(hidden: Binding<Bool>) -> some View {
18
+ modifier(VisibilityStyle(hidden: hidden))
19
+ }
20
+ }
@@ -0,0 +1,41 @@
1
+ //
2
+ // ViewModifiers.swift
3
+ // NFCPassportReaderApp
4
+ //
5
+ // Created by Andy Qua on 10/02/2021.
6
+ // Copyright © 2021 Andy Qua. All rights reserved.
7
+ //
8
+
9
+ import SwiftUI
10
+
11
+ struct ClearButton: ViewModifier {
12
+ @Binding var text: String
13
+
14
+ public func body(content: Content) -> some View {
15
+ HStack {
16
+ content
17
+ if !text.isEmpty {
18
+ Button(action: { self.text = "" },
19
+ label: {
20
+ Image(systemName: "delete.left")
21
+ .foregroundColor(Color(UIColor.opaqueSeparator))
22
+ }
23
+ )
24
+ }
25
+ }
26
+ }
27
+ }
28
+
29
+ struct VisibilityStyle: ViewModifier {
30
+
31
+ @Binding var hidden: Bool
32
+ func body(content: Content) -> some View {
33
+ Group {
34
+ if hidden {
35
+ content.hidden()
36
+ } else {
37
+ content
38
+ }
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,125 @@
1
+ //
2
+ // MRZEntryView.swift
3
+ // NFCPassportReaderApp
4
+ //
5
+ // Created by Andy Qua on 10/02/2021.
6
+ // Copyright © 2021 Andy Qua. All rights reserved.
7
+ //
8
+
9
+ import SwiftUI
10
+
11
+ // This will be removed once DatePicker inline works correctly
12
+ struct DateView : View {
13
+ @Binding var date : Date
14
+ var title : String
15
+
16
+ var body : some View {
17
+ VStack {
18
+ Text(title)
19
+ .font(.largeTitle)
20
+ Spacer()
21
+ DatePicker("Date of birth", selection:$date, displayedComponents: .date)
22
+ .environment(\.timeZone, TimeZone(secondsFromGMT: 0)!)
23
+ .datePickerStyle(WheelDatePickerStyle())
24
+ .labelsHidden()
25
+ Spacer()
26
+ }
27
+ }
28
+ }
29
+
30
+ // This should be a nice simple inline DatePicker here
31
+ // BUT there are bugs when you select dates it changes the date format
32
+ // from DD MMM YYYY to DD/MM/YYYY!)
33
+ // Will update when/if this gets fixed!
34
+ struct MRZEntryView : View {
35
+ @EnvironmentObject var settings: SettingsStore
36
+
37
+ // These will be removed once DatePicker inline works correctly
38
+ @State private var editDOB = false
39
+ @State private var editDOE = false
40
+ @State private var editDateTitle : String = ""
41
+
42
+ var body : some View {
43
+ let passportNrBinding = Binding<String>(get: {
44
+ settings.passportNumber
45
+ }, set: {
46
+ settings.passportNumber = $0.uppercased()
47
+ })
48
+ VStack {
49
+ NavigationLink( destination: DateView(date:$settings.dateOfBirth, title:editDateTitle), isActive: $editDOB) { Text("") }
50
+ NavigationLink( destination: DateView(date:$settings.dateOfExpiry, title:editDateTitle), isActive: $editDOE) { Text("") }
51
+
52
+ TextField("Passport number", text: passportNrBinding)
53
+ .textCase(.uppercase)
54
+ .modifier(ClearButton(text: passportNrBinding))
55
+ .textContentType(.name)
56
+ .foregroundColor(Color.primary)
57
+ .padding([.leading, .trailing])
58
+ .ignoresSafeArea(.keyboard, edges: .all)
59
+
60
+ Divider()
61
+
62
+ // Replace with DatePicker once it works correctly
63
+ HStack {
64
+ VStack {
65
+ Text( "Date of birth" )
66
+ Button(formatDate(settings.dateOfBirth)) {
67
+ editDateTitle = "Select date of birth"
68
+ editDOB = true
69
+ }
70
+ .padding(.horizontal, 15)
71
+ .padding(.vertical, 8)
72
+ .background(Color.black.opacity(0.07))
73
+ .cornerRadius(8)
74
+ }
75
+ Spacer()
76
+ VStack {
77
+ Text( "Passport expiry date" )
78
+ Button(formatDate(settings.dateOfExpiry)) {
79
+ editDateTitle = "Select passport expiry date"
80
+ editDOE = true
81
+ }
82
+ .padding(.horizontal, 15)
83
+ .padding(.vertical, 8)
84
+ .background(Color.black.opacity(0.07))
85
+ .cornerRadius(8)
86
+ }
87
+ }
88
+ .padding([.leading, .trailing])
89
+
90
+ Divider()
91
+ }
92
+ .ignoresSafeArea(.keyboard, edges: .bottom)
93
+ }
94
+ }
95
+
96
+ // This will be removed once DatePicker inline works correctly
97
+ extension MRZEntryView {
98
+
99
+ func formatDate( _ date : Date ) -> String {
100
+ let df = DateFormatter()
101
+ df.timeZone = TimeZone.init(secondsFromGMT: 0)
102
+ df.dateFormat = "dd MMM yyyy"
103
+ let dateStr = df.string(from:date)
104
+ return dateStr
105
+ }
106
+ }
107
+
108
+ #if DEBUG
109
+ struct MRZEntryView_Previews : PreviewProvider {
110
+
111
+ static var previews: some View {
112
+ let settings = SettingsStore()
113
+
114
+ return
115
+ Group {
116
+ NavigationView {
117
+ MRZEntryView()
118
+ }
119
+ .environmentObject(settings)
120
+ .environment( \.colorScheme, .light)
121
+ }
122
+ }
123
+ }
124
+ #endif
125
+
@@ -0,0 +1,90 @@
1
+ //
2
+ // MRZScannerViewController.swift
3
+ // NFCPassportReaderApp
4
+ //
5
+ // Created by Andy Qua on 17/02/2021.
6
+ // Copyright © 2021 Andy Qua. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+ import SwiftUI
11
+ import QKMRZScanner
12
+
13
+ // Wraps the QKMRZScanner component in a simple UIView that allows a scan of the MRZ area from a Passport/ID Card
14
+ struct MRZScanner: UIViewControllerRepresentable {
15
+ let completionHandler: (String,Date,Date) -> Void
16
+
17
+ func makeUIViewController(context: Context) -> MRZScannerViewController {
18
+ let vc = MRZScannerViewController()
19
+ vc.mrzScannerView.delegate = context.coordinator
20
+ return vc
21
+ }
22
+
23
+ func updateUIViewController(_ uiViewController: MRZScannerViewController, context: Context) {
24
+
25
+ }
26
+
27
+ func makeCoordinator() -> Coordinator {
28
+ return Coordinator(completionHandler: completionHandler)
29
+ }
30
+
31
+ final class Coordinator: NSObject, QKMRZScannerViewDelegate {
32
+ let completionHandler: (String,Date,Date) -> Void
33
+
34
+ init(completionHandler: @escaping (String,Date,Date) -> Void) {
35
+ self.completionHandler = completionHandler
36
+ }
37
+
38
+ func mrzScannerView(_ mrzScannerView: QKMRZScannerView, didFind scanResult: QKMRZScanResult) {
39
+ print(scanResult)
40
+ if let dob = scanResult.birthdate, let doe = scanResult.expiryDate {
41
+ completionHandler(scanResult.documentNumber, dob, doe)
42
+ }
43
+ }
44
+ }
45
+ }
46
+
47
+ // MARK: UIViewController implementation
48
+ class MRZScannerViewController: UIViewController {
49
+ let mrzScannerView = QKMRZScannerView()
50
+
51
+ override func viewDidLoad() {
52
+ super.viewDidLoad()
53
+ self.title = "Scan Passport"
54
+ self.navigationController?.title = "Scan passport"
55
+
56
+
57
+ let lbl = UILabel()
58
+ lbl.text = "Please scan the Machine Readable Zone."
59
+ lbl.numberOfLines = 0
60
+ self.view.addSubview(mrzScannerView)
61
+ self.view.addSubview(lbl)
62
+
63
+ mrzScannerView.translatesAutoresizingMaskIntoConstraints = false
64
+ mrzScannerView.topAnchor.constraint(equalTo: view.topAnchor, constant:50).isActive = true
65
+ mrzScannerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
66
+ mrzScannerView.widthAnchor.constraint(equalToConstant: view.bounds.width).isActive = true
67
+ mrzScannerView.heightAnchor.constraint(equalToConstant: view.bounds.width).isActive = true
68
+
69
+ lbl.translatesAutoresizingMaskIntoConstraints = false
70
+ lbl.leadingAnchor.constraint(equalTo: mrzScannerView.leadingAnchor, constant: 10).isActive = true
71
+ lbl.topAnchor.constraint(equalTo: mrzScannerView.bottomAnchor, constant: 10).isActive = true
72
+ lbl.trailingAnchor.constraint(equalTo: mrzScannerView.trailingAnchor, constant: 10).isActive = true
73
+ }
74
+ override func viewWillAppear(_ animated: Bool) {
75
+ super.viewWillAppear(animated)
76
+ mrzScannerView.startScanning()
77
+ }
78
+
79
+ override func viewWillDisappear(_ animated: Bool) {
80
+ super.viewWillDisappear(animated)
81
+ mrzScannerView.stopScanning()
82
+ }
83
+ }
84
+
85
+ extension MRZScannerViewController : QKMRZScannerViewDelegate {
86
+ func mrzScannerView(_ mrzScannerView: QKMRZScannerView, didFind scanResult: QKMRZScanResult) {
87
+ print(scanResult)
88
+ }
89
+ }
90
+