├── .gitignore ├── .travis.yml ├── Example ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── QRCodeScan.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── Pods-QRCodeScan_Example │ │ ├── Pods-QRCodeScan_Example-Info.plist │ │ ├── Pods-QRCodeScan_Example-acknowledgements.markdown │ │ ├── Pods-QRCodeScan_Example-acknowledgements.plist │ │ ├── Pods-QRCodeScan_Example-dummy.m │ │ ├── Pods-QRCodeScan_Example-frameworks.sh │ │ ├── Pods-QRCodeScan_Example-umbrella.h │ │ ├── Pods-QRCodeScan_Example.debug.xcconfig │ │ ├── Pods-QRCodeScan_Example.modulemap │ │ └── Pods-QRCodeScan_Example.release.xcconfig │ │ ├── Pods-QRCodeScan_Tests │ │ ├── Pods-QRCodeScan_Tests-Info.plist │ │ ├── Pods-QRCodeScan_Tests-acknowledgements.markdown │ │ ├── Pods-QRCodeScan_Tests-acknowledgements.plist │ │ ├── Pods-QRCodeScan_Tests-dummy.m │ │ ├── Pods-QRCodeScan_Tests-frameworks.sh │ │ ├── Pods-QRCodeScan_Tests-umbrella.h │ │ ├── Pods-QRCodeScan_Tests.debug.xcconfig │ │ ├── Pods-QRCodeScan_Tests.modulemap │ │ └── Pods-QRCodeScan_Tests.release.xcconfig │ │ └── QRCodeScan │ │ ├── QRCodeScan-Info.plist │ │ ├── QRCodeScan-dummy.m │ │ ├── QRCodeScan-prefix.pch │ │ ├── QRCodeScan-umbrella.h │ │ ├── QRCodeScan.debug.xcconfig │ │ ├── QRCodeScan.modulemap │ │ ├── QRCodeScan.release.xcconfig │ │ └── ResourceBundle-QRCodeScan-QRCodeScan-Info.plist ├── QRCodeScan.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── QRCodeScan-Example.xcscheme ├── QRCodeScan.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── QRCodeScan │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── CodeGenerateViewController.h │ ├── CodeGenerateViewController.m │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── QRCodeScan-Info.plist │ ├── QRCodeScan-Prefix.pch │ ├── QRCodeScanViewController.h │ ├── QRCodeScanViewController.m │ ├── XYAppDelegate.h │ ├── XYAppDelegate.m │ ├── XYViewController.h │ ├── XYViewController.m │ ├── en.lproj │ │ └── InfoPlist.strings │ └── main.m └── Tests │ ├── Tests-Info.plist │ ├── Tests-Prefix.pch │ ├── Tests.m │ └── en.lproj │ └── InfoPlist.strings ├── LICENSE ├── QRCodeScan.podspec ├── QRCodeScan ├── Assets │ ├── .gitkeep │ └── QRCodeScan.bundle │ │ ├── scan_exchange@2x.png │ │ ├── scan_exchange@3x.png │ │ ├── scan_flash@2x.png │ │ ├── scan_flash@3x.png │ │ ├── scan_photo@2x.png │ │ ├── scan_photo@3x.png │ │ ├── scan_ring.wav │ │ ├── scan_scanFrame@2x.png │ │ ├── scan_scanFrame@3x.png │ │ ├── scan_scanLine@2x.png │ │ └── scan_scanLine@3x.png └── Classes │ ├── .gitkeep │ ├── QRCodeBundle.h │ ├── QRCodeBundle.m │ ├── QRCodeGenerateTools.h │ ├── QRCodeGenerateTools.m │ ├── QRCodeScan.h │ ├── QRCodeScanHeader.h │ ├── QRCodeScanManager.h │ ├── QRCodeScanManager.m │ ├── QRCodeScanTools.h │ ├── QRCodeScanTools.m │ ├── QRCodeScanView.h │ ├── QRCodeScanView.m │ ├── UIImage+QRCodeExt.h │ ├── UIImage+QRCodeExt.m │ ├── UIView+QRCodeExt.h │ └── UIView+QRCodeExt.m ├── README.md ├── _Pods.xcodeproj └── screen.GIF /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | # Pods/ 38 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/QRCodeScan.xcworkspace -scheme QRCodeScan-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | platform :ios, '9.0' 4 | 5 | target 'QRCodeScan_Example' do 6 | pod 'QRCodeScan', :path => '../' 7 | 8 | target 'QRCodeScan_Tests' do 9 | inherit! :search_paths 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - QRCodeScan (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - QRCodeScan (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | QRCodeScan: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | QRCodeScan: 52467a0cdd2570564d168579c3f0f949871d3dd1 13 | 14 | PODFILE CHECKSUM: 62c1676b017f17b61f36082da093f46b5a7cb773 15 | 16 | COCOAPODS: 1.10.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/QRCodeScan.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "QRCodeScan", 3 | "version": "0.1.0", 4 | "summary": "扫描组件", 5 | "description": "扫描组件", 6 | "homepage": "https://github.com/XueYangLee/QRCodeScan", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Singularity_Lee": "496736912@qq.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/XueYangLee/QRCodeScan.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "9.0" 20 | }, 21 | "source_files": "QRCodeScan/Classes/*.{h,m}", 22 | "resource_bundles": { 23 | "QRCodeScan": [ 24 | "QRCodeScan/Assets/**/*.*" 25 | ] 26 | }, 27 | "public_header_files": "QRCodeScan/Classes/**/*.h" 28 | } 29 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - QRCodeScan (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - QRCodeScan (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | QRCodeScan: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | QRCodeScan: 52467a0cdd2570564d168579c3f0f949871d3dd1 13 | 14 | PODFILE CHECKSUM: 62c1676b017f17b61f36082da093f46b5a7cb773 15 | 16 | COCOAPODS: 1.10.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 023E0986A2BF8A5D81DFB9D392D15E8A /* scan_scanLine@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 588CE11F30E362396B215594C7BD0EF4 /* scan_scanLine@3x.png */; }; 11 | 0C2E1763AA5B6E70577D3EBC91CD2BEE /* QRCodeScan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B1302EF6F1CFAE01804FFA2DF3C50288 /* QRCodeScan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 15B79C2DC023F05C39D26A88711E4278 /* scan_exchange@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4B1653E52C55476057650B9EB16BFE92 /* scan_exchange@2x.png */; }; 13 | 1F719264F38680B7E355AA7F600E1463 /* scan_ring.wav in Resources */ = {isa = PBXBuildFile; fileRef = 5A3331626963277E35E26F345E307E17 /* scan_ring.wav */; }; 14 | 2092ED7EE5016949E4A2259AE6BD28E2 /* QRCodeScanTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AB034FF70511658846ED1721D6CB064 /* QRCodeScanTools.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | 26A0D4969C6E1B8EE64BC449DCD28FC4 /* UIImage+QRCodeExt.h in Headers */ = {isa = PBXBuildFile; fileRef = 16AD3C713907FFACE0590E83930A9B0C /* UIImage+QRCodeExt.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | 45B714C822EFCA275E315BFDF71BBCCF /* QRCodeScan.h in Headers */ = {isa = PBXBuildFile; fileRef = 4998A21514AB64C112BAA95112FAF5C2 /* QRCodeScan.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | 52D79E43EA65FA09074D44491A60A154 /* QRCodeScanView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2724C6447208F79847F82D24CE9737D0 /* QRCodeScanView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | 5C083E2C2103DEE3880A63E40E866B33 /* QRCodeScanView.m in Sources */ = {isa = PBXBuildFile; fileRef = B259C986D1B4B6DBF1FB1A33F566CDA9 /* QRCodeScanView.m */; }; 19 | 6814B202C5E75F4B9F494F9E945448FC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 20 | 6B7517582D8F3C74DDC2D7BC73073FE9 /* QRCodeScanHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AA6DAB39566A30596E2E307B4EA086F /* QRCodeScanHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | 75E8D3C1CD1D208D32B2718CFA066C37 /* QRCodeGenerateTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 84E485E9773C1AAE26EF33A62A426F93 /* QRCodeGenerateTools.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22 | 7B51827808D38E4264AB9E6D41522D0D /* UIImage+QRCodeExt.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9BA03D283C74BF8309FB1C7B190B63 /* UIImage+QRCodeExt.m */; }; 23 | 7D4896BC8FBC94F089A5BDDDE982F1B5 /* Pods-QRCodeScan_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CE575A6C9804F867CC42DD9E0FED385 /* Pods-QRCodeScan_Example-dummy.m */; }; 24 | 8D0D97D1280F4B2F5829215242A2CE6C /* QRCodeScanManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FC6BBBF543F5B739BB3895208FC16CCB /* QRCodeScanManager.m */; }; 25 | 93BB107B82BE18874B2BD6D20C375FD0 /* scan_photo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5637F52961E68B66FD1FAAD082F1314A /* scan_photo@2x.png */; }; 26 | 980C988BD77EEADC825EB6F08A3ABA9F /* QRCodeScanManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ACBD1E0258ED5EA4512C4E4D3F326A9 /* QRCodeScanManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27 | 99691638E65B8D27E5B34B5DC90D88A0 /* UIView+QRCodeExt.m in Sources */ = {isa = PBXBuildFile; fileRef = AA52B6270DB2F610F1AF06A79331A743 /* UIView+QRCodeExt.m */; }; 28 | 9DC30F7BA37DE9222BF4F4F502B68B9D /* scan_photo@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = E8E791A7B08E15BA9A8A752448AFE2DA /* scan_photo@3x.png */; }; 29 | A2BFD42CF09F9D353F42A94BC7B47614 /* QRCodeBundle.m in Sources */ = {isa = PBXBuildFile; fileRef = AC1DF0E78CB27024A494344AC5788BB2 /* QRCodeBundle.m */; }; 30 | AB2DA563A72B9BE595A59920BC218C5A /* QRCodeScan.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CB306FE55ECA7A0C76A20D928E074C35 /* QRCodeScan.bundle */; }; 31 | AE2ECC1BC22F452580D2BE42C0DD25D9 /* UIView+QRCodeExt.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B6CA1D0B4C08DE52F4DDDAC5662F74 /* UIView+QRCodeExt.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32 | B32DC822D8B0D274557BF313388635E5 /* scan_scanFrame@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9A808B2E65CEFBFFE956C83F83B557C2 /* scan_scanFrame@3x.png */; }; 33 | B44C2594D40592DF910D6F34715FD345 /* scan_scanFrame@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DB8C4A37A41F27E7D453D5E0B16A2A68 /* scan_scanFrame@2x.png */; }; 34 | B4D867B3B4D7A0984EFB8CC7E13799B3 /* QRCodeScan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 143E3D9F66E94B632D72E86943191A92 /* QRCodeScan-dummy.m */; }; 35 | BDF6A2CB1EA7561AB04D846932139996 /* scan_flash@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9A5E93E85B6E74977A105A7C39DBB475 /* scan_flash@2x.png */; }; 36 | C07D55047CFDC12B736247FDB56F2684 /* QRCodeBundle.h in Headers */ = {isa = PBXBuildFile; fileRef = F8E0BCD5B6C0F1C302A646A30C7B66ED /* QRCodeBundle.h */; settings = {ATTRIBUTES = (Public, ); }; }; 37 | C0A989A629022AA8DDBE3AA59C860B09 /* scan_exchange@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = FD0EE67911C84EE4D0AB7195D0942070 /* scan_exchange@3x.png */; }; 38 | C1CBBCA994EAD95CB55A1250D172E37D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 39 | C6DF8396E866E77717EF09AC3D5444EF /* QRCodeGenerateTools.m in Sources */ = {isa = PBXBuildFile; fileRef = E4D010E7D0EFC0A91B56A0A7AAA1BA49 /* QRCodeGenerateTools.m */; }; 40 | C71A6E37F3417E7F21AF4D1DDCAD86C6 /* Pods-QRCodeScan_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CDC15A2069C992186EBC4DBA835D4BB /* Pods-QRCodeScan_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 41 | C7F6F127513F5237CA9A2E2115FA263A /* Pods-QRCodeScan_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EA33859896F89DC8A744AFC2F4BA5EF3 /* Pods-QRCodeScan_Tests-dummy.m */; }; 42 | CA8B23ED19839F07D209958C92377C0A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 43 | CF2FA565E4B732A6DA70C55F87757F93 /* scan_scanLine@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A55FC04169A0CAC0940AE4DB5329DCF9 /* scan_scanLine@2x.png */; }; 44 | D8F30AC3408D8EE876355D6ADAD7D279 /* Pods-QRCodeScan_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A0702589712F6414CD6F05152979AD /* Pods-QRCodeScan_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 45 | DDD5B8BC6AD4560A92A4C4185FF4996A /* scan_flash@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 964F620135BEB2847A5EAA93E6BD3F0E /* scan_flash@3x.png */; }; 46 | DF416DFE89EC841A2C25A28F495DDF90 /* QRCodeScan.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 606F3E020E941926F187374F11163F5A /* QRCodeScan.bundle */; }; 47 | F118073325EB0C31B8A19CD8CB40CB58 /* QRCodeScanTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 9500125943972F99044791A8F0DD890E /* QRCodeScanTools.m */; }; 48 | /* End PBXBuildFile section */ 49 | 50 | /* Begin PBXContainerItemProxy section */ 51 | 7536B4A549488705A7592AA894423F38 /* PBXContainerItemProxy */ = { 52 | isa = PBXContainerItemProxy; 53 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 54 | proxyType = 1; 55 | remoteGlobalIDString = 7F3ABC2E0B1646A5338F826B02850472; 56 | remoteInfo = "QRCodeScan-QRCodeScan"; 57 | }; 58 | 98B713EABD294C66DB818BD1DA7B56C8 /* PBXContainerItemProxy */ = { 59 | isa = PBXContainerItemProxy; 60 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 61 | proxyType = 1; 62 | remoteGlobalIDString = AF6FE19C5A46D91F05C3216AE5681543; 63 | remoteInfo = "Pods-QRCodeScan_Example"; 64 | }; 65 | A42F59443EDB8A21763E5CB0023E3985 /* PBXContainerItemProxy */ = { 66 | isa = PBXContainerItemProxy; 67 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 68 | proxyType = 1; 69 | remoteGlobalIDString = C10E261C3C0FCE7E1581C15146AAEA10; 70 | remoteInfo = QRCodeScan; 71 | }; 72 | /* End PBXContainerItemProxy section */ 73 | 74 | /* Begin PBXFileReference section */ 75 | 11E1291DEFF2F5E3387FFEE4789B5A9C /* QRCodeScan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = QRCodeScan.release.xcconfig; sourceTree = ""; }; 76 | 12FDED58EFD887CB9B77D3299B0DB21F /* Pods-QRCodeScan_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-QRCodeScan_Example-acknowledgements.markdown"; sourceTree = ""; }; 77 | 143E3D9F66E94B632D72E86943191A92 /* QRCodeScan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "QRCodeScan-dummy.m"; sourceTree = ""; }; 78 | 16AD3C713907FFACE0590E83930A9B0C /* UIImage+QRCodeExt.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+QRCodeExt.h"; path = "QRCodeScan/Classes/UIImage+QRCodeExt.h"; sourceTree = ""; }; 79 | 2724C6447208F79847F82D24CE9737D0 /* QRCodeScanView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QRCodeScanView.h; path = QRCodeScan/Classes/QRCodeScanView.h; sourceTree = ""; }; 80 | 2AA6DAB39566A30596E2E307B4EA086F /* QRCodeScanHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QRCodeScanHeader.h; path = QRCodeScan/Classes/QRCodeScanHeader.h; sourceTree = ""; }; 81 | 45A2A03989E56C628E956DA95E05DB72 /* ResourceBundle-QRCodeScan-QRCodeScan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-QRCodeScan-QRCodeScan-Info.plist"; sourceTree = ""; }; 82 | 46B6CA1D0B4C08DE52F4DDDAC5662F74 /* UIView+QRCodeExt.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+QRCodeExt.h"; path = "QRCodeScan/Classes/UIView+QRCodeExt.h"; sourceTree = ""; }; 83 | 4998A21514AB64C112BAA95112FAF5C2 /* QRCodeScan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QRCodeScan.h; path = QRCodeScan/Classes/QRCodeScan.h; sourceTree = ""; }; 84 | 4ADD32D02ECADE59B9C07ECC6EE3040E /* Pods-QRCodeScan_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-QRCodeScan_Tests-acknowledgements.markdown"; sourceTree = ""; }; 85 | 4B1653E52C55476057650B9EB16BFE92 /* scan_exchange@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_exchange@2x.png"; sourceTree = ""; }; 86 | 4D23A2D741093292EB6F0759CEB7BD40 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 87 | 5637F52961E68B66FD1FAAD082F1314A /* scan_photo@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_photo@2x.png"; sourceTree = ""; }; 88 | 566375CBFC400344A92DC8A9810867C4 /* Pods-QRCodeScan_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QRCodeScan_Tests.debug.xcconfig"; sourceTree = ""; }; 89 | 588CE11F30E362396B215594C7BD0EF4 /* scan_scanLine@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_scanLine@3x.png"; sourceTree = ""; }; 90 | 5A3331626963277E35E26F345E307E17 /* scan_ring.wav */ = {isa = PBXFileReference; includeInIndex = 1; path = scan_ring.wav; sourceTree = ""; }; 91 | 5B3FFF23AB3106E88BE4A55AE13F8DAF /* Pods_QRCodeScan_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_QRCodeScan_Tests.framework; path = "Pods-QRCodeScan_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 92 | 5CDC15A2069C992186EBC4DBA835D4BB /* Pods-QRCodeScan_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-QRCodeScan_Tests-umbrella.h"; sourceTree = ""; }; 93 | 606F3E020E941926F187374F11163F5A /* QRCodeScan.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = QRCodeScan.bundle; path = "QRCodeScan-QRCodeScan.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; 94 | 715BF9C0B4C1445C55250494B4B7E6F2 /* Pods-QRCodeScan_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QRCodeScan_Example.release.xcconfig"; sourceTree = ""; }; 95 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 96 | 7AB034FF70511658846ED1721D6CB064 /* QRCodeScanTools.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QRCodeScanTools.h; path = QRCodeScan/Classes/QRCodeScanTools.h; sourceTree = ""; }; 97 | 7B9BA03D283C74BF8309FB1C7B190B63 /* UIImage+QRCodeExt.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+QRCodeExt.m"; path = "QRCodeScan/Classes/UIImage+QRCodeExt.m"; sourceTree = ""; }; 98 | 7CE575A6C9804F867CC42DD9E0FED385 /* Pods-QRCodeScan_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-QRCodeScan_Example-dummy.m"; sourceTree = ""; }; 99 | 7DA89EDC1F0F749C45C6445CE7D49D5C /* Pods-QRCodeScan_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-QRCodeScan_Example-Info.plist"; sourceTree = ""; }; 100 | 7DF3516B4918F8C6CB1D801091CEB774 /* Pods-QRCodeScan_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-QRCodeScan_Example.modulemap"; sourceTree = ""; }; 101 | 7FF916825D14CEB5171B056EF0806F36 /* Pods-QRCodeScan_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QRCodeScan_Example.debug.xcconfig"; sourceTree = ""; }; 102 | 84E485E9773C1AAE26EF33A62A426F93 /* QRCodeGenerateTools.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QRCodeGenerateTools.h; path = QRCodeScan/Classes/QRCodeGenerateTools.h; sourceTree = ""; }; 103 | 88BFAB5A5276C1B78C89D9374A1308EE /* QRCodeScan.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = QRCodeScan.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 104 | 893685C1EFDB14FB6F952B20E148E748 /* QRCodeScan-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "QRCodeScan-prefix.pch"; sourceTree = ""; }; 105 | 8ACBD1E0258ED5EA4512C4E4D3F326A9 /* QRCodeScanManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QRCodeScanManager.h; path = QRCodeScan/Classes/QRCodeScanManager.h; sourceTree = ""; }; 106 | 8FAA7294F57D31B00133EB48C8B5150F /* Pods-QRCodeScan_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-QRCodeScan_Tests-Info.plist"; sourceTree = ""; }; 107 | 94935993DCCBC2A6BC809F62790CA086 /* Pods-QRCodeScan_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-QRCodeScan_Tests.modulemap"; sourceTree = ""; }; 108 | 9500125943972F99044791A8F0DD890E /* QRCodeScanTools.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QRCodeScanTools.m; path = QRCodeScan/Classes/QRCodeScanTools.m; sourceTree = ""; }; 109 | 964F620135BEB2847A5EAA93E6BD3F0E /* scan_flash@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_flash@3x.png"; sourceTree = ""; }; 110 | 9A5E93E85B6E74977A105A7C39DBB475 /* scan_flash@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_flash@2x.png"; sourceTree = ""; }; 111 | 9A808B2E65CEFBFFE956C83F83B557C2 /* scan_scanFrame@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_scanFrame@3x.png"; sourceTree = ""; }; 112 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 113 | A498C311004589B8A28AF5ECCB7707C7 /* Pods-QRCodeScan_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-QRCodeScan_Example-frameworks.sh"; sourceTree = ""; }; 114 | A54044E40C2119BB4D4F9D19B36B4B60 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 115 | A55FC04169A0CAC0940AE4DB5329DCF9 /* scan_scanLine@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_scanLine@2x.png"; sourceTree = ""; }; 116 | A7A0702589712F6414CD6F05152979AD /* Pods-QRCodeScan_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-QRCodeScan_Example-umbrella.h"; sourceTree = ""; }; 117 | AA52B6270DB2F610F1AF06A79331A743 /* UIView+QRCodeExt.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+QRCodeExt.m"; path = "QRCodeScan/Classes/UIView+QRCodeExt.m"; sourceTree = ""; }; 118 | AC1DF0E78CB27024A494344AC5788BB2 /* QRCodeBundle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QRCodeBundle.m; path = QRCodeScan/Classes/QRCodeBundle.m; sourceTree = ""; }; 119 | B1302EF6F1CFAE01804FFA2DF3C50288 /* QRCodeScan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "QRCodeScan-umbrella.h"; sourceTree = ""; }; 120 | B248C70D87EE32D9985810BE85EDD917 /* Pods_QRCodeScan_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_QRCodeScan_Example.framework; path = "Pods-QRCodeScan_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 121 | B259C986D1B4B6DBF1FB1A33F566CDA9 /* QRCodeScanView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QRCodeScanView.m; path = QRCodeScan/Classes/QRCodeScanView.m; sourceTree = ""; }; 122 | BEFAF3F1DC256A05D9978828395AFF8E /* QRCodeScan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "QRCodeScan-Info.plist"; sourceTree = ""; }; 123 | C12B718EDA7354AB02636AB471FC63B0 /* QRCodeScan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = QRCodeScan.debug.xcconfig; sourceTree = ""; }; 124 | C2E3F64583FAA4B16A533CADDA35D5C3 /* Pods-QRCodeScan_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-QRCodeScan_Tests.release.xcconfig"; sourceTree = ""; }; 125 | CB306FE55ECA7A0C76A20D928E074C35 /* QRCodeScan.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = QRCodeScan.bundle; path = QRCodeScan/Assets/QRCodeScan.bundle; sourceTree = ""; }; 126 | CBFA9C307E3FEBDEC3655AB6FEC8A3D3 /* Pods-QRCodeScan_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-QRCodeScan_Tests-acknowledgements.plist"; sourceTree = ""; }; 127 | CD109C0577197FB977976F7DD6CBBCB1 /* QRCodeScan.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = QRCodeScan.framework; path = QRCodeScan.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 128 | D860CE515DAA50347022F7CDB0117B15 /* QRCodeScan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = QRCodeScan.modulemap; sourceTree = ""; }; 129 | DB8C4A37A41F27E7D453D5E0B16A2A68 /* scan_scanFrame@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_scanFrame@2x.png"; sourceTree = ""; }; 130 | E4D010E7D0EFC0A91B56A0A7AAA1BA49 /* QRCodeGenerateTools.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QRCodeGenerateTools.m; path = QRCodeScan/Classes/QRCodeGenerateTools.m; sourceTree = ""; }; 131 | E8E791A7B08E15BA9A8A752448AFE2DA /* scan_photo@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_photo@3x.png"; sourceTree = ""; }; 132 | EA33859896F89DC8A744AFC2F4BA5EF3 /* Pods-QRCodeScan_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-QRCodeScan_Tests-dummy.m"; sourceTree = ""; }; 133 | F8E0BCD5B6C0F1C302A646A30C7B66ED /* QRCodeBundle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QRCodeBundle.h; path = QRCodeScan/Classes/QRCodeBundle.h; sourceTree = ""; }; 134 | FC6BBBF543F5B739BB3895208FC16CCB /* QRCodeScanManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QRCodeScanManager.m; path = QRCodeScan/Classes/QRCodeScanManager.m; sourceTree = ""; }; 135 | FD0EE67911C84EE4D0AB7195D0942070 /* scan_exchange@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "scan_exchange@3x.png"; sourceTree = ""; }; 136 | FEF48446B9230AC026FAD9E9CAD916D8 /* Pods-QRCodeScan_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-QRCodeScan_Example-acknowledgements.plist"; sourceTree = ""; }; 137 | /* End PBXFileReference section */ 138 | 139 | /* Begin PBXFrameworksBuildPhase section */ 140 | 063EC6D5358CEF89337513092011BDD3 /* Frameworks */ = { 141 | isa = PBXFrameworksBuildPhase; 142 | buildActionMask = 2147483647; 143 | files = ( 144 | C1CBBCA994EAD95CB55A1250D172E37D /* Foundation.framework in Frameworks */, 145 | ); 146 | runOnlyForDeploymentPostprocessing = 0; 147 | }; 148 | 70687F8DE3BA85A3AB427AC7B1E9F0E2 /* Frameworks */ = { 149 | isa = PBXFrameworksBuildPhase; 150 | buildActionMask = 2147483647; 151 | files = ( 152 | 6814B202C5E75F4B9F494F9E945448FC /* Foundation.framework in Frameworks */, 153 | ); 154 | runOnlyForDeploymentPostprocessing = 0; 155 | }; 156 | C156489173C139E71F9F8EC7CF8A6815 /* Frameworks */ = { 157 | isa = PBXFrameworksBuildPhase; 158 | buildActionMask = 2147483647; 159 | files = ( 160 | CA8B23ED19839F07D209958C92377C0A /* Foundation.framework in Frameworks */, 161 | ); 162 | runOnlyForDeploymentPostprocessing = 0; 163 | }; 164 | FC80533EF3183DA3F06327BD87E4CD54 /* Frameworks */ = { 165 | isa = PBXFrameworksBuildPhase; 166 | buildActionMask = 2147483647; 167 | files = ( 168 | ); 169 | runOnlyForDeploymentPostprocessing = 0; 170 | }; 171 | /* End PBXFrameworksBuildPhase section */ 172 | 173 | /* Begin PBXGroup section */ 174 | 1E41D2F31DE4AA0ED69853E28702B777 /* Targets Support Files */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | 71EB553441A91CA3A9A77A00A8B7D8E4 /* Pods-QRCodeScan_Example */, 178 | EBA8BF457BE9F22EDC2A31374F98FC4B /* Pods-QRCodeScan_Tests */, 179 | ); 180 | name = "Targets Support Files"; 181 | sourceTree = ""; 182 | }; 183 | 578452D2E740E91742655AC8F1636D1F /* iOS */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, 187 | ); 188 | name = iOS; 189 | sourceTree = ""; 190 | }; 191 | 68473E9E4164D01685D8F217C8D673F9 /* Pod */ = { 192 | isa = PBXGroup; 193 | children = ( 194 | A54044E40C2119BB4D4F9D19B36B4B60 /* LICENSE */, 195 | 88BFAB5A5276C1B78C89D9374A1308EE /* QRCodeScan.podspec */, 196 | 4D23A2D741093292EB6F0759CEB7BD40 /* README.md */, 197 | ); 198 | name = Pod; 199 | sourceTree = ""; 200 | }; 201 | 69FCE5FBEB1623ECD54B12BEC9A85525 /* QRCodeScan.bundle */ = { 202 | isa = PBXGroup; 203 | children = ( 204 | 4B1653E52C55476057650B9EB16BFE92 /* scan_exchange@2x.png */, 205 | FD0EE67911C84EE4D0AB7195D0942070 /* scan_exchange@3x.png */, 206 | 9A5E93E85B6E74977A105A7C39DBB475 /* scan_flash@2x.png */, 207 | 964F620135BEB2847A5EAA93E6BD3F0E /* scan_flash@3x.png */, 208 | 5637F52961E68B66FD1FAAD082F1314A /* scan_photo@2x.png */, 209 | E8E791A7B08E15BA9A8A752448AFE2DA /* scan_photo@3x.png */, 210 | 5A3331626963277E35E26F345E307E17 /* scan_ring.wav */, 211 | DB8C4A37A41F27E7D453D5E0B16A2A68 /* scan_scanFrame@2x.png */, 212 | 9A808B2E65CEFBFFE956C83F83B557C2 /* scan_scanFrame@3x.png */, 213 | A55FC04169A0CAC0940AE4DB5329DCF9 /* scan_scanLine@2x.png */, 214 | 588CE11F30E362396B215594C7BD0EF4 /* scan_scanLine@3x.png */, 215 | ); 216 | name = QRCodeScan.bundle; 217 | path = QRCodeScan/Assets/QRCodeScan.bundle; 218 | sourceTree = ""; 219 | }; 220 | 71EB553441A91CA3A9A77A00A8B7D8E4 /* Pods-QRCodeScan_Example */ = { 221 | isa = PBXGroup; 222 | children = ( 223 | 7DF3516B4918F8C6CB1D801091CEB774 /* Pods-QRCodeScan_Example.modulemap */, 224 | 12FDED58EFD887CB9B77D3299B0DB21F /* Pods-QRCodeScan_Example-acknowledgements.markdown */, 225 | FEF48446B9230AC026FAD9E9CAD916D8 /* Pods-QRCodeScan_Example-acknowledgements.plist */, 226 | 7CE575A6C9804F867CC42DD9E0FED385 /* Pods-QRCodeScan_Example-dummy.m */, 227 | A498C311004589B8A28AF5ECCB7707C7 /* Pods-QRCodeScan_Example-frameworks.sh */, 228 | 7DA89EDC1F0F749C45C6445CE7D49D5C /* Pods-QRCodeScan_Example-Info.plist */, 229 | A7A0702589712F6414CD6F05152979AD /* Pods-QRCodeScan_Example-umbrella.h */, 230 | 7FF916825D14CEB5171B056EF0806F36 /* Pods-QRCodeScan_Example.debug.xcconfig */, 231 | 715BF9C0B4C1445C55250494B4B7E6F2 /* Pods-QRCodeScan_Example.release.xcconfig */, 232 | ); 233 | name = "Pods-QRCodeScan_Example"; 234 | path = "Target Support Files/Pods-QRCodeScan_Example"; 235 | sourceTree = ""; 236 | }; 237 | B012F5047AF99D72E80D1D48DA59CF21 /* Development Pods */ = { 238 | isa = PBXGroup; 239 | children = ( 240 | D96624982FFD9781240ABA4D3C5707D0 /* QRCodeScan */, 241 | ); 242 | name = "Development Pods"; 243 | sourceTree = ""; 244 | }; 245 | CEA46D2FA8AD5D68B3BDF36D5F2423F1 /* Support Files */ = { 246 | isa = PBXGroup; 247 | children = ( 248 | D860CE515DAA50347022F7CDB0117B15 /* QRCodeScan.modulemap */, 249 | 143E3D9F66E94B632D72E86943191A92 /* QRCodeScan-dummy.m */, 250 | BEFAF3F1DC256A05D9978828395AFF8E /* QRCodeScan-Info.plist */, 251 | 893685C1EFDB14FB6F952B20E148E748 /* QRCodeScan-prefix.pch */, 252 | B1302EF6F1CFAE01804FFA2DF3C50288 /* QRCodeScan-umbrella.h */, 253 | C12B718EDA7354AB02636AB471FC63B0 /* QRCodeScan.debug.xcconfig */, 254 | 11E1291DEFF2F5E3387FFEE4789B5A9C /* QRCodeScan.release.xcconfig */, 255 | 45A2A03989E56C628E956DA95E05DB72 /* ResourceBundle-QRCodeScan-QRCodeScan-Info.plist */, 256 | ); 257 | name = "Support Files"; 258 | path = "Example/Pods/Target Support Files/QRCodeScan"; 259 | sourceTree = ""; 260 | }; 261 | CF1408CF629C7361332E53B88F7BD30C = { 262 | isa = PBXGroup; 263 | children = ( 264 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 265 | B012F5047AF99D72E80D1D48DA59CF21 /* Development Pods */, 266 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 267 | D9F3EAD09BA598E9D83BCBDB0AABCC7E /* Products */, 268 | 1E41D2F31DE4AA0ED69853E28702B777 /* Targets Support Files */, 269 | ); 270 | sourceTree = ""; 271 | }; 272 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 273 | isa = PBXGroup; 274 | children = ( 275 | 578452D2E740E91742655AC8F1636D1F /* iOS */, 276 | ); 277 | name = Frameworks; 278 | sourceTree = ""; 279 | }; 280 | D96624982FFD9781240ABA4D3C5707D0 /* QRCodeScan */ = { 281 | isa = PBXGroup; 282 | children = ( 283 | F8E0BCD5B6C0F1C302A646A30C7B66ED /* QRCodeBundle.h */, 284 | AC1DF0E78CB27024A494344AC5788BB2 /* QRCodeBundle.m */, 285 | 84E485E9773C1AAE26EF33A62A426F93 /* QRCodeGenerateTools.h */, 286 | E4D010E7D0EFC0A91B56A0A7AAA1BA49 /* QRCodeGenerateTools.m */, 287 | CB306FE55ECA7A0C76A20D928E074C35 /* QRCodeScan.bundle */, 288 | 4998A21514AB64C112BAA95112FAF5C2 /* QRCodeScan.h */, 289 | 2AA6DAB39566A30596E2E307B4EA086F /* QRCodeScanHeader.h */, 290 | 8ACBD1E0258ED5EA4512C4E4D3F326A9 /* QRCodeScanManager.h */, 291 | FC6BBBF543F5B739BB3895208FC16CCB /* QRCodeScanManager.m */, 292 | 7AB034FF70511658846ED1721D6CB064 /* QRCodeScanTools.h */, 293 | 9500125943972F99044791A8F0DD890E /* QRCodeScanTools.m */, 294 | 2724C6447208F79847F82D24CE9737D0 /* QRCodeScanView.h */, 295 | B259C986D1B4B6DBF1FB1A33F566CDA9 /* QRCodeScanView.m */, 296 | 16AD3C713907FFACE0590E83930A9B0C /* UIImage+QRCodeExt.h */, 297 | 7B9BA03D283C74BF8309FB1C7B190B63 /* UIImage+QRCodeExt.m */, 298 | 46B6CA1D0B4C08DE52F4DDDAC5662F74 /* UIView+QRCodeExt.h */, 299 | AA52B6270DB2F610F1AF06A79331A743 /* UIView+QRCodeExt.m */, 300 | 68473E9E4164D01685D8F217C8D673F9 /* Pod */, 301 | 69FCE5FBEB1623ECD54B12BEC9A85525 /* QRCodeScan.bundle */, 302 | CEA46D2FA8AD5D68B3BDF36D5F2423F1 /* Support Files */, 303 | ); 304 | name = QRCodeScan; 305 | path = ../..; 306 | sourceTree = ""; 307 | }; 308 | D9F3EAD09BA598E9D83BCBDB0AABCC7E /* Products */ = { 309 | isa = PBXGroup; 310 | children = ( 311 | B248C70D87EE32D9985810BE85EDD917 /* Pods_QRCodeScan_Example.framework */, 312 | 5B3FFF23AB3106E88BE4A55AE13F8DAF /* Pods_QRCodeScan_Tests.framework */, 313 | 606F3E020E941926F187374F11163F5A /* QRCodeScan.bundle */, 314 | CD109C0577197FB977976F7DD6CBBCB1 /* QRCodeScan.framework */, 315 | ); 316 | name = Products; 317 | sourceTree = ""; 318 | }; 319 | EBA8BF457BE9F22EDC2A31374F98FC4B /* Pods-QRCodeScan_Tests */ = { 320 | isa = PBXGroup; 321 | children = ( 322 | 94935993DCCBC2A6BC809F62790CA086 /* Pods-QRCodeScan_Tests.modulemap */, 323 | 4ADD32D02ECADE59B9C07ECC6EE3040E /* Pods-QRCodeScan_Tests-acknowledgements.markdown */, 324 | CBFA9C307E3FEBDEC3655AB6FEC8A3D3 /* Pods-QRCodeScan_Tests-acknowledgements.plist */, 325 | EA33859896F89DC8A744AFC2F4BA5EF3 /* Pods-QRCodeScan_Tests-dummy.m */, 326 | 8FAA7294F57D31B00133EB48C8B5150F /* Pods-QRCodeScan_Tests-Info.plist */, 327 | 5CDC15A2069C992186EBC4DBA835D4BB /* Pods-QRCodeScan_Tests-umbrella.h */, 328 | 566375CBFC400344A92DC8A9810867C4 /* Pods-QRCodeScan_Tests.debug.xcconfig */, 329 | C2E3F64583FAA4B16A533CADDA35D5C3 /* Pods-QRCodeScan_Tests.release.xcconfig */, 330 | ); 331 | name = "Pods-QRCodeScan_Tests"; 332 | path = "Target Support Files/Pods-QRCodeScan_Tests"; 333 | sourceTree = ""; 334 | }; 335 | /* End PBXGroup section */ 336 | 337 | /* Begin PBXHeadersBuildPhase section */ 338 | 82C0458319DC6508C90A9CDFD29CE759 /* Headers */ = { 339 | isa = PBXHeadersBuildPhase; 340 | buildActionMask = 2147483647; 341 | files = ( 342 | D8F30AC3408D8EE876355D6ADAD7D279 /* Pods-QRCodeScan_Example-umbrella.h in Headers */, 343 | ); 344 | runOnlyForDeploymentPostprocessing = 0; 345 | }; 346 | 8304C942302F8A03BF2F2C62F2076BA3 /* Headers */ = { 347 | isa = PBXHeadersBuildPhase; 348 | buildActionMask = 2147483647; 349 | files = ( 350 | C71A6E37F3417E7F21AF4D1DDCAD86C6 /* Pods-QRCodeScan_Tests-umbrella.h in Headers */, 351 | ); 352 | runOnlyForDeploymentPostprocessing = 0; 353 | }; 354 | B830C09A29D26D1486F344AF7A62ED97 /* Headers */ = { 355 | isa = PBXHeadersBuildPhase; 356 | buildActionMask = 2147483647; 357 | files = ( 358 | C07D55047CFDC12B736247FDB56F2684 /* QRCodeBundle.h in Headers */, 359 | 75E8D3C1CD1D208D32B2718CFA066C37 /* QRCodeGenerateTools.h in Headers */, 360 | 0C2E1763AA5B6E70577D3EBC91CD2BEE /* QRCodeScan-umbrella.h in Headers */, 361 | 45B714C822EFCA275E315BFDF71BBCCF /* QRCodeScan.h in Headers */, 362 | 6B7517582D8F3C74DDC2D7BC73073FE9 /* QRCodeScanHeader.h in Headers */, 363 | 980C988BD77EEADC825EB6F08A3ABA9F /* QRCodeScanManager.h in Headers */, 364 | 2092ED7EE5016949E4A2259AE6BD28E2 /* QRCodeScanTools.h in Headers */, 365 | 52D79E43EA65FA09074D44491A60A154 /* QRCodeScanView.h in Headers */, 366 | 26A0D4969C6E1B8EE64BC449DCD28FC4 /* UIImage+QRCodeExt.h in Headers */, 367 | AE2ECC1BC22F452580D2BE42C0DD25D9 /* UIView+QRCodeExt.h in Headers */, 368 | ); 369 | runOnlyForDeploymentPostprocessing = 0; 370 | }; 371 | /* End PBXHeadersBuildPhase section */ 372 | 373 | /* Begin PBXNativeTarget section */ 374 | 0C7B1C9BBA4A0E0B9D8C26B74BF3F255 /* Pods-QRCodeScan_Tests */ = { 375 | isa = PBXNativeTarget; 376 | buildConfigurationList = 2A2D931D358427E7FA1B599C53473D1C /* Build configuration list for PBXNativeTarget "Pods-QRCodeScan_Tests" */; 377 | buildPhases = ( 378 | 8304C942302F8A03BF2F2C62F2076BA3 /* Headers */, 379 | 7012B93CA97D8F92542F49E2436B4FF4 /* Sources */, 380 | C156489173C139E71F9F8EC7CF8A6815 /* Frameworks */, 381 | 9B0181EBF136209AA6B4423041A1EB48 /* Resources */, 382 | ); 383 | buildRules = ( 384 | ); 385 | dependencies = ( 386 | 6D4E0323CF8D0EDAC8D16C7872CCD360 /* PBXTargetDependency */, 387 | ); 388 | name = "Pods-QRCodeScan_Tests"; 389 | productName = "Pods-QRCodeScan_Tests"; 390 | productReference = 5B3FFF23AB3106E88BE4A55AE13F8DAF /* Pods_QRCodeScan_Tests.framework */; 391 | productType = "com.apple.product-type.framework"; 392 | }; 393 | 7F3ABC2E0B1646A5338F826B02850472 /* QRCodeScan-QRCodeScan */ = { 394 | isa = PBXNativeTarget; 395 | buildConfigurationList = B2275EEC1041D36A35A30EAC3763249D /* Build configuration list for PBXNativeTarget "QRCodeScan-QRCodeScan" */; 396 | buildPhases = ( 397 | B9E913988F3094D575387A8249AE0993 /* Sources */, 398 | FC80533EF3183DA3F06327BD87E4CD54 /* Frameworks */, 399 | 6ACB85F22F4092E65534581FA208934C /* Resources */, 400 | ); 401 | buildRules = ( 402 | ); 403 | dependencies = ( 404 | ); 405 | name = "QRCodeScan-QRCodeScan"; 406 | productName = "QRCodeScan-QRCodeScan"; 407 | productReference = 606F3E020E941926F187374F11163F5A /* QRCodeScan.bundle */; 408 | productType = "com.apple.product-type.bundle"; 409 | }; 410 | AF6FE19C5A46D91F05C3216AE5681543 /* Pods-QRCodeScan_Example */ = { 411 | isa = PBXNativeTarget; 412 | buildConfigurationList = 26BD1FE1DCEA4584E0D7176C45C1A9E9 /* Build configuration list for PBXNativeTarget "Pods-QRCodeScan_Example" */; 413 | buildPhases = ( 414 | 82C0458319DC6508C90A9CDFD29CE759 /* Headers */, 415 | C8E39C3A6158574181E51CC439875565 /* Sources */, 416 | 063EC6D5358CEF89337513092011BDD3 /* Frameworks */, 417 | 31F532658EE48A9CBB5E2481753CE4CC /* Resources */, 418 | ); 419 | buildRules = ( 420 | ); 421 | dependencies = ( 422 | 4F51D444B3CB0AD729E4BA779BA21993 /* PBXTargetDependency */, 423 | ); 424 | name = "Pods-QRCodeScan_Example"; 425 | productName = "Pods-QRCodeScan_Example"; 426 | productReference = B248C70D87EE32D9985810BE85EDD917 /* Pods_QRCodeScan_Example.framework */; 427 | productType = "com.apple.product-type.framework"; 428 | }; 429 | C10E261C3C0FCE7E1581C15146AAEA10 /* QRCodeScan */ = { 430 | isa = PBXNativeTarget; 431 | buildConfigurationList = 2F4E1C6EC3F321F8392213368F58F309 /* Build configuration list for PBXNativeTarget "QRCodeScan" */; 432 | buildPhases = ( 433 | B830C09A29D26D1486F344AF7A62ED97 /* Headers */, 434 | 677FCD21CFDAA07FCED75AC4DAA95DB9 /* Sources */, 435 | 70687F8DE3BA85A3AB427AC7B1E9F0E2 /* Frameworks */, 436 | 575BA79398FD5CC8AB807023EEBA87BB /* Resources */, 437 | ); 438 | buildRules = ( 439 | ); 440 | dependencies = ( 441 | 646AC78296D5CF9068E0989B168B0878 /* PBXTargetDependency */, 442 | ); 443 | name = QRCodeScan; 444 | productName = QRCodeScan; 445 | productReference = CD109C0577197FB977976F7DD6CBBCB1 /* QRCodeScan.framework */; 446 | productType = "com.apple.product-type.framework"; 447 | }; 448 | /* End PBXNativeTarget section */ 449 | 450 | /* Begin PBXProject section */ 451 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 452 | isa = PBXProject; 453 | attributes = { 454 | LastSwiftUpdateCheck = 1100; 455 | LastUpgradeCheck = 1100; 456 | }; 457 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 458 | compatibilityVersion = "Xcode 3.2"; 459 | developmentRegion = en; 460 | hasScannedForEncodings = 0; 461 | knownRegions = ( 462 | en, 463 | Base, 464 | ); 465 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 466 | productRefGroup = D9F3EAD09BA598E9D83BCBDB0AABCC7E /* Products */; 467 | projectDirPath = ""; 468 | projectRoot = ""; 469 | targets = ( 470 | AF6FE19C5A46D91F05C3216AE5681543 /* Pods-QRCodeScan_Example */, 471 | 0C7B1C9BBA4A0E0B9D8C26B74BF3F255 /* Pods-QRCodeScan_Tests */, 472 | C10E261C3C0FCE7E1581C15146AAEA10 /* QRCodeScan */, 473 | 7F3ABC2E0B1646A5338F826B02850472 /* QRCodeScan-QRCodeScan */, 474 | ); 475 | }; 476 | /* End PBXProject section */ 477 | 478 | /* Begin PBXResourcesBuildPhase section */ 479 | 31F532658EE48A9CBB5E2481753CE4CC /* Resources */ = { 480 | isa = PBXResourcesBuildPhase; 481 | buildActionMask = 2147483647; 482 | files = ( 483 | ); 484 | runOnlyForDeploymentPostprocessing = 0; 485 | }; 486 | 575BA79398FD5CC8AB807023EEBA87BB /* Resources */ = { 487 | isa = PBXResourcesBuildPhase; 488 | buildActionMask = 2147483647; 489 | files = ( 490 | DF416DFE89EC841A2C25A28F495DDF90 /* QRCodeScan.bundle in Resources */, 491 | ); 492 | runOnlyForDeploymentPostprocessing = 0; 493 | }; 494 | 6ACB85F22F4092E65534581FA208934C /* Resources */ = { 495 | isa = PBXResourcesBuildPhase; 496 | buildActionMask = 2147483647; 497 | files = ( 498 | AB2DA563A72B9BE595A59920BC218C5A /* QRCodeScan.bundle in Resources */, 499 | 15B79C2DC023F05C39D26A88711E4278 /* scan_exchange@2x.png in Resources */, 500 | C0A989A629022AA8DDBE3AA59C860B09 /* scan_exchange@3x.png in Resources */, 501 | BDF6A2CB1EA7561AB04D846932139996 /* scan_flash@2x.png in Resources */, 502 | DDD5B8BC6AD4560A92A4C4185FF4996A /* scan_flash@3x.png in Resources */, 503 | 93BB107B82BE18874B2BD6D20C375FD0 /* scan_photo@2x.png in Resources */, 504 | 9DC30F7BA37DE9222BF4F4F502B68B9D /* scan_photo@3x.png in Resources */, 505 | 1F719264F38680B7E355AA7F600E1463 /* scan_ring.wav in Resources */, 506 | B44C2594D40592DF910D6F34715FD345 /* scan_scanFrame@2x.png in Resources */, 507 | B32DC822D8B0D274557BF313388635E5 /* scan_scanFrame@3x.png in Resources */, 508 | CF2FA565E4B732A6DA70C55F87757F93 /* scan_scanLine@2x.png in Resources */, 509 | 023E0986A2BF8A5D81DFB9D392D15E8A /* scan_scanLine@3x.png in Resources */, 510 | ); 511 | runOnlyForDeploymentPostprocessing = 0; 512 | }; 513 | 9B0181EBF136209AA6B4423041A1EB48 /* Resources */ = { 514 | isa = PBXResourcesBuildPhase; 515 | buildActionMask = 2147483647; 516 | files = ( 517 | ); 518 | runOnlyForDeploymentPostprocessing = 0; 519 | }; 520 | /* End PBXResourcesBuildPhase section */ 521 | 522 | /* Begin PBXSourcesBuildPhase section */ 523 | 677FCD21CFDAA07FCED75AC4DAA95DB9 /* Sources */ = { 524 | isa = PBXSourcesBuildPhase; 525 | buildActionMask = 2147483647; 526 | files = ( 527 | A2BFD42CF09F9D353F42A94BC7B47614 /* QRCodeBundle.m in Sources */, 528 | C6DF8396E866E77717EF09AC3D5444EF /* QRCodeGenerateTools.m in Sources */, 529 | B4D867B3B4D7A0984EFB8CC7E13799B3 /* QRCodeScan-dummy.m in Sources */, 530 | 8D0D97D1280F4B2F5829215242A2CE6C /* QRCodeScanManager.m in Sources */, 531 | F118073325EB0C31B8A19CD8CB40CB58 /* QRCodeScanTools.m in Sources */, 532 | 5C083E2C2103DEE3880A63E40E866B33 /* QRCodeScanView.m in Sources */, 533 | 7B51827808D38E4264AB9E6D41522D0D /* UIImage+QRCodeExt.m in Sources */, 534 | 99691638E65B8D27E5B34B5DC90D88A0 /* UIView+QRCodeExt.m in Sources */, 535 | ); 536 | runOnlyForDeploymentPostprocessing = 0; 537 | }; 538 | 7012B93CA97D8F92542F49E2436B4FF4 /* Sources */ = { 539 | isa = PBXSourcesBuildPhase; 540 | buildActionMask = 2147483647; 541 | files = ( 542 | C7F6F127513F5237CA9A2E2115FA263A /* Pods-QRCodeScan_Tests-dummy.m in Sources */, 543 | ); 544 | runOnlyForDeploymentPostprocessing = 0; 545 | }; 546 | B9E913988F3094D575387A8249AE0993 /* Sources */ = { 547 | isa = PBXSourcesBuildPhase; 548 | buildActionMask = 2147483647; 549 | files = ( 550 | ); 551 | runOnlyForDeploymentPostprocessing = 0; 552 | }; 553 | C8E39C3A6158574181E51CC439875565 /* Sources */ = { 554 | isa = PBXSourcesBuildPhase; 555 | buildActionMask = 2147483647; 556 | files = ( 557 | 7D4896BC8FBC94F089A5BDDDE982F1B5 /* Pods-QRCodeScan_Example-dummy.m in Sources */, 558 | ); 559 | runOnlyForDeploymentPostprocessing = 0; 560 | }; 561 | /* End PBXSourcesBuildPhase section */ 562 | 563 | /* Begin PBXTargetDependency section */ 564 | 4F51D444B3CB0AD729E4BA779BA21993 /* PBXTargetDependency */ = { 565 | isa = PBXTargetDependency; 566 | name = QRCodeScan; 567 | target = C10E261C3C0FCE7E1581C15146AAEA10 /* QRCodeScan */; 568 | targetProxy = A42F59443EDB8A21763E5CB0023E3985 /* PBXContainerItemProxy */; 569 | }; 570 | 646AC78296D5CF9068E0989B168B0878 /* PBXTargetDependency */ = { 571 | isa = PBXTargetDependency; 572 | name = "QRCodeScan-QRCodeScan"; 573 | target = 7F3ABC2E0B1646A5338F826B02850472 /* QRCodeScan-QRCodeScan */; 574 | targetProxy = 7536B4A549488705A7592AA894423F38 /* PBXContainerItemProxy */; 575 | }; 576 | 6D4E0323CF8D0EDAC8D16C7872CCD360 /* PBXTargetDependency */ = { 577 | isa = PBXTargetDependency; 578 | name = "Pods-QRCodeScan_Example"; 579 | target = AF6FE19C5A46D91F05C3216AE5681543 /* Pods-QRCodeScan_Example */; 580 | targetProxy = 98B713EABD294C66DB818BD1DA7B56C8 /* PBXContainerItemProxy */; 581 | }; 582 | /* End PBXTargetDependency section */ 583 | 584 | /* Begin XCBuildConfiguration section */ 585 | 199BB7F4775D4CE4D0DC912ECF7C0D04 /* Release */ = { 586 | isa = XCBuildConfiguration; 587 | baseConfigurationReference = 11E1291DEFF2F5E3387FFEE4789B5A9C /* QRCodeScan.release.xcconfig */; 588 | buildSettings = { 589 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 590 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 591 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 592 | CURRENT_PROJECT_VERSION = 1; 593 | DEFINES_MODULE = YES; 594 | DYLIB_COMPATIBILITY_VERSION = 1; 595 | DYLIB_CURRENT_VERSION = 1; 596 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 597 | GCC_PREFIX_HEADER = "Target Support Files/QRCodeScan/QRCodeScan-prefix.pch"; 598 | INFOPLIST_FILE = "Target Support Files/QRCodeScan/QRCodeScan-Info.plist"; 599 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 600 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 601 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 602 | MODULEMAP_FILE = "Target Support Files/QRCodeScan/QRCodeScan.modulemap"; 603 | PRODUCT_MODULE_NAME = QRCodeScan; 604 | PRODUCT_NAME = QRCodeScan; 605 | SDKROOT = iphoneos; 606 | SKIP_INSTALL = YES; 607 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 608 | SWIFT_VERSION = 4.0; 609 | TARGETED_DEVICE_FAMILY = "1,2"; 610 | VALIDATE_PRODUCT = YES; 611 | VERSIONING_SYSTEM = "apple-generic"; 612 | VERSION_INFO_PREFIX = ""; 613 | }; 614 | name = Release; 615 | }; 616 | 2527B0706B989943BDFCC26FA5D353A1 /* Debug */ = { 617 | isa = XCBuildConfiguration; 618 | baseConfigurationReference = C12B718EDA7354AB02636AB471FC63B0 /* QRCodeScan.debug.xcconfig */; 619 | buildSettings = { 620 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QRCodeScan"; 621 | IBSC_MODULE = QRCodeScan; 622 | INFOPLIST_FILE = "Target Support Files/QRCodeScan/ResourceBundle-QRCodeScan-QRCodeScan-Info.plist"; 623 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 624 | PRODUCT_NAME = QRCodeScan; 625 | SDKROOT = iphoneos; 626 | SKIP_INSTALL = YES; 627 | TARGETED_DEVICE_FAMILY = "1,2"; 628 | WRAPPER_EXTENSION = bundle; 629 | }; 630 | name = Debug; 631 | }; 632 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */ = { 633 | isa = XCBuildConfiguration; 634 | buildSettings = { 635 | ALWAYS_SEARCH_USER_PATHS = NO; 636 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 637 | CLANG_ANALYZER_NONNULL = YES; 638 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 639 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 640 | CLANG_CXX_LIBRARY = "libc++"; 641 | CLANG_ENABLE_MODULES = YES; 642 | CLANG_ENABLE_OBJC_ARC = YES; 643 | CLANG_ENABLE_OBJC_WEAK = YES; 644 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 645 | CLANG_WARN_BOOL_CONVERSION = YES; 646 | CLANG_WARN_COMMA = YES; 647 | CLANG_WARN_CONSTANT_CONVERSION = YES; 648 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 649 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 650 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 651 | CLANG_WARN_EMPTY_BODY = YES; 652 | CLANG_WARN_ENUM_CONVERSION = YES; 653 | CLANG_WARN_INFINITE_RECURSION = YES; 654 | CLANG_WARN_INT_CONVERSION = YES; 655 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 656 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 657 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 658 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 659 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 660 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 661 | CLANG_WARN_STRICT_PROTOTYPES = YES; 662 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 663 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 664 | CLANG_WARN_UNREACHABLE_CODE = YES; 665 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 666 | COPY_PHASE_STRIP = NO; 667 | DEBUG_INFORMATION_FORMAT = dwarf; 668 | ENABLE_STRICT_OBJC_MSGSEND = YES; 669 | ENABLE_TESTABILITY = YES; 670 | GCC_C_LANGUAGE_STANDARD = gnu11; 671 | GCC_DYNAMIC_NO_PIC = NO; 672 | GCC_NO_COMMON_BLOCKS = YES; 673 | GCC_OPTIMIZATION_LEVEL = 0; 674 | GCC_PREPROCESSOR_DEFINITIONS = ( 675 | "POD_CONFIGURATION_DEBUG=1", 676 | "DEBUG=1", 677 | "$(inherited)", 678 | ); 679 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 680 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 681 | GCC_WARN_UNDECLARED_SELECTOR = YES; 682 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 683 | GCC_WARN_UNUSED_FUNCTION = YES; 684 | GCC_WARN_UNUSED_VARIABLE = YES; 685 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 686 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 687 | MTL_FAST_MATH = YES; 688 | ONLY_ACTIVE_ARCH = YES; 689 | PRODUCT_NAME = "$(TARGET_NAME)"; 690 | STRIP_INSTALLED_PRODUCT = NO; 691 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 692 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 693 | SWIFT_VERSION = 5.0; 694 | SYMROOT = "${SRCROOT}/../build"; 695 | }; 696 | name = Debug; 697 | }; 698 | 55A90F74BD716005562A54EE9F8D6486 /* Debug */ = { 699 | isa = XCBuildConfiguration; 700 | baseConfigurationReference = 566375CBFC400344A92DC8A9810867C4 /* Pods-QRCodeScan_Tests.debug.xcconfig */; 701 | buildSettings = { 702 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 703 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 704 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 705 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 706 | CURRENT_PROJECT_VERSION = 1; 707 | DEFINES_MODULE = YES; 708 | DYLIB_COMPATIBILITY_VERSION = 1; 709 | DYLIB_CURRENT_VERSION = 1; 710 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 711 | INFOPLIST_FILE = "Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-Info.plist"; 712 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 713 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 714 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 715 | MACH_O_TYPE = staticlib; 716 | MODULEMAP_FILE = "Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests.modulemap"; 717 | OTHER_LDFLAGS = ""; 718 | OTHER_LIBTOOLFLAGS = ""; 719 | PODS_ROOT = "$(SRCROOT)"; 720 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 721 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 722 | SDKROOT = iphoneos; 723 | SKIP_INSTALL = YES; 724 | TARGETED_DEVICE_FAMILY = "1,2"; 725 | VERSIONING_SYSTEM = "apple-generic"; 726 | VERSION_INFO_PREFIX = ""; 727 | }; 728 | name = Debug; 729 | }; 730 | 80D7246834DCBAD5CCA3746F1F848263 /* Release */ = { 731 | isa = XCBuildConfiguration; 732 | baseConfigurationReference = 11E1291DEFF2F5E3387FFEE4789B5A9C /* QRCodeScan.release.xcconfig */; 733 | buildSettings = { 734 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/QRCodeScan"; 735 | IBSC_MODULE = QRCodeScan; 736 | INFOPLIST_FILE = "Target Support Files/QRCodeScan/ResourceBundle-QRCodeScan-QRCodeScan-Info.plist"; 737 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 738 | PRODUCT_NAME = QRCodeScan; 739 | SDKROOT = iphoneos; 740 | SKIP_INSTALL = YES; 741 | TARGETED_DEVICE_FAMILY = "1,2"; 742 | WRAPPER_EXTENSION = bundle; 743 | }; 744 | name = Release; 745 | }; 746 | 8BBCF95A315403B711B0F3BA7FEB4DCC /* Release */ = { 747 | isa = XCBuildConfiguration; 748 | baseConfigurationReference = C2E3F64583FAA4B16A533CADDA35D5C3 /* Pods-QRCodeScan_Tests.release.xcconfig */; 749 | buildSettings = { 750 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 751 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 752 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 753 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 754 | CURRENT_PROJECT_VERSION = 1; 755 | DEFINES_MODULE = YES; 756 | DYLIB_COMPATIBILITY_VERSION = 1; 757 | DYLIB_CURRENT_VERSION = 1; 758 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 759 | INFOPLIST_FILE = "Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-Info.plist"; 760 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 761 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 762 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 763 | MACH_O_TYPE = staticlib; 764 | MODULEMAP_FILE = "Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests.modulemap"; 765 | OTHER_LDFLAGS = ""; 766 | OTHER_LIBTOOLFLAGS = ""; 767 | PODS_ROOT = "$(SRCROOT)"; 768 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 769 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 770 | SDKROOT = iphoneos; 771 | SKIP_INSTALL = YES; 772 | TARGETED_DEVICE_FAMILY = "1,2"; 773 | VALIDATE_PRODUCT = YES; 774 | VERSIONING_SYSTEM = "apple-generic"; 775 | VERSION_INFO_PREFIX = ""; 776 | }; 777 | name = Release; 778 | }; 779 | ADB656289E63DC15A87414EE12AD7DC9 /* Debug */ = { 780 | isa = XCBuildConfiguration; 781 | baseConfigurationReference = C12B718EDA7354AB02636AB471FC63B0 /* QRCodeScan.debug.xcconfig */; 782 | buildSettings = { 783 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 784 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 785 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 786 | CURRENT_PROJECT_VERSION = 1; 787 | DEFINES_MODULE = YES; 788 | DYLIB_COMPATIBILITY_VERSION = 1; 789 | DYLIB_CURRENT_VERSION = 1; 790 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 791 | GCC_PREFIX_HEADER = "Target Support Files/QRCodeScan/QRCodeScan-prefix.pch"; 792 | INFOPLIST_FILE = "Target Support Files/QRCodeScan/QRCodeScan-Info.plist"; 793 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 794 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 795 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 796 | MODULEMAP_FILE = "Target Support Files/QRCodeScan/QRCodeScan.modulemap"; 797 | PRODUCT_MODULE_NAME = QRCodeScan; 798 | PRODUCT_NAME = QRCodeScan; 799 | SDKROOT = iphoneos; 800 | SKIP_INSTALL = YES; 801 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 802 | SWIFT_VERSION = 4.0; 803 | TARGETED_DEVICE_FAMILY = "1,2"; 804 | VERSIONING_SYSTEM = "apple-generic"; 805 | VERSION_INFO_PREFIX = ""; 806 | }; 807 | name = Debug; 808 | }; 809 | BED467B710BB3416103D24A36EE2C876 /* Debug */ = { 810 | isa = XCBuildConfiguration; 811 | baseConfigurationReference = 7FF916825D14CEB5171B056EF0806F36 /* Pods-QRCodeScan_Example.debug.xcconfig */; 812 | buildSettings = { 813 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 814 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 815 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 816 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 817 | CURRENT_PROJECT_VERSION = 1; 818 | DEFINES_MODULE = YES; 819 | DYLIB_COMPATIBILITY_VERSION = 1; 820 | DYLIB_CURRENT_VERSION = 1; 821 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 822 | INFOPLIST_FILE = "Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-Info.plist"; 823 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 824 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 825 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 826 | MACH_O_TYPE = staticlib; 827 | MODULEMAP_FILE = "Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example.modulemap"; 828 | OTHER_LDFLAGS = ""; 829 | OTHER_LIBTOOLFLAGS = ""; 830 | PODS_ROOT = "$(SRCROOT)"; 831 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 832 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 833 | SDKROOT = iphoneos; 834 | SKIP_INSTALL = YES; 835 | TARGETED_DEVICE_FAMILY = "1,2"; 836 | VERSIONING_SYSTEM = "apple-generic"; 837 | VERSION_INFO_PREFIX = ""; 838 | }; 839 | name = Debug; 840 | }; 841 | C9A444B530431DC1C75BD58CBCB29A83 /* Release */ = { 842 | isa = XCBuildConfiguration; 843 | baseConfigurationReference = 715BF9C0B4C1445C55250494B4B7E6F2 /* Pods-QRCodeScan_Example.release.xcconfig */; 844 | buildSettings = { 845 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 846 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 847 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 848 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 849 | CURRENT_PROJECT_VERSION = 1; 850 | DEFINES_MODULE = YES; 851 | DYLIB_COMPATIBILITY_VERSION = 1; 852 | DYLIB_CURRENT_VERSION = 1; 853 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 854 | INFOPLIST_FILE = "Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-Info.plist"; 855 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 856 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 857 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 858 | MACH_O_TYPE = staticlib; 859 | MODULEMAP_FILE = "Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example.modulemap"; 860 | OTHER_LDFLAGS = ""; 861 | OTHER_LIBTOOLFLAGS = ""; 862 | PODS_ROOT = "$(SRCROOT)"; 863 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 864 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 865 | SDKROOT = iphoneos; 866 | SKIP_INSTALL = YES; 867 | TARGETED_DEVICE_FAMILY = "1,2"; 868 | VALIDATE_PRODUCT = YES; 869 | VERSIONING_SYSTEM = "apple-generic"; 870 | VERSION_INFO_PREFIX = ""; 871 | }; 872 | name = Release; 873 | }; 874 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */ = { 875 | isa = XCBuildConfiguration; 876 | buildSettings = { 877 | ALWAYS_SEARCH_USER_PATHS = NO; 878 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 879 | CLANG_ANALYZER_NONNULL = YES; 880 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 881 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 882 | CLANG_CXX_LIBRARY = "libc++"; 883 | CLANG_ENABLE_MODULES = YES; 884 | CLANG_ENABLE_OBJC_ARC = YES; 885 | CLANG_ENABLE_OBJC_WEAK = YES; 886 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 887 | CLANG_WARN_BOOL_CONVERSION = YES; 888 | CLANG_WARN_COMMA = YES; 889 | CLANG_WARN_CONSTANT_CONVERSION = YES; 890 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 891 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 892 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 893 | CLANG_WARN_EMPTY_BODY = YES; 894 | CLANG_WARN_ENUM_CONVERSION = YES; 895 | CLANG_WARN_INFINITE_RECURSION = YES; 896 | CLANG_WARN_INT_CONVERSION = YES; 897 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 898 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 899 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 900 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 901 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 902 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 903 | CLANG_WARN_STRICT_PROTOTYPES = YES; 904 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 905 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 906 | CLANG_WARN_UNREACHABLE_CODE = YES; 907 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 908 | COPY_PHASE_STRIP = NO; 909 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 910 | ENABLE_NS_ASSERTIONS = NO; 911 | ENABLE_STRICT_OBJC_MSGSEND = YES; 912 | GCC_C_LANGUAGE_STANDARD = gnu11; 913 | GCC_NO_COMMON_BLOCKS = YES; 914 | GCC_PREPROCESSOR_DEFINITIONS = ( 915 | "POD_CONFIGURATION_RELEASE=1", 916 | "$(inherited)", 917 | ); 918 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 919 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 920 | GCC_WARN_UNDECLARED_SELECTOR = YES; 921 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 922 | GCC_WARN_UNUSED_FUNCTION = YES; 923 | GCC_WARN_UNUSED_VARIABLE = YES; 924 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 925 | MTL_ENABLE_DEBUG_INFO = NO; 926 | MTL_FAST_MATH = YES; 927 | PRODUCT_NAME = "$(TARGET_NAME)"; 928 | STRIP_INSTALLED_PRODUCT = NO; 929 | SWIFT_COMPILATION_MODE = wholemodule; 930 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 931 | SWIFT_VERSION = 5.0; 932 | SYMROOT = "${SRCROOT}/../build"; 933 | }; 934 | name = Release; 935 | }; 936 | /* End XCBuildConfiguration section */ 937 | 938 | /* Begin XCConfigurationList section */ 939 | 26BD1FE1DCEA4584E0D7176C45C1A9E9 /* Build configuration list for PBXNativeTarget "Pods-QRCodeScan_Example" */ = { 940 | isa = XCConfigurationList; 941 | buildConfigurations = ( 942 | BED467B710BB3416103D24A36EE2C876 /* Debug */, 943 | C9A444B530431DC1C75BD58CBCB29A83 /* Release */, 944 | ); 945 | defaultConfigurationIsVisible = 0; 946 | defaultConfigurationName = Release; 947 | }; 948 | 2A2D931D358427E7FA1B599C53473D1C /* Build configuration list for PBXNativeTarget "Pods-QRCodeScan_Tests" */ = { 949 | isa = XCConfigurationList; 950 | buildConfigurations = ( 951 | 55A90F74BD716005562A54EE9F8D6486 /* Debug */, 952 | 8BBCF95A315403B711B0F3BA7FEB4DCC /* Release */, 953 | ); 954 | defaultConfigurationIsVisible = 0; 955 | defaultConfigurationName = Release; 956 | }; 957 | 2F4E1C6EC3F321F8392213368F58F309 /* Build configuration list for PBXNativeTarget "QRCodeScan" */ = { 958 | isa = XCConfigurationList; 959 | buildConfigurations = ( 960 | ADB656289E63DC15A87414EE12AD7DC9 /* Debug */, 961 | 199BB7F4775D4CE4D0DC912ECF7C0D04 /* Release */, 962 | ); 963 | defaultConfigurationIsVisible = 0; 964 | defaultConfigurationName = Release; 965 | }; 966 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 967 | isa = XCConfigurationList; 968 | buildConfigurations = ( 969 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */, 970 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */, 971 | ); 972 | defaultConfigurationIsVisible = 0; 973 | defaultConfigurationName = Release; 974 | }; 975 | B2275EEC1041D36A35A30EAC3763249D /* Build configuration list for PBXNativeTarget "QRCodeScan-QRCodeScan" */ = { 976 | isa = XCConfigurationList; 977 | buildConfigurations = ( 978 | 2527B0706B989943BDFCC26FA5D353A1 /* Debug */, 979 | 80D7246834DCBAD5CCA3746F1F848263 /* Release */, 980 | ); 981 | defaultConfigurationIsVisible = 0; 982 | defaultConfigurationName = Release; 983 | }; 984 | /* End XCConfigurationList section */ 985 | }; 986 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 987 | } 988 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## QRCodeScan 5 | 6 | Copyright (c) 2021 Singularity_Lee <496736912@qq.com> 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2021 Singularity_Lee <496736912@qq.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | QRCodeScan 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_QRCodeScan_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_QRCodeScan_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" 23 | 24 | 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 28 | 29 | # Copies and strips a vendored framework 30 | install_framework() 31 | { 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 33 | local source="${BUILT_PRODUCTS_DIR}/$1" 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 36 | elif [ -r "$1" ]; then 37 | local source="$1" 38 | fi 39 | 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 41 | 42 | if [ -L "${source}" ]; then 43 | echo "Symlinked..." 44 | source="$(readlink "${source}")" 45 | fi 46 | 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do 50 | echo "Installing $f" 51 | install_bcsymbolmap "$f" "$destination" 52 | rm "$f" 53 | done 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" 55 | fi 56 | 57 | # Use filter instead of exclude so missing patterns don't throw errors. 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 60 | 61 | local basename 62 | basename="$(basename -s .framework "$1")" 63 | binary="${destination}/${basename}.framework/${basename}" 64 | 65 | if ! [ -r "$binary" ]; then 66 | binary="${destination}/${basename}" 67 | elif [ -L "${binary}" ]; then 68 | echo "Destination binary is symlinked..." 69 | dirname="$(dirname "${binary}")" 70 | binary="${dirname}/$(readlink "${binary}")" 71 | fi 72 | 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 75 | strip_invalid_archs "$binary" 76 | fi 77 | 78 | # Resign the code if required by the build settings to avoid unstable apps 79 | code_sign_if_enabled "${destination}/$(basename "$1")" 80 | 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 83 | local swift_runtime_libs 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 85 | for lib in $swift_runtime_libs; do 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 88 | code_sign_if_enabled "${destination}/${lib}" 89 | done 90 | fi 91 | } 92 | # Copies and strips a vendored dSYM 93 | install_dsym() { 94 | local source="$1" 95 | warn_missing_arch=${2:-true} 96 | if [ -r "$source" ]; then 97 | # Copy the dSYM into the targets temp dir. 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 100 | 101 | local basename 102 | basename="$(basename -s .dSYM "$source")" 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 105 | 106 | # Strip invalid architectures from the dSYM. 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 108 | strip_invalid_archs "$binary" "$warn_missing_arch" 109 | fi 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then 111 | # Move the stripped file into its final destination. 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 114 | else 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 116 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 117 | fi 118 | fi 119 | } 120 | 121 | # Used as a return value for each invocation of `strip_invalid_archs` function. 122 | STRIP_BINARY_RETVAL=0 123 | 124 | # Strip invalid architectures 125 | strip_invalid_archs() { 126 | binary="$1" 127 | warn_missing_arch=${2:-true} 128 | # Get architectures for current target binary 129 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 130 | # Intersect them with the architectures we are building for 131 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 132 | # If there are no archs supported by this binary then warn the user 133 | if [[ -z "$intersected_archs" ]]; then 134 | if [[ "$warn_missing_arch" == "true" ]]; then 135 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 136 | fi 137 | STRIP_BINARY_RETVAL=1 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=0 152 | } 153 | 154 | # Copies the bcsymbolmap files of a vendored framework 155 | install_bcsymbolmap() { 156 | local bcsymbolmap_path="$1" 157 | local destination="${BUILT_PRODUCTS_DIR}" 158 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 159 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 160 | } 161 | 162 | # Signs a framework with the provided identity 163 | code_sign_if_enabled() { 164 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 165 | # Use the current code_sign_identity 166 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 167 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 168 | 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | code_sign_cmd="$code_sign_cmd &" 171 | fi 172 | echo "$code_sign_cmd" 173 | eval "$code_sign_cmd" 174 | fi 175 | } 176 | 177 | if [[ "$CONFIGURATION" == "Debug" ]]; then 178 | install_framework "${BUILT_PRODUCTS_DIR}/QRCodeScan/QRCodeScan.framework" 179 | fi 180 | if [[ "$CONFIGURATION" == "Release" ]]; then 181 | install_framework "${BUILT_PRODUCTS_DIR}/QRCodeScan/QRCodeScan.framework" 182 | fi 183 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 184 | wait 185 | fi 186 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_QRCodeScan_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_QRCodeScan_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan/QRCodeScan.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "QRCodeScan" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_QRCodeScan_Example { 2 | umbrella header "Pods-QRCodeScan_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan/QRCodeScan.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "QRCodeScan" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_QRCodeScan_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_QRCodeScan_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" 23 | 24 | 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 28 | 29 | # Copies and strips a vendored framework 30 | install_framework() 31 | { 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 33 | local source="${BUILT_PRODUCTS_DIR}/$1" 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 36 | elif [ -r "$1" ]; then 37 | local source="$1" 38 | fi 39 | 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 41 | 42 | if [ -L "${source}" ]; then 43 | echo "Symlinked..." 44 | source="$(readlink "${source}")" 45 | fi 46 | 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do 50 | echo "Installing $f" 51 | install_bcsymbolmap "$f" "$destination" 52 | rm "$f" 53 | done 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" 55 | fi 56 | 57 | # Use filter instead of exclude so missing patterns don't throw errors. 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 60 | 61 | local basename 62 | basename="$(basename -s .framework "$1")" 63 | binary="${destination}/${basename}.framework/${basename}" 64 | 65 | if ! [ -r "$binary" ]; then 66 | binary="${destination}/${basename}" 67 | elif [ -L "${binary}" ]; then 68 | echo "Destination binary is symlinked..." 69 | dirname="$(dirname "${binary}")" 70 | binary="${dirname}/$(readlink "${binary}")" 71 | fi 72 | 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 75 | strip_invalid_archs "$binary" 76 | fi 77 | 78 | # Resign the code if required by the build settings to avoid unstable apps 79 | code_sign_if_enabled "${destination}/$(basename "$1")" 80 | 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 83 | local swift_runtime_libs 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 85 | for lib in $swift_runtime_libs; do 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 88 | code_sign_if_enabled "${destination}/${lib}" 89 | done 90 | fi 91 | } 92 | # Copies and strips a vendored dSYM 93 | install_dsym() { 94 | local source="$1" 95 | warn_missing_arch=${2:-true} 96 | if [ -r "$source" ]; then 97 | # Copy the dSYM into the targets temp dir. 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 100 | 101 | local basename 102 | basename="$(basename -s .dSYM "$source")" 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 105 | 106 | # Strip invalid architectures from the dSYM. 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 108 | strip_invalid_archs "$binary" "$warn_missing_arch" 109 | fi 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then 111 | # Move the stripped file into its final destination. 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 114 | else 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 116 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 117 | fi 118 | fi 119 | } 120 | 121 | # Used as a return value for each invocation of `strip_invalid_archs` function. 122 | STRIP_BINARY_RETVAL=0 123 | 124 | # Strip invalid architectures 125 | strip_invalid_archs() { 126 | binary="$1" 127 | warn_missing_arch=${2:-true} 128 | # Get architectures for current target binary 129 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 130 | # Intersect them with the architectures we are building for 131 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 132 | # If there are no archs supported by this binary then warn the user 133 | if [[ -z "$intersected_archs" ]]; then 134 | if [[ "$warn_missing_arch" == "true" ]]; then 135 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 136 | fi 137 | STRIP_BINARY_RETVAL=1 138 | return 139 | fi 140 | stripped="" 141 | for arch in $binary_archs; do 142 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 143 | # Strip non-valid architectures in-place 144 | lipo -remove "$arch" -output "$binary" "$binary" 145 | stripped="$stripped $arch" 146 | fi 147 | done 148 | if [[ "$stripped" ]]; then 149 | echo "Stripped $binary of architectures:$stripped" 150 | fi 151 | STRIP_BINARY_RETVAL=0 152 | } 153 | 154 | # Copies the bcsymbolmap files of a vendored framework 155 | install_bcsymbolmap() { 156 | local bcsymbolmap_path="$1" 157 | local destination="${BUILT_PRODUCTS_DIR}" 158 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 159 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 160 | } 161 | 162 | # Signs a framework with the provided identity 163 | code_sign_if_enabled() { 164 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 165 | # Use the current code_sign_identity 166 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 167 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 168 | 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | code_sign_cmd="$code_sign_cmd &" 171 | fi 172 | echo "$code_sign_cmd" 173 | eval "$code_sign_cmd" 174 | fi 175 | } 176 | 177 | if [[ "$CONFIGURATION" == "Debug" ]]; then 178 | install_framework "${BUILT_PRODUCTS_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework" 179 | fi 180 | if [[ "$CONFIGURATION" == "Release" ]]; then 181 | install_framework "${BUILT_PRODUCTS_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework" 182 | fi 183 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 184 | wait 185 | fi 186 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_QRCodeScan_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_QRCodeScan_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan/QRCodeScan.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "QRCodeScan" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_QRCodeScan_Tests { 2 | umbrella header "Pods-QRCodeScan_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan/QRCodeScan.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "QRCodeScan" 6 | PODS_BUILD_DIR = ${BUILD_DIR} 7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 9 | PODS_ROOT = ${SRCROOT}/Pods 10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/QRCodeScan-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/QRCodeScan-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_QRCodeScan : NSObject 3 | @end 4 | @implementation PodsDummy_QRCodeScan 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/QRCodeScan-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/QRCodeScan-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "QRCodeBundle.h" 14 | #import "QRCodeGenerateTools.h" 15 | #import "QRCodeScan.h" 16 | #import "QRCodeScanHeader.h" 17 | #import "QRCodeScanManager.h" 18 | #import "QRCodeScanTools.h" 19 | #import "QRCodeScanView.h" 20 | #import "UIImage+QRCodeExt.h" 21 | #import "UIView+QRCodeExt.h" 22 | 23 | FOUNDATION_EXPORT double QRCodeScanVersionNumber; 24 | FOUNDATION_EXPORT const unsigned char QRCodeScanVersionString[]; 25 | 26 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/QRCodeScan.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/QRCodeScan.modulemap: -------------------------------------------------------------------------------- 1 | framework module QRCodeScan { 2 | umbrella header "QRCodeScan-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/QRCodeScan.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/QRCodeScan 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/QRCodeScan/ResourceBundle-QRCodeScan-QRCodeScan-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | ${PRODUCT_BUNDLE_IDENTIFIER} 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | ${PRODUCT_NAME} 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 0.1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/QRCodeScan.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0AF35040303B92D6764FB2E8 /* Pods_QRCodeScan_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AE342CBB4FD06B0DE1D2F2F /* Pods_QRCodeScan_Tests.framework */; }; 11 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 12 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 13 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 14 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 15 | 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 16 | 6003F59E195388D20070C39A /* XYAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* XYAppDelegate.m */; }; 17 | 6003F5A7195388D20070C39A /* XYViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* XYViewController.m */; }; 18 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 19 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; 20 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 21 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 22 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; 23 | 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; 24 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; 25 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; 26 | 93CF9D4D6A22969EF63E44E8 /* Pods_QRCodeScan_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A8EE9B8ADE0B5E5BC4E877BB /* Pods_QRCodeScan_Example.framework */; }; 27 | F147316D271587CA000B73AF /* QRCodeScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F147316A271587C9000B73AF /* QRCodeScanViewController.m */; }; 28 | F147316E271587CA000B73AF /* CodeGenerateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F147316C271587C9000B73AF /* CodeGenerateViewController.m */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 6003F582195388D10070C39A /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 6003F589195388D20070C39A; 37 | remoteInfo = QRCodeScan; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 0AE342CBB4FD06B0DE1D2F2F /* Pods_QRCodeScan_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_QRCodeScan_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 10C8609DB81F6F692925CF3D /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 44 | 1DD5E1C04F49124CEADF8C65 /* Pods-QRCodeScan_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QRCodeScan_Tests.debug.xcconfig"; path = "Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests.debug.xcconfig"; sourceTree = ""; }; 45 | 3441D5EF9519D4A2F7B971BF /* Pods-QRCodeScan_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QRCodeScan_Example.debug.xcconfig"; path = "Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example.debug.xcconfig"; sourceTree = ""; }; 46 | 4CF0E93BD2F4711178DC2866 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 47 | 5AC4140EABAC89B18C48981E /* QRCodeScan.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = QRCodeScan.podspec; path = ../QRCodeScan.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 48 | 6003F58A195388D20070C39A /* QRCodeScan_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QRCodeScan_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 50 | 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 51 | 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 52 | 6003F595195388D20070C39A /* QRCodeScan-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "QRCodeScan-Info.plist"; sourceTree = ""; }; 53 | 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 54 | 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 55 | 6003F59B195388D20070C39A /* QRCodeScan-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "QRCodeScan-Prefix.pch"; sourceTree = ""; }; 56 | 6003F59C195388D20070C39A /* XYAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XYAppDelegate.h; sourceTree = ""; }; 57 | 6003F59D195388D20070C39A /* XYAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XYAppDelegate.m; sourceTree = ""; }; 58 | 6003F5A5195388D20070C39A /* XYViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XYViewController.h; sourceTree = ""; }; 59 | 6003F5A6195388D20070C39A /* XYViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XYViewController.m; sourceTree = ""; }; 60 | 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 61 | 6003F5AE195388D20070C39A /* QRCodeScan_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QRCodeScan_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 63 | 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 64 | 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 65 | 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; }; 66 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; 67 | 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 68 | 84B5A9FCFB59FB7B30B76C90 /* Pods-QRCodeScan_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QRCodeScan_Example.release.xcconfig"; path = "Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example.release.xcconfig"; sourceTree = ""; }; 69 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 70 | 931B0522A42D863003D488EE /* Pods-QRCodeScan_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QRCodeScan_Tests.release.xcconfig"; path = "Target Support Files/Pods-QRCodeScan_Tests/Pods-QRCodeScan_Tests.release.xcconfig"; sourceTree = ""; }; 71 | A8EE9B8ADE0B5E5BC4E877BB /* Pods_QRCodeScan_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_QRCodeScan_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | F1473169271587C9000B73AF /* CodeGenerateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodeGenerateViewController.h; sourceTree = ""; }; 73 | F147316A271587C9000B73AF /* QRCodeScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QRCodeScanViewController.m; sourceTree = ""; }; 74 | F147316B271587C9000B73AF /* QRCodeScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QRCodeScanViewController.h; sourceTree = ""; }; 75 | F147316C271587C9000B73AF /* CodeGenerateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CodeGenerateViewController.m; sourceTree = ""; }; 76 | /* End PBXFileReference section */ 77 | 78 | /* Begin PBXFrameworksBuildPhase section */ 79 | 6003F587195388D20070C39A /* Frameworks */ = { 80 | isa = PBXFrameworksBuildPhase; 81 | buildActionMask = 2147483647; 82 | files = ( 83 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 84 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 85 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, 86 | 93CF9D4D6A22969EF63E44E8 /* Pods_QRCodeScan_Example.framework in Frameworks */, 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | 6003F5AB195388D20070C39A /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, 95 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, 96 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, 97 | 0AF35040303B92D6764FB2E8 /* Pods_QRCodeScan_Tests.framework in Frameworks */, 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | /* End PBXFrameworksBuildPhase section */ 102 | 103 | /* Begin PBXGroup section */ 104 | 6003F581195388D10070C39A = { 105 | isa = PBXGroup; 106 | children = ( 107 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, 108 | 6003F593195388D20070C39A /* Example for QRCodeScan */, 109 | 6003F5B5195388D20070C39A /* Tests */, 110 | 6003F58C195388D20070C39A /* Frameworks */, 111 | 6003F58B195388D20070C39A /* Products */, 112 | C8320E3604642661C2658C22 /* Pods */, 113 | ); 114 | sourceTree = ""; 115 | }; 116 | 6003F58B195388D20070C39A /* Products */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 6003F58A195388D20070C39A /* QRCodeScan_Example.app */, 120 | 6003F5AE195388D20070C39A /* QRCodeScan_Tests.xctest */, 121 | ); 122 | name = Products; 123 | sourceTree = ""; 124 | }; 125 | 6003F58C195388D20070C39A /* Frameworks */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 6003F58D195388D20070C39A /* Foundation.framework */, 129 | 6003F58F195388D20070C39A /* CoreGraphics.framework */, 130 | 6003F591195388D20070C39A /* UIKit.framework */, 131 | 6003F5AF195388D20070C39A /* XCTest.framework */, 132 | A8EE9B8ADE0B5E5BC4E877BB /* Pods_QRCodeScan_Example.framework */, 133 | 0AE342CBB4FD06B0DE1D2F2F /* Pods_QRCodeScan_Tests.framework */, 134 | ); 135 | name = Frameworks; 136 | sourceTree = ""; 137 | }; 138 | 6003F593195388D20070C39A /* Example for QRCodeScan */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | 6003F59C195388D20070C39A /* XYAppDelegate.h */, 142 | 6003F59D195388D20070C39A /* XYAppDelegate.m */, 143 | 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, 144 | 6003F5A5195388D20070C39A /* XYViewController.h */, 145 | 6003F5A6195388D20070C39A /* XYViewController.m */, 146 | F1473169271587C9000B73AF /* CodeGenerateViewController.h */, 147 | F147316C271587C9000B73AF /* CodeGenerateViewController.m */, 148 | F147316B271587C9000B73AF /* QRCodeScanViewController.h */, 149 | F147316A271587C9000B73AF /* QRCodeScanViewController.m */, 150 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, 151 | 6003F5A8195388D20070C39A /* Images.xcassets */, 152 | 6003F594195388D20070C39A /* Supporting Files */, 153 | ); 154 | name = "Example for QRCodeScan"; 155 | path = QRCodeScan; 156 | sourceTree = ""; 157 | }; 158 | 6003F594195388D20070C39A /* Supporting Files */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | 6003F595195388D20070C39A /* QRCodeScan-Info.plist */, 162 | 6003F596195388D20070C39A /* InfoPlist.strings */, 163 | 6003F599195388D20070C39A /* main.m */, 164 | 6003F59B195388D20070C39A /* QRCodeScan-Prefix.pch */, 165 | ); 166 | name = "Supporting Files"; 167 | sourceTree = ""; 168 | }; 169 | 6003F5B5195388D20070C39A /* Tests */ = { 170 | isa = PBXGroup; 171 | children = ( 172 | 6003F5BB195388D20070C39A /* Tests.m */, 173 | 6003F5B6195388D20070C39A /* Supporting Files */, 174 | ); 175 | path = Tests; 176 | sourceTree = ""; 177 | }; 178 | 6003F5B6195388D20070C39A /* Supporting Files */ = { 179 | isa = PBXGroup; 180 | children = ( 181 | 6003F5B7195388D20070C39A /* Tests-Info.plist */, 182 | 6003F5B8195388D20070C39A /* InfoPlist.strings */, 183 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, 184 | ); 185 | name = "Supporting Files"; 186 | sourceTree = ""; 187 | }; 188 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { 189 | isa = PBXGroup; 190 | children = ( 191 | 5AC4140EABAC89B18C48981E /* QRCodeScan.podspec */, 192 | 4CF0E93BD2F4711178DC2866 /* README.md */, 193 | 10C8609DB81F6F692925CF3D /* LICENSE */, 194 | ); 195 | name = "Podspec Metadata"; 196 | sourceTree = ""; 197 | }; 198 | C8320E3604642661C2658C22 /* Pods */ = { 199 | isa = PBXGroup; 200 | children = ( 201 | 3441D5EF9519D4A2F7B971BF /* Pods-QRCodeScan_Example.debug.xcconfig */, 202 | 84B5A9FCFB59FB7B30B76C90 /* Pods-QRCodeScan_Example.release.xcconfig */, 203 | 1DD5E1C04F49124CEADF8C65 /* Pods-QRCodeScan_Tests.debug.xcconfig */, 204 | 931B0522A42D863003D488EE /* Pods-QRCodeScan_Tests.release.xcconfig */, 205 | ); 206 | path = Pods; 207 | sourceTree = ""; 208 | }; 209 | /* End PBXGroup section */ 210 | 211 | /* Begin PBXNativeTarget section */ 212 | 6003F589195388D20070C39A /* QRCodeScan_Example */ = { 213 | isa = PBXNativeTarget; 214 | buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "QRCodeScan_Example" */; 215 | buildPhases = ( 216 | EE93260A215848A60048674C /* [CP] Check Pods Manifest.lock */, 217 | 6003F586195388D20070C39A /* Sources */, 218 | 6003F587195388D20070C39A /* Frameworks */, 219 | 6003F588195388D20070C39A /* Resources */, 220 | C90A311CEAFB4790B719581A /* [CP] Embed Pods Frameworks */, 221 | ); 222 | buildRules = ( 223 | ); 224 | dependencies = ( 225 | ); 226 | name = QRCodeScan_Example; 227 | productName = QRCodeScan; 228 | productReference = 6003F58A195388D20070C39A /* QRCodeScan_Example.app */; 229 | productType = "com.apple.product-type.application"; 230 | }; 231 | 6003F5AD195388D20070C39A /* QRCodeScan_Tests */ = { 232 | isa = PBXNativeTarget; 233 | buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "QRCodeScan_Tests" */; 234 | buildPhases = ( 235 | F77750D2E780BD335EBB3CD3 /* [CP] Check Pods Manifest.lock */, 236 | 6003F5AA195388D20070C39A /* Sources */, 237 | 6003F5AB195388D20070C39A /* Frameworks */, 238 | 6003F5AC195388D20070C39A /* Resources */, 239 | ); 240 | buildRules = ( 241 | ); 242 | dependencies = ( 243 | 6003F5B4195388D20070C39A /* PBXTargetDependency */, 244 | ); 245 | name = QRCodeScan_Tests; 246 | productName = QRCodeScanTests; 247 | productReference = 6003F5AE195388D20070C39A /* QRCodeScan_Tests.xctest */; 248 | productType = "com.apple.product-type.bundle.unit-test"; 249 | }; 250 | /* End PBXNativeTarget section */ 251 | 252 | /* Begin PBXProject section */ 253 | 6003F582195388D10070C39A /* Project object */ = { 254 | isa = PBXProject; 255 | attributes = { 256 | CLASSPREFIX = XY; 257 | LastUpgradeCheck = 0720; 258 | ORGANIZATIONNAME = Singularity_Lee; 259 | TargetAttributes = { 260 | 6003F589195388D20070C39A = { 261 | DevelopmentTeam = ZU5HW79FDS; 262 | }; 263 | 6003F5AD195388D20070C39A = { 264 | TestTargetID = 6003F589195388D20070C39A; 265 | }; 266 | }; 267 | }; 268 | buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "QRCodeScan" */; 269 | compatibilityVersion = "Xcode 3.2"; 270 | developmentRegion = English; 271 | hasScannedForEncodings = 0; 272 | knownRegions = ( 273 | English, 274 | en, 275 | Base, 276 | ); 277 | mainGroup = 6003F581195388D10070C39A; 278 | productRefGroup = 6003F58B195388D20070C39A /* Products */; 279 | projectDirPath = ""; 280 | projectRoot = ""; 281 | targets = ( 282 | 6003F589195388D20070C39A /* QRCodeScan_Example */, 283 | 6003F5AD195388D20070C39A /* QRCodeScan_Tests */, 284 | ); 285 | }; 286 | /* End PBXProject section */ 287 | 288 | /* Begin PBXResourcesBuildPhase section */ 289 | 6003F588195388D20070C39A /* Resources */ = { 290 | isa = PBXResourcesBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */, 294 | 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, 295 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, 296 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, 297 | ); 298 | runOnlyForDeploymentPostprocessing = 0; 299 | }; 300 | 6003F5AC195388D20070C39A /* Resources */ = { 301 | isa = PBXResourcesBuildPhase; 302 | buildActionMask = 2147483647; 303 | files = ( 304 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, 305 | ); 306 | runOnlyForDeploymentPostprocessing = 0; 307 | }; 308 | /* End PBXResourcesBuildPhase section */ 309 | 310 | /* Begin PBXShellScriptBuildPhase section */ 311 | C90A311CEAFB4790B719581A /* [CP] Embed Pods Frameworks */ = { 312 | isa = PBXShellScriptBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | ); 316 | inputPaths = ( 317 | "${PODS_ROOT}/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-frameworks.sh", 318 | "${BUILT_PRODUCTS_DIR}/QRCodeScan/QRCodeScan.framework", 319 | ); 320 | name = "[CP] Embed Pods Frameworks"; 321 | outputPaths = ( 322 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QRCodeScan.framework", 323 | ); 324 | runOnlyForDeploymentPostprocessing = 0; 325 | shellPath = /bin/sh; 326 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-QRCodeScan_Example/Pods-QRCodeScan_Example-frameworks.sh\"\n"; 327 | showEnvVarsInLog = 0; 328 | }; 329 | EE93260A215848A60048674C /* [CP] Check Pods Manifest.lock */ = { 330 | isa = PBXShellScriptBuildPhase; 331 | buildActionMask = 2147483647; 332 | files = ( 333 | ); 334 | inputFileListPaths = ( 335 | ); 336 | inputPaths = ( 337 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 338 | "${PODS_ROOT}/Manifest.lock", 339 | ); 340 | name = "[CP] Check Pods Manifest.lock"; 341 | outputFileListPaths = ( 342 | ); 343 | outputPaths = ( 344 | "$(DERIVED_FILE_DIR)/Pods-QRCodeScan_Example-checkManifestLockResult.txt", 345 | ); 346 | runOnlyForDeploymentPostprocessing = 0; 347 | shellPath = /bin/sh; 348 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 349 | showEnvVarsInLog = 0; 350 | }; 351 | F77750D2E780BD335EBB3CD3 /* [CP] Check Pods Manifest.lock */ = { 352 | isa = PBXShellScriptBuildPhase; 353 | buildActionMask = 2147483647; 354 | files = ( 355 | ); 356 | inputFileListPaths = ( 357 | ); 358 | inputPaths = ( 359 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 360 | "${PODS_ROOT}/Manifest.lock", 361 | ); 362 | name = "[CP] Check Pods Manifest.lock"; 363 | outputFileListPaths = ( 364 | ); 365 | outputPaths = ( 366 | "$(DERIVED_FILE_DIR)/Pods-QRCodeScan_Tests-checkManifestLockResult.txt", 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | shellPath = /bin/sh; 370 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 371 | showEnvVarsInLog = 0; 372 | }; 373 | /* End PBXShellScriptBuildPhase section */ 374 | 375 | /* Begin PBXSourcesBuildPhase section */ 376 | 6003F586195388D20070C39A /* Sources */ = { 377 | isa = PBXSourcesBuildPhase; 378 | buildActionMask = 2147483647; 379 | files = ( 380 | 6003F59E195388D20070C39A /* XYAppDelegate.m in Sources */, 381 | F147316E271587CA000B73AF /* CodeGenerateViewController.m in Sources */, 382 | 6003F5A7195388D20070C39A /* XYViewController.m in Sources */, 383 | 6003F59A195388D20070C39A /* main.m in Sources */, 384 | F147316D271587CA000B73AF /* QRCodeScanViewController.m in Sources */, 385 | ); 386 | runOnlyForDeploymentPostprocessing = 0; 387 | }; 388 | 6003F5AA195388D20070C39A /* Sources */ = { 389 | isa = PBXSourcesBuildPhase; 390 | buildActionMask = 2147483647; 391 | files = ( 392 | 6003F5BC195388D20070C39A /* Tests.m in Sources */, 393 | ); 394 | runOnlyForDeploymentPostprocessing = 0; 395 | }; 396 | /* End PBXSourcesBuildPhase section */ 397 | 398 | /* Begin PBXTargetDependency section */ 399 | 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { 400 | isa = PBXTargetDependency; 401 | target = 6003F589195388D20070C39A /* QRCodeScan_Example */; 402 | targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; 403 | }; 404 | /* End PBXTargetDependency section */ 405 | 406 | /* Begin PBXVariantGroup section */ 407 | 6003F596195388D20070C39A /* InfoPlist.strings */ = { 408 | isa = PBXVariantGroup; 409 | children = ( 410 | 6003F597195388D20070C39A /* en */, 411 | ); 412 | name = InfoPlist.strings; 413 | sourceTree = ""; 414 | }; 415 | 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { 416 | isa = PBXVariantGroup; 417 | children = ( 418 | 6003F5B9195388D20070C39A /* en */, 419 | ); 420 | name = InfoPlist.strings; 421 | sourceTree = ""; 422 | }; 423 | 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { 424 | isa = PBXVariantGroup; 425 | children = ( 426 | 71719F9E1E33DC2100824A3D /* Base */, 427 | ); 428 | name = LaunchScreen.storyboard; 429 | sourceTree = ""; 430 | }; 431 | /* End PBXVariantGroup section */ 432 | 433 | /* Begin XCBuildConfiguration section */ 434 | 6003F5BD195388D20070C39A /* Debug */ = { 435 | isa = XCBuildConfiguration; 436 | buildSettings = { 437 | ALWAYS_SEARCH_USER_PATHS = NO; 438 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 439 | CLANG_CXX_LIBRARY = "libc++"; 440 | CLANG_ENABLE_MODULES = YES; 441 | CLANG_ENABLE_OBJC_ARC = YES; 442 | CLANG_WARN_BOOL_CONVERSION = YES; 443 | CLANG_WARN_CONSTANT_CONVERSION = YES; 444 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 445 | CLANG_WARN_EMPTY_BODY = YES; 446 | CLANG_WARN_ENUM_CONVERSION = YES; 447 | CLANG_WARN_INT_CONVERSION = YES; 448 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 449 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 450 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 451 | COPY_PHASE_STRIP = NO; 452 | ENABLE_TESTABILITY = YES; 453 | GCC_C_LANGUAGE_STANDARD = gnu99; 454 | GCC_DYNAMIC_NO_PIC = NO; 455 | GCC_OPTIMIZATION_LEVEL = 0; 456 | GCC_PREPROCESSOR_DEFINITIONS = ( 457 | "DEBUG=1", 458 | "$(inherited)", 459 | ); 460 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 461 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 462 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 463 | GCC_WARN_UNDECLARED_SELECTOR = YES; 464 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 465 | GCC_WARN_UNUSED_FUNCTION = YES; 466 | GCC_WARN_UNUSED_VARIABLE = YES; 467 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 468 | ONLY_ACTIVE_ARCH = YES; 469 | SDKROOT = iphoneos; 470 | TARGETED_DEVICE_FAMILY = "1,2"; 471 | }; 472 | name = Debug; 473 | }; 474 | 6003F5BE195388D20070C39A /* Release */ = { 475 | isa = XCBuildConfiguration; 476 | buildSettings = { 477 | ALWAYS_SEARCH_USER_PATHS = NO; 478 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 479 | CLANG_CXX_LIBRARY = "libc++"; 480 | CLANG_ENABLE_MODULES = YES; 481 | CLANG_ENABLE_OBJC_ARC = YES; 482 | CLANG_WARN_BOOL_CONVERSION = YES; 483 | CLANG_WARN_CONSTANT_CONVERSION = YES; 484 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 485 | CLANG_WARN_EMPTY_BODY = YES; 486 | CLANG_WARN_ENUM_CONVERSION = YES; 487 | CLANG_WARN_INT_CONVERSION = YES; 488 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 489 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 490 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 491 | COPY_PHASE_STRIP = YES; 492 | ENABLE_NS_ASSERTIONS = NO; 493 | GCC_C_LANGUAGE_STANDARD = gnu99; 494 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 495 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 496 | GCC_WARN_UNDECLARED_SELECTOR = YES; 497 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 498 | GCC_WARN_UNUSED_FUNCTION = YES; 499 | GCC_WARN_UNUSED_VARIABLE = YES; 500 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 501 | SDKROOT = iphoneos; 502 | TARGETED_DEVICE_FAMILY = "1,2"; 503 | VALIDATE_PRODUCT = YES; 504 | }; 505 | name = Release; 506 | }; 507 | 6003F5C0195388D20070C39A /* Debug */ = { 508 | isa = XCBuildConfiguration; 509 | baseConfigurationReference = 3441D5EF9519D4A2F7B971BF /* Pods-QRCodeScan_Example.debug.xcconfig */; 510 | buildSettings = { 511 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 512 | DEVELOPMENT_TEAM = ZU5HW79FDS; 513 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 514 | GCC_PREFIX_HEADER = "QRCodeScan/QRCodeScan-Prefix.pch"; 515 | INFOPLIST_FILE = "QRCodeScan/QRCodeScan-Info.plist"; 516 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 517 | MODULE_NAME = ExampleApp; 518 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 519 | PRODUCT_NAME = "$(TARGET_NAME)"; 520 | SWIFT_VERSION = 4.0; 521 | WRAPPER_EXTENSION = app; 522 | }; 523 | name = Debug; 524 | }; 525 | 6003F5C1195388D20070C39A /* Release */ = { 526 | isa = XCBuildConfiguration; 527 | baseConfigurationReference = 84B5A9FCFB59FB7B30B76C90 /* Pods-QRCodeScan_Example.release.xcconfig */; 528 | buildSettings = { 529 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 530 | DEVELOPMENT_TEAM = ZU5HW79FDS; 531 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 532 | GCC_PREFIX_HEADER = "QRCodeScan/QRCodeScan-Prefix.pch"; 533 | INFOPLIST_FILE = "QRCodeScan/QRCodeScan-Info.plist"; 534 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 535 | MODULE_NAME = ExampleApp; 536 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 537 | PRODUCT_NAME = "$(TARGET_NAME)"; 538 | SWIFT_VERSION = 4.0; 539 | WRAPPER_EXTENSION = app; 540 | }; 541 | name = Release; 542 | }; 543 | 6003F5C3195388D20070C39A /* Debug */ = { 544 | isa = XCBuildConfiguration; 545 | baseConfigurationReference = 1DD5E1C04F49124CEADF8C65 /* Pods-QRCodeScan_Tests.debug.xcconfig */; 546 | buildSettings = { 547 | BUNDLE_LOADER = "$(TEST_HOST)"; 548 | FRAMEWORK_SEARCH_PATHS = ( 549 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 550 | "$(inherited)", 551 | "$(DEVELOPER_FRAMEWORKS_DIR)", 552 | ); 553 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 554 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 555 | GCC_PREPROCESSOR_DEFINITIONS = ( 556 | "DEBUG=1", 557 | "$(inherited)", 558 | ); 559 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 560 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 561 | PRODUCT_NAME = "$(TARGET_NAME)"; 562 | SWIFT_VERSION = 4.0; 563 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/QRCodeScan_Example.app/QRCodeScan_Example"; 564 | WRAPPER_EXTENSION = xctest; 565 | }; 566 | name = Debug; 567 | }; 568 | 6003F5C4195388D20070C39A /* Release */ = { 569 | isa = XCBuildConfiguration; 570 | baseConfigurationReference = 931B0522A42D863003D488EE /* Pods-QRCodeScan_Tests.release.xcconfig */; 571 | buildSettings = { 572 | BUNDLE_LOADER = "$(TEST_HOST)"; 573 | FRAMEWORK_SEARCH_PATHS = ( 574 | "$(PLATFORM_DIR)/Developer/Library/Frameworks", 575 | "$(inherited)", 576 | "$(DEVELOPER_FRAMEWORKS_DIR)", 577 | ); 578 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 579 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 580 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 581 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 582 | PRODUCT_NAME = "$(TARGET_NAME)"; 583 | SWIFT_VERSION = 4.0; 584 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/QRCodeScan_Example.app/QRCodeScan_Example"; 585 | WRAPPER_EXTENSION = xctest; 586 | }; 587 | name = Release; 588 | }; 589 | /* End XCBuildConfiguration section */ 590 | 591 | /* Begin XCConfigurationList section */ 592 | 6003F585195388D10070C39A /* Build configuration list for PBXProject "QRCodeScan" */ = { 593 | isa = XCConfigurationList; 594 | buildConfigurations = ( 595 | 6003F5BD195388D20070C39A /* Debug */, 596 | 6003F5BE195388D20070C39A /* Release */, 597 | ); 598 | defaultConfigurationIsVisible = 0; 599 | defaultConfigurationName = Release; 600 | }; 601 | 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "QRCodeScan_Example" */ = { 602 | isa = XCConfigurationList; 603 | buildConfigurations = ( 604 | 6003F5C0195388D20070C39A /* Debug */, 605 | 6003F5C1195388D20070C39A /* Release */, 606 | ); 607 | defaultConfigurationIsVisible = 0; 608 | defaultConfigurationName = Release; 609 | }; 610 | 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "QRCodeScan_Tests" */ = { 611 | isa = XCConfigurationList; 612 | buildConfigurations = ( 613 | 6003F5C3195388D20070C39A /* Debug */, 614 | 6003F5C4195388D20070C39A /* Release */, 615 | ); 616 | defaultConfigurationIsVisible = 0; 617 | defaultConfigurationName = Release; 618 | }; 619 | /* End XCConfigurationList section */ 620 | }; 621 | rootObject = 6003F582195388D10070C39A /* Project object */; 622 | } 623 | -------------------------------------------------------------------------------- /Example/QRCodeScan.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/QRCodeScan.xcodeproj/xcshareddata/xcschemes/QRCodeScan-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Example/QRCodeScan.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/QRCodeScan.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/QRCodeScan/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Example/QRCodeScan/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Example/QRCodeScan/CodeGenerateViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CodeGenerateViewController.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2018/9/3. 6 | // Copyright © 2018年 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CodeGenerateViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/QRCodeScan/CodeGenerateViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // CodeGenerateViewController.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2018/9/3. 6 | // Copyright © 2018年 singularity. All rights reserved. 7 | // 8 | 9 | #import "CodeGenerateViewController.h" 10 | #import 11 | 12 | @interface CodeGenerateViewController () 13 | 14 | @end 15 | 16 | @implementation CodeGenerateViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | // Do any additional setup after loading the view. 21 | self.view.backgroundColor=[UIColor whiteColor]; 22 | 23 | [self setDefaultQRCode]; 24 | [self setLogoQRCode]; 25 | [self setColorQRCode]; 26 | } 27 | 28 | 29 | - (void)setDefaultQRCode{ 30 | UIImageView *code=[[UIImageView alloc]initWithFrame:CGRectMake(10, 90, 100, 100)]; 31 | code.image=[QRCodeGenerateTools generateWithDefaultQRCodeData:@"https://github.com/XueYangLee/QRCodeScan" imageViewWidth:100]; 32 | [self.view addSubview:code]; 33 | } 34 | 35 | - (void)setLogoQRCode{ 36 | UIImageView *code=[[UIImageView alloc]initWithFrame:CGRectMake(10, 200, 100, 100)]; 37 | code.image=[QRCodeGenerateTools generateWithLogoQRCodeData:@"https://github.com/XueYangLee/QRCodeScan" logoImageName:@"scan_photo" logoScaleToSuperView:0.2]; 38 | [self.view addSubview:code]; 39 | } 40 | 41 | - (void)setColorQRCode{ 42 | UIImageView *code=[[UIImageView alloc]initWithFrame:CGRectMake(10, 310, 100, 100)]; 43 | code.image=[QRCodeGenerateTools generateWithColorQRCodeData:@"https://github.com/XueYangLee/QRCodeScan" backgroundColor:[CIColor blueColor] mainColor:[CIColor yellowColor]]; 44 | [self.view addSubview:code]; 45 | } 46 | 47 | 48 | 49 | - (void)didReceiveMemoryWarning { 50 | [super didReceiveMemoryWarning]; 51 | // Dispose of any resources that can be recreated. 52 | } 53 | 54 | /* 55 | #pragma mark - Navigation 56 | 57 | // In a storyboard-based application, you will often want to do a little preparation before navigation 58 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 59 | // Get the new view controller using [segue destinationViewController]. 60 | // Pass the selected object to the new view controller. 61 | } 62 | */ 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /Example/QRCodeScan/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Example/QRCodeScan/QRCodeScan-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | NSCameraUsageDescription 49 | 获取相机 50 | NSPhotoLibraryUsageDescription 51 | 获取相册 52 | NSPhotoLibraryAddUsageDescription 53 | 获取相册 54 | 55 | 56 | -------------------------------------------------------------------------------- /Example/QRCodeScan/QRCodeScan-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | @import UIKit; 15 | @import Foundation; 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/QRCodeScan/QRCodeScanViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanViewController.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/10. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface QRCodeScanViewController : UIViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /Example/QRCodeScan/QRCodeScanViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanViewController.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/10. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import "QRCodeScanViewController.h" 10 | #import 11 | 12 | 13 | @interface QRCodeScanViewController () 14 | 15 | @property (nonatomic,strong) QRCodeScanView *scanView; 16 | @property (nonatomic,strong) QRCodeScanManager *scanManager; 17 | 18 | @property (nonatomic,assign) BOOL lightFlash; 19 | @property (nonatomic,assign) BOOL isInput; 20 | 21 | @end 22 | 23 | @implementation QRCodeScanViewController 24 | 25 | - (void)viewWillAppear:(BOOL)animated { 26 | [super viewWillAppear:animated]; 27 | if (![self.scanManager sessionIsRunning]) { 28 | [self.scanManager sessionStartRunning]; 29 | [self.scanView addLineAnimateLoop]; 30 | } 31 | } 32 | 33 | - (void)viewWillDisappear:(BOOL)animated { 34 | [super viewWillDisappear:animated]; 35 | [self.scanManager sessionStopRunning]; 36 | } 37 | 38 | - (void)viewDidLoad { 39 | [super viewDidLoad]; 40 | // Do any additional setup after loading the view. 41 | self.view.backgroundColor=[UIColor blackColor]; 42 | 43 | // app退到后台 44 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterBackground) name:UIApplicationWillResignActiveNotification object:nil]; 45 | // app进入前台 46 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterPlayGround) name:UIApplicationDidBecomeActiveNotification object:nil]; 47 | 48 | self.lightFlash=NO; 49 | self.isInput=NO; 50 | 51 | [self setupNavigationView]; 52 | [self setupScanView]; 53 | [self setupScanMananger]; 54 | } 55 | 56 | - (void)setupNavigationView{ 57 | self.navigationItem.title=@"二维码/条形码"; 58 | 59 | UIBarButtonItem *photo=[[UIBarButtonItem alloc]initWithImage:[[UIImage QRCodeImageNamed:@"scan_photo"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStyleDone target:self action:@selector(photoClick)]; 60 | UIBarButtonItem *flash=[[UIBarButtonItem alloc]initWithImage:[[UIImage QRCodeImageNamed:@"scan_flash"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStyleDone target:self action:@selector(flashClick)]; 61 | self.navigationItem.rightBarButtonItems=@[photo,flash]; 62 | } 63 | 64 | 65 | - (void)setupScanView{ 66 | _scanView=[[QRCodeScanView alloc]initWithFrame:self.view.bounds]; 67 | _scanView.showScanInputExchange=YES; 68 | [self.view addSubview:_scanView]; 69 | __weak typeof(self) weakSelf=self; 70 | _scanView.scanViewTransformExchange = ^(ScanViewAnimationTransform transformType) { 71 | //ScanToInput->需停止扫描session ; InputToScan-> 需开启扫描session 72 | if (transformType==ScanToInput) { 73 | weakSelf.isInput=YES; 74 | [weakSelf.scanManager sessionStopRunning]; 75 | }else{ 76 | weakSelf.isInput=NO; 77 | [weakSelf.scanManager sessionStartRunning]; 78 | } 79 | }; 80 | _scanView.textInputResult = ^(NSString * _Nonnull inputResult) { 81 | [weakSelf QRCodeResult:inputResult]; 82 | }; 83 | } 84 | 85 | - (void)setupScanMananger{ 86 | __weak typeof(self) weakSelf=self; 87 | _scanManager=[[QRCodeScanManager alloc]initWithPreviewLayerSuperView:self.view ScanResult:^(NSString * _Nonnull scanResult) { 88 | 89 | [QRCodeScanTools openShake:YES Sound:YES]; 90 | if ([weakSelf.scanManager sessionIsRunning]) { 91 | [weakSelf.scanManager sessionStopRunning]; 92 | [weakSelf.scanView removeLineAnimateLoop]; 93 | } 94 | [weakSelf QRCodeResult:scanResult]; 95 | }]; 96 | } 97 | 98 | 99 | #pragma mark - 二维码结果 100 | - (void)QRCodeResult:(NSString *)codeResult{ 101 | [QRCodeScanTools alertActionWithTitle:@"扫描结果" Message:[NSString stringWithFormat:@"结果为:%@",codeResult] actionHandler:^(UIAlertAction * _Nonnull action) { 102 | if (!self.isInput) { 103 | if (![self.scanManager sessionIsRunning]) { 104 | [self.scanManager sessionStartRunning]; 105 | [self.scanView addLineAnimateLoop]; 106 | } 107 | } 108 | 109 | } Target:self]; 110 | } 111 | 112 | 113 | #pragma mark - 开灯或关灯 114 | - (void)flashClick{ 115 | self.lightFlash=!self.lightFlash; 116 | [QRCodeScanTools openLight:self.lightFlash]; 117 | } 118 | 119 | #pragma mark - 调用相册 120 | - (void)photoClick{ 121 | [self.scanManager presentPhotoLibraryReadQRCodeImageWithRooterVC:self ReadResult:^(NSString * _Nonnull readResult) { 122 | [self QRCodeResult:readResult]; 123 | }]; 124 | } 125 | 126 | 127 | 128 | #pragma mark -通知前后台切换 129 | - (void)appWillEnterBackground{ 130 | if ([self.scanManager sessionIsRunning]) { 131 | [self.scanManager sessionStopRunning]; 132 | [self.scanView removeLineAnimateLoop]; 133 | } 134 | } 135 | 136 | - (void)appWillEnterPlayGround{ 137 | if (![self.scanManager sessionIsRunning]) { 138 | [self.scanManager sessionStartRunning]; 139 | [self.scanView addLineAnimateLoop]; 140 | } 141 | } 142 | 143 | - (void)dealloc{ 144 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 145 | } 146 | 147 | - (void)didReceiveMemoryWarning { 148 | [super didReceiveMemoryWarning]; 149 | // Dispose of any resources that can be recreated. 150 | } 151 | 152 | @end 153 | -------------------------------------------------------------------------------- /Example/QRCodeScan/XYAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // XYAppDelegate.h 3 | // QRCodeScan 4 | // 5 | // Created by Singularity_Lee on 10/12/2021. 6 | // Copyright (c) 2021 Singularity_Lee. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface XYAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/QRCodeScan/XYAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // XYAppDelegate.m 3 | // QRCodeScan 4 | // 5 | // Created by Singularity_Lee on 10/12/2021. 6 | // Copyright (c) 2021 Singularity_Lee. All rights reserved. 7 | // 8 | 9 | #import "XYAppDelegate.h" 10 | 11 | @implementation XYAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | // Override point for customization after application launch. 16 | return YES; 17 | } 18 | 19 | - (void)applicationWillResignActive:(UIApplication *)application 20 | { 21 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 23 | } 24 | 25 | - (void)applicationDidEnterBackground:(UIApplication *)application 26 | { 27 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | - (void)applicationWillEnterForeground:(UIApplication *)application 32 | { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | - (void)applicationDidBecomeActive:(UIApplication *)application 37 | { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application 42 | { 43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /Example/QRCodeScan/XYViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // XYViewController.h 3 | // QRCodeScan 4 | // 5 | // Created by Singularity_Lee on 10/12/2021. 6 | // Copyright (c) 2021 Singularity_Lee. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface XYViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/QRCodeScan/XYViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // XYViewController.m 3 | // QRCodeScan 4 | // 5 | // Created by Singularity_Lee on 10/12/2021. 6 | // Copyright (c) 2021 Singularity_Lee. All rights reserved. 7 | // 8 | 9 | #import "XYViewController.h" 10 | #import "CodeGenerateViewController.h" 11 | #import "QRCodeScanViewController.h" 12 | #import 13 | 14 | @interface XYViewController () 15 | 16 | @end 17 | 18 | @implementation XYViewController 19 | 20 | - (void)viewDidLoad 21 | { 22 | [super viewDidLoad]; 23 | // Do any additional setup after loading the view, typically from a nib. 24 | 25 | for (NSInteger i=0; i<2; i++) { 26 | UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(0, i*50+100, QRCode_SCREEN_WIDTH, 40)]; 27 | [btn setTitle:i==0?@"二维码/条形码扫描":@"生成二维码" forState:UIControlStateNormal]; 28 | [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; 29 | btn.backgroundColor=[UIColor lightGrayColor]; 30 | btn.tag=i; 31 | [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; 32 | [self.view addSubview:btn]; 33 | } 34 | } 35 | 36 | 37 | 38 | #warning 不要忘记plist文件设置权限 39 | - (void)btnClick:(UIButton *)sender{ 40 | if (sender.tag==0) { 41 | [QRCodeScanTools permitCameraWithTarget:self PushScanView:[QRCodeScanViewController new]]; 42 | }else{ 43 | [self.navigationController pushViewController:[CodeGenerateViewController new] animated:YES]; 44 | } 45 | } 46 | 47 | - (void)didReceiveMemoryWarning { 48 | [super didReceiveMemoryWarning]; 49 | // Dispose of any resources that can be recreated. 50 | } 51 | 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /Example/QRCodeScan/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/QRCodeScan/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // QRCodeScan 4 | // 5 | // Created by Singularity_Lee on 10/12/2021. 6 | // Copyright (c) 2021 Singularity_Lee. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "XYAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) 13 | { 14 | @autoreleasepool { 15 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([XYAppDelegate class])); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Example/Tests/Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/Tests/Tests-Prefix.pch: -------------------------------------------------------------------------------- 1 | // The contents of this file are implicitly included at the beginning of every test case source file. 2 | 3 | #ifdef __OBJC__ 4 | 5 | @import FBSnapshotTestCase; 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /Example/Tests/Tests.m: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanTests.m 3 | // QRCodeScanTests 4 | // 5 | // Created by Singularity_Lee on 10/12/2021. 6 | // Copyright (c) 2021 Singularity_Lee. All rights reserved. 7 | // 8 | 9 | @import XCTest; 10 | 11 | @interface Tests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation Tests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | 36 | -------------------------------------------------------------------------------- /Example/Tests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 Singularity_Lee <496736912@qq.com> 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /QRCodeScan.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint QRCodeScan.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'QRCodeScan' 11 | s.version = '1.0.0' 12 | s.summary = '扫描组件' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | 扫描组件 22 | DESC 23 | 24 | s.homepage = 'https://github.com/XueYangLee/QRCodeScan' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'Singularity_Lee' => '496736912@qq.com' } 28 | s.source = { :git => 'https://github.com/XueYangLee/QRCodeScan.git', :tag => s.version.to_s } 29 | # s.social_media_url = 'https://twitter.com/' 30 | 31 | s.ios.deployment_target = '9.0' 32 | 33 | s.source_files = 'QRCodeScan/Classes/*.{h,m}' 34 | # s.resources = ['QRCodeScan/Assets/**/*.*'] 35 | s.resource_bundles = { 36 | 'QRCodeScan' => ['QRCodeScan/Assets/**/*.*'] 37 | } 38 | 39 | s.public_header_files = 'QRCodeScan/Classes/**/*.h' 40 | # s.frameworks = 'UIKit', 'MapKit' 41 | # s.dependency 'AFNetworking', '~> 2.3' 42 | end 43 | -------------------------------------------------------------------------------- /QRCodeScan/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/.gitkeep -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_exchange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_exchange@2x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_exchange@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_exchange@3x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_flash@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_flash@2x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_flash@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_flash@3x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_photo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_photo@2x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_photo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_photo@3x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_ring.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_ring.wav -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_scanFrame@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_scanFrame@2x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_scanFrame@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_scanFrame@3x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_scanLine@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_scanLine@2x.png -------------------------------------------------------------------------------- /QRCodeScan/Assets/QRCodeScan.bundle/scan_scanLine@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Assets/QRCodeScan.bundle/scan_scanLine@3x.png -------------------------------------------------------------------------------- /QRCodeScan/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/QRCodeScan/Classes/.gitkeep -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeBundle.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeBundle.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2021/10/12. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface QRCodeBundle : NSBundle 13 | 14 | + (NSBundle *)bundle; 15 | 16 | 17 | + (NSBundle *)bundleWithName:(NSString *)bundleName; 18 | 19 | + (UIImage *)imageNamed:(NSString *)imageName; 20 | 21 | + (UIImage *)imageNamed:(NSString *)imageName inBundle:(NSBundle *)bundle; 22 | 23 | + (UIImage *)imageNamed:(NSString *)imageName bundleName:(NSString *)bundleName; 24 | 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeBundle.m: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeBundle.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2021/10/12. 6 | // 7 | 8 | #import "QRCodeBundle.h" 9 | 10 | @implementation QRCodeBundle 11 | 12 | + (NSBundle *)bundle{ 13 | return [self.class bundleWithName:@"QRCodeBundle"]; 14 | } 15 | 16 | 17 | + (NSBundle *)bundleWithName:(NSString *)bundleName { 18 | if(bundleName.length == 0) { 19 | return nil; 20 | } 21 | NSBundle *resourceBundle = nil; 22 | NSBundle *mainBundle = [NSBundle bundleForClass:self]; 23 | NSString *path = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"bundle"]; 24 | resourceBundle = [NSBundle bundleWithPath:path]?:mainBundle; 25 | NSAssert(resourceBundle, @"not found bundle"); 26 | return resourceBundle; 27 | } 28 | 29 | 30 | + (UIImage *)imageNamed:(NSString *)imageName { 31 | NSAssert([self imageNamed:imageName inBundle:[self.class bundle]], @"not found image"); 32 | return [self imageNamed:imageName inBundle:[self.class bundle]]; 33 | } 34 | 35 | + (UIImage *)imageNamed:(NSString *)imageName inBundle:(NSBundle *)bundle { 36 | if(imageName.length == 0 || !bundle) { 37 | return nil; 38 | } 39 | return [UIImage imageNamed:imageName inBundle:bundle compatibleWithTraitCollection:nil]; 40 | } 41 | 42 | 43 | + (UIImage *)imageNamed:(NSString *)imageName bundleName:(NSString *)bundleName { 44 | return [self imageNamed:imageName inBundle:[self bundleWithName:bundleName]]; 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeGenerateTools.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeGenerateTools.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/9. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface QRCodeGenerateTools : NSObject 15 | 16 | /** 生成一张普通的二维码 */ 17 | + (UIImage *)generateWithDefaultQRCodeData:(NSString *)data imageViewWidth:(CGFloat)imageViewWidth; 18 | 19 | /** 生成一张带有logo的二维码(logoScaleToSuperView:相对于父视图的缩放比取值范围0-1;0,不显示,1,代表与父视图大小相同)*/ 20 | + (UIImage *)generateWithLogoQRCodeData:(NSString *)data logoImageName:(NSString *)logoImageName logoScaleToSuperView:(CGFloat)logoScaleToSuperView; 21 | 22 | /** 生成一张彩色的二维码 */ 23 | + (UIImage *)generateWithColorQRCodeData:(NSString *)data backgroundColor:(CIColor *)backgroundColor mainColor:(CIColor *)mainColor; 24 | 25 | 26 | /** 生成条形码 */ 27 | + (UIImage *)generateCode128:(NSString *)code size:(CGSize)size; 28 | 29 | @end 30 | 31 | NS_ASSUME_NONNULL_END 32 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeGenerateTools.m: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeGenerateTools.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/9. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import "QRCodeGenerateTools.h" 10 | 11 | @implementation QRCodeGenerateTools 12 | 13 | /** 14 | * 生成一张普通的二维码 15 | * 16 | * @param data 传入你要生成二维码的数据 17 | * @param imageViewWidth 图片的宽度 18 | */ 19 | + (UIImage *)generateWithDefaultQRCodeData:(NSString *)data imageViewWidth:(CGFloat)imageViewWidth { 20 | // 1、创建滤镜对象 21 | CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; 22 | 23 | // 恢复滤镜的默认属性 24 | [filter setDefaults]; 25 | 26 | // 2、设置数据 27 | NSString *info = data; 28 | // 将字符串转换成 29 | NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding]; 30 | 31 | // 通过KVC设置滤镜inputMessage数据 32 | [filter setValue:infoData forKeyPath:@"inputMessage"]; 33 | 34 | // 3、获得滤镜输出的图像 35 | CIImage *outputImage = [filter outputImage]; 36 | 37 | return [self createNonInterpolatedUIImageFormCIImage:outputImage withSize:imageViewWidth]; 38 | } 39 | 40 | /** 根据CIImage生成指定大小的UIImage */ 41 | + (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat)size { 42 | CGRect extent = CGRectIntegral(image.extent); 43 | CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));// 计算需要缩放的比例 44 | 45 | // 1.创建bitmap; 46 | size_t width = CGRectGetWidth(extent) * scale; 47 | size_t height = CGRectGetHeight(extent) * scale; 48 | CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray(); 49 | CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone); 50 | CIContext *context = [CIContext contextWithOptions:nil]; 51 | CGImageRef bitmapImage = [context createCGImage:image fromRect:extent]; 52 | CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone); 53 | CGContextScaleCTM(bitmapRef, scale, scale); 54 | CGContextDrawImage(bitmapRef, extent, bitmapImage); 55 | 56 | // 2.保存bitmap到图片 57 | CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef); 58 | CGContextRelease(bitmapRef); 59 | CGImageRelease(bitmapImage); 60 | return [UIImage imageWithCGImage:scaledImage]; 61 | } 62 | 63 | /** 64 | * 生成一张带有logo的二维码 65 | * 66 | * @param data 传入你要生成二维码的数据 67 | * @param logoImageName logo的image名 68 | * @param logoScaleToSuperView logo相对于父视图的缩放比(取值范围:0-1,0,代表不显示,1,代表与父视图大小相同) 69 | */ 70 | + (UIImage *)generateWithLogoQRCodeData:(NSString *)data logoImageName:(NSString *)logoImageName logoScaleToSuperView:(CGFloat)logoScaleToSuperView { 71 | // 1、创建滤镜对象 72 | CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; 73 | 74 | // 恢复滤镜的默认属性 75 | [filter setDefaults]; 76 | 77 | // 2、设置数据 78 | NSString *string_data = data; 79 | // 将字符串转换成 NSdata (虽然二维码本质上是字符串, 但是这里需要转换, 不转换就崩溃) 80 | NSData *qrImageData = [string_data dataUsingEncoding:NSUTF8StringEncoding]; 81 | 82 | // 设置过滤器的输入值, KVC赋值 83 | [filter setValue:qrImageData forKey:@"inputMessage"]; 84 | 85 | // 3、获得滤镜输出的图像 86 | CIImage *outputImage = [filter outputImage]; 87 | 88 | // 图片小于(27,27),我们需要放大 89 | outputImage = [outputImage imageByApplyingTransform:CGAffineTransformMakeScale(20, 20)]; 90 | 91 | // 4、将CIImage类型转成UIImage类型 92 | UIImage *start_image = [UIImage imageWithCIImage:outputImage]; 93 | 94 | // - - - - - - - - - - - - - - - - 添加中间小图标 - - - - - - - - - - - - - - - - 95 | // 5、开启绘图, 获取图形上下文 (上下文的大小, 就是二维码的大小) 96 | UIGraphicsBeginImageContext(start_image.size); 97 | 98 | // 把二维码图片画上去 (这里是以图形上下文, 左上角为(0,0)点 99 | [start_image drawInRect:CGRectMake(0, 0, start_image.size.width, start_image.size.height)]; 100 | 101 | // 再把小图片画上去 102 | NSString *icon_imageName = logoImageName; 103 | UIImage *icon_image = [UIImage imageNamed:icon_imageName]; 104 | CGFloat icon_imageW = start_image.size.width * logoScaleToSuperView; 105 | CGFloat icon_imageH = start_image.size.height * logoScaleToSuperView; 106 | CGFloat icon_imageX = (start_image.size.width - icon_imageW) * 0.5; 107 | CGFloat icon_imageY = (start_image.size.height - icon_imageH) * 0.5; 108 | 109 | [icon_image drawInRect:CGRectMake(icon_imageX, icon_imageY, icon_imageW, icon_imageH)]; 110 | 111 | // 6、获取当前画得的这张图片 112 | UIImage *final_image = UIGraphicsGetImageFromCurrentImageContext(); 113 | 114 | // 7、关闭图形上下文 115 | UIGraphicsEndImageContext(); 116 | 117 | return final_image; 118 | } 119 | 120 | /** 121 | * 生成一张彩色的二维码 122 | * 123 | * @param data 传入你要生成二维码的数据 124 | * @param backgroundColor 背景色 125 | * @param mainColor 主颜色 126 | */ 127 | + (UIImage *)generateWithColorQRCodeData:(NSString *)data backgroundColor:(CIColor *)backgroundColor mainColor:(CIColor *)mainColor { 128 | // 1、创建滤镜对象 129 | CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; 130 | 131 | // 恢复滤镜的默认属性 132 | [filter setDefaults]; 133 | 134 | // 2、设置数据 135 | NSString *string_data = data; 136 | // 将字符串转换成 NSdata (虽然二维码本质上是字符串, 但是这里需要转换, 不转换就崩溃) 137 | NSData *qrImageData = [string_data dataUsingEncoding:NSUTF8StringEncoding]; 138 | 139 | // 设置过滤器的输入值, KVC赋值 140 | [filter setValue:qrImageData forKey:@"inputMessage"]; 141 | 142 | // 3、获得滤镜输出的图像 143 | CIImage *outputImage = [filter outputImage]; 144 | 145 | // 图片小于(27,27),我们需要放大 146 | outputImage = [outputImage imageByApplyingTransform:CGAffineTransformMakeScale(9, 9)]; 147 | 148 | // 4、创建彩色过滤器(彩色的用的不多) 149 | CIFilter * color_filter = [CIFilter filterWithName:@"CIFalseColor"]; 150 | 151 | // 设置默认值 152 | [color_filter setDefaults]; 153 | 154 | // 5、KVC 给私有属性赋值 155 | [color_filter setValue:outputImage forKey:@"inputImage"]; 156 | 157 | // 6、需要使用 CIColor 158 | [color_filter setValue:backgroundColor forKey:@"inputColor0"]; 159 | [color_filter setValue:mainColor forKey:@"inputColor1"]; 160 | 161 | // 7、设置输出 162 | CIImage *colorImage = [color_filter outputImage]; 163 | 164 | return [UIImage imageWithCIImage:colorImage]; 165 | } 166 | 167 | 168 | /** 生成条形码 */ 169 | + (UIImage *)generateCode128:(NSString *)code size:(CGSize)size { 170 | 171 | NSData *codeData = [code dataUsingEncoding:NSUTF8StringEncoding]; 172 | CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator" withInputParameters:@{@"inputMessage": codeData, @"inputQuietSpace": @.0}]; 173 | /* @{@"inputMessage": codeData, @"inputQuietSpace": @(.0), @"inputBarcodeHeight": @(size.width / 3)} */ 174 | UIImage *codeImage = [self scaleImage:filter.outputImage toSize:size]; 175 | 176 | return codeImage; 177 | } 178 | 179 | // 缩放图片(生成高质量图片) 180 | + (UIImage *)scaleImage:(CIImage *)image toSize:(CGSize)size { 181 | 182 | //! 将CIImage转成CGImageRef 183 | CGRect integralRect = image.extent;// CGRectIntegral(image.extent);// 将rect取整后返回,origin取舍,size取入 184 | CGImageRef imageRef = [[CIContext context] createCGImage:image fromRect:integralRect]; 185 | 186 | //! 创建上下文 187 | CGFloat sideScale = fminf(size.width / integralRect.size.width, size.width / integralRect.size.height) * [UIScreen mainScreen].scale;// 计算需要缩放的比例 188 | size_t contextRefWidth = ceilf(integralRect.size.width * sideScale); 189 | size_t contextRefHeight = ceilf(integralRect.size.height * sideScale); 190 | CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray(); 191 | CGContextRef contextRef = CGBitmapContextCreate(nil, contextRefWidth, contextRefHeight, 8, 0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);// 灰度、不透明 192 | CGColorSpaceRelease(colorSpaceRef); 193 | 194 | CGContextSetInterpolationQuality(contextRef, kCGInterpolationNone);// 设置上下文无插值 195 | CGContextScaleCTM(contextRef, sideScale, sideScale);// 设置上下文缩放 196 | CGContextDrawImage(contextRef, integralRect, imageRef);// 在上下文中的integralRect中绘制imageRef 197 | CGImageRelease(imageRef); 198 | 199 | //! 从上下文中获取CGImageRef 200 | CGImageRef scaledImageRef = CGBitmapContextCreateImage(contextRef); 201 | CGContextRelease(contextRef); 202 | 203 | //! 将CGImageRefc转成UIImage 204 | UIImage *scaledImage = [UIImage imageWithCGImage:scaledImageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]; 205 | CGImageRelease(scaledImageRef); 206 | 207 | return scaledImage; 208 | } 209 | 210 | @end 211 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScan.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScan.h 3 | // Pods 4 | // 5 | // Created by 李雪阳 on 2021/10/12. 6 | // 7 | 8 | 9 | #import "QRCodeScanHeader.h" 10 | #import "QRCodeGenerateTools.h" 11 | #import "QRCodeScanManager.h" 12 | #import "QRCodeScanTools.h" 13 | #import "QRCodeScanView.h" 14 | #import "UIImage+QRCodeExt.h" 15 | 16 | 17 | #ifndef QRCodeScan_h 18 | #define QRCodeScan_h 19 | 20 | #endif /* QRCodeScan_h */ 21 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScanHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanHeader.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/9. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #ifndef QRCodeScanHeader_h 10 | #define QRCodeScanHeader_h 11 | 12 | 13 | #define QRCode_SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) 14 | #define QRCode_SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) 15 | #define QRCode_STATUS_HEIGHT [[UIApplication sharedApplication] statusBarFrame].size.height 16 | 17 | #define QRCode_UIColorWithRGBA(r,g,b,a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a] 18 | 19 | //字体深黑 20 | #define QRCode_BLACK_COLOR QRCode_UIColorWithRGBA(51.0f, 51.0f, 51.0f, 1.0f) 21 | 22 | #define QRCode_MaxX(v) CGRectGetMaxX((v).frame) //横坐标加上控件的宽度 23 | #define QRCode_MaxY(v) CGRectGetMaxY((v).frame) //纵坐标加上控件的高度 24 | 25 | 26 | 27 | /** ---------------扫描所需部分--------------- */ 28 | 29 | #define QRCode_RATIO [[UIScreen mainScreen] bounds].size.width/375.0 30 | 31 | //二维码部分扫描框尺寸 32 | #define QRCode_BarBGImgX 15*QRCode_RATIO 33 | #define QRCode_BarBGImgY (44+QRCode_STATUS_HEIGHT+87)*QRCode_RATIO 34 | #define QRCode_BarBGImgWidth (QRCode_SCREEN_WIDTH - (QRCode_BarBGImgX *2)) 35 | #define QRCode_BarBGImgHeight 210*QRCode_RATIO 36 | //提示语 37 | #define QRCode_BarTipY (QRCode_BarBGImgY+QRCode_BarBGImgHeight-QRCode_BarTipHeight) 38 | #define QRCode_BarTipHeight 30*QRCode_RATIO 39 | //输入框高度 40 | #define QRCode_InputTextHeight 45 41 | 42 | //扫描条高度 43 | #define QRCode_ScrollLineHeight 5*QRCode_RATIO 44 | 45 | #define QRCode_BGAlpha 0.6 46 | 47 | 48 | /** ---------------扫描所需部分--------------- */ 49 | 50 | 51 | 52 | #endif /* QRCodeScanHeader_h */ 53 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScanManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanManager.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/9. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "QRCodeScanTools.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | /** 扫描结果 */ 16 | typedef void (^QRCodeScanResult)(NSString *scanResult); 17 | 18 | /** 相册二维码照片读取结果 */ 19 | typedef void (^PhotoCodeImageReadResult)(NSString *readResult); 20 | 21 | 22 | 23 | @interface QRCodeScanManager : NSObject 24 | 25 | /** 开启扫描 */ 26 | - (void)sessionStartRunning; 27 | /** 停止扫描 */ 28 | - (void)sessionStopRunning; 29 | /** 判读是否在扫描 */ 30 | - (BOOL)sessionIsRunning; 31 | 32 | 33 | /** 光感开关开启照明 */ 34 | @property (nonatomic,copy) void (^lightSensationShouldOpen)(BOOL openLight); 35 | 36 | 37 | /** 初始化方法 并返回扫描结果 */ 38 | - (instancetype)initWithPreviewLayerSuperView:(UIView *)superView ScanResult:(QRCodeScanResult)scanResult; 39 | 40 | /** 调用相册并读取二维码图片返回读取结果 */ 41 | - (void)presentPhotoLibraryReadQRCodeImageWithRooterVC:(UIViewController *)rootVC ReadResult:(PhotoCodeImageReadResult)readResult; 42 | 43 | @end 44 | 45 | NS_ASSUME_NONNULL_END 46 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScanManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanManager.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/9. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import "QRCodeScanManager.h" 10 | #import "QRCodeScanHeader.h" 11 | 12 | 13 | @interface QRCodeScanManager () 14 | 15 | /**输入输出中间桥梁(会话)*/ 16 | @property (nonatomic,strong) AVCaptureSession *session; 17 | 18 | /** 扫描结果 */ 19 | @property (nonatomic,copy) QRCodeScanResult scanResult; 20 | /** 相册二维码照片读取结果 */ 21 | @property (nonatomic,copy) PhotoCodeImageReadResult readResult; 22 | 23 | @end 24 | 25 | 26 | 27 | @implementation QRCodeScanManager 28 | 29 | 30 | - (instancetype)initWithPreviewLayerSuperView:(UIView *)superView ScanResult:(QRCodeScanResult)scanResult{ 31 | self=[super init]; 32 | if (self) { 33 | self.scanResult=scanResult; 34 | [self setupVideoPreviewLayerWithSuperView:superView]; 35 | } 36 | return self; 37 | } 38 | 39 | 40 | #pragma mark -创建预览图层/扫描图层 *优先调用 41 | - (void)setupVideoPreviewLayerWithSuperView:(UIView *)superView{ 42 | //创建预览图层 43 | AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session]; 44 | [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 45 | previewLayer.frame = superView.bounds; 46 | [superView.layer insertSublayer:previewLayer atIndex:0]; 47 | //[previewLayer addAnimation:[QRCodeScanTools zoomOutAnimation] forKey:nil];//添加过渡动画,类似微信 48 | 49 | 50 | //缩放手势 51 | UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)]; 52 | [superView addGestureRecognizer:pinchGesture]; 53 | } 54 | 55 | 56 | #pragma mark -相机调用 57 | - (AVCaptureSession *)session { 58 | if (!_session) { 59 | //1.获取输入设备(摄像头) 60 | AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 61 | 62 | //2.根据输入设备创建输入对象 63 | AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL]; 64 | if (input == nil) { 65 | return nil; 66 | } 67 | 68 | //3.创建元数据的输出对象 69 | AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init]; 70 | //4.设置代理监听输出对象输出的数据,在主线程中刷新 71 | [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 72 | 73 | // 创建环境光感输出流 74 | AVCaptureVideoDataOutput *lightOutput = [[AVCaptureVideoDataOutput alloc] init]; 75 | [lightOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 76 | 77 | // 5.创建会话(桥梁) 78 | AVCaptureSession *session = [[AVCaptureSession alloc]init]; 79 | //实现高质量的输出和摄像,默认值为AVCaptureSessionPresetHigh,可以不写 80 | //AVCaptureSessionPreset1920x1080 对于小型的二维码读取率较高 81 | [session setSessionPreset:AVCaptureSessionPreset1280x720]; 82 | // 6.添加输入和输出到会话中(判断session是否已满) 83 | if ([session canAddInput:input]) { 84 | [session addInput:input]; 85 | } 86 | if ([session canAddOutput:output]) { 87 | [session addOutput:output]; 88 | } 89 | if ([session canAddOutput:lightOutput]) { 90 | [session addOutput:lightOutput]; 91 | } 92 | 93 | // 7.告诉输出对象, 需要输出什么样的数据 (二维码还是条形码等) 要先创建会话才能设置 94 | output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode93Code,AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode39Mod43Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeUPCECode,AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeAztecCode]; 95 | 96 | //8.设置有效扫描区域,默认整个图层(很特别,1、要除以屏幕宽高比例,2、其中x和y、width和height分别互换位置) 97 | //rectOfInterest 填写的是一个比例,输出流视图preview.frame为 x , y, w, h, 要设置的矩形快的scanFrame 为 x1, y1, w1, h1. 那么rectOfInterest 应该设置为 CGRectMake(y1/y, x1/x, h1/h, w1/w)。 98 | CGRect rect = CGRectMake(QRCode_BarBGImgY/QRCode_SCREEN_HEIGHT, QRCode_BarBGImgX/QRCode_SCREEN_WIDTH, QRCode_BarBGImgHeight/QRCode_SCREEN_HEIGHT, QRCode_BarBGImgWidth/QRCode_SCREEN_WIDTH); 99 | //CGRect rect = CGRectMake(0, 0, 0, 0); 100 | output.rectOfInterest = rect; 101 | 102 | _session = session; 103 | } 104 | return _session; 105 | } 106 | 107 | /** 开始扫描 */ 108 | - (void)sessionStartRunning{ 109 | if (!self.session.isRunning) { 110 | [self.session startRunning]; 111 | } 112 | } 113 | /** 停止扫描 */ 114 | - (void)sessionStopRunning{ 115 | if (self.session.isRunning) { 116 | [self.session stopRunning]; 117 | } 118 | } 119 | /** 判断是否在扫描中 */ 120 | - (BOOL)sessionIsRunning{ 121 | return self.session.isRunning; 122 | } 123 | 124 | 125 | #pragma mark -扫描获取扫描结果 126 | - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ 127 | if (metadataObjects.count > 0) { 128 | /* 129 | [QRCodeScanTools openShake:YES Sound:YES]; 130 | // 1.停止扫描 131 | [self.session stopRunning]; 132 | // 2.停止扫描线运动 133 | [self.link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];*/ 134 | 135 | // 3.取出扫描到得数据 136 | AVMetadataMachineReadableCodeObject *obj = [metadataObjects lastObject]; 137 | if (obj) { 138 | //二维码信息回传 139 | //NSLog(@">>>>>>>>>>>>%@>>>>",[obj stringValue]); 140 | if (self.scanResult) { 141 | self.scanResult([obj stringValue]); 142 | } 143 | 144 | } 145 | } 146 | } 147 | 148 | 149 | #pragma mark -扫描中判断环境的黑暗程度 150 | - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ 151 | 152 | if (self.lightSensationShouldOpen == nil) { 153 | return; 154 | } 155 | 156 | CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL,sampleBuffer, kCMAttachmentMode_ShouldPropagate); 157 | NSDictionary *metadata = [[NSMutableDictionary alloc] initWithDictionary:(__bridge NSDictionary*)metadataDict]; 158 | CFRelease(metadataDict); 159 | NSDictionary *exifMetadata = [[metadata objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy]; 160 | float brightnessValue = [[exifMetadata objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue] floatValue]; 161 | 162 | // NSLog(@"环境光感 : %f",brightnessValue); 163 | 164 | // 根据brightnessValue的值来判断是否需要打开和关闭闪光灯 165 | AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 166 | BOOL result = [device hasTorch];// 判断设备是否有闪光灯 167 | if ((brightnessValue < 0) && result) { 168 | // 环境太暗,可以打开闪光灯了 169 | if (self.lightSensationShouldOpen) { 170 | self.lightSensationShouldOpen(YES); 171 | } 172 | }else if((brightnessValue > 0) && result){ 173 | // 环境亮度可以 174 | if (self.lightSensationShouldOpen) { 175 | self.lightSensationShouldOpen(NO); 176 | } 177 | } 178 | 179 | } 180 | 181 | #pragma mark -缩放手势 182 | - (void)pinch:(UIPinchGestureRecognizer *)gesture { 183 | 184 | AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 185 | 186 | CGFloat minZoomFactor = 1.0; 187 | CGFloat maxZoomFactor = device.activeFormat.videoMaxZoomFactor; 188 | 189 | if (@available(iOS 11.0, *)) { 190 | minZoomFactor = device.minAvailableVideoZoomFactor; 191 | maxZoomFactor = device.maxAvailableVideoZoomFactor; 192 | } 193 | 194 | static CGFloat lastZoomFactor = 1.0; 195 | if (gesture.state == UIGestureRecognizerStateBegan) { 196 | lastZoomFactor = device.videoZoomFactor; 197 | } 198 | else if (gesture.state == UIGestureRecognizerStateChanged) { 199 | CGFloat zoomFactor = lastZoomFactor * gesture.scale; 200 | zoomFactor = fmaxf(fminf(zoomFactor, maxZoomFactor), minZoomFactor); 201 | [device lockForConfiguration:nil]; 202 | device.videoZoomFactor = zoomFactor; 203 | [device unlockForConfiguration]; 204 | } 205 | } 206 | 207 | 208 | 209 | #pragma mark -相册调用 读取相册中的二维码图片 210 | - (void)presentPhotoLibraryReadQRCodeImageWithRooterVC:(UIViewController *)rootVC ReadResult:(PhotoCodeImageReadResult)readResult{ 211 | self.readResult=readResult; 212 | 213 | if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){ 214 | UIImagePickerController * imagePicker = [[UIImagePickerController alloc] init]; 215 | imagePicker.delegate = self; 216 | imagePicker.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 217 | imagePicker.allowsEditing = YES; 218 | imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 219 | [rootVC presentViewController:imagePicker animated:YES completion:nil]; 220 | }else{ 221 | [QRCodeScanTools showAlert:@"不支持访问相册" Target:rootVC]; 222 | } 223 | } 224 | 225 | #pragma mark - UIImagePickerControllerDelegate 226 | - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 227 | 228 | UIImage *pickedImage = info[UIImagePickerControllerEditedImage] ?: info[UIImagePickerControllerOriginalImage]; 229 | CIImage *codeImage = [CIImage imageWithData:UIImagePNGRepresentation(pickedImage)]; 230 | // CIImage *codeImage = [CIImage imageWithCGImage:pickedImage.CGImage]; 231 | 232 | CIContext *codeContext = [CIContext contextWithOptions:nil]; 233 | //检测图片中的二维码,并设置检测精度为高 234 | CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:codeContext options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}]; 235 | 236 | //读取图片的qrcode特性 获取识别结果 237 | NSArray *features = [detector featuresInImage:codeImage options:nil]; 238 | //返回的结果,只读取一条 239 | NSString *resultString=@""; 240 | if (features && features.count > 0) { 241 | for (CIQRCodeFeature *codeFeature in features) { 242 | if (resultString.length > 0) { 243 | break; 244 | } 245 | resultString = codeFeature.messageString; 246 | } 247 | }else{ 248 | NSLog(@"无法识别图中二维码"); 249 | } 250 | 251 | [picker dismissViewControllerAnimated:YES completion:^{ 252 | if (self.readResult) { 253 | self.readResult(resultString); 254 | } 255 | }]; 256 | } 257 | 258 | 259 | 260 | @end 261 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScanTools.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanTools.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/9. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | #import 13 | #import "QRCodeScanHeader.h" 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @interface QRCodeScanTools : NSObject 18 | 19 | /** 20 | 验证用户是否开启相机并跳转 21 | 22 | @param VC 当前VC 23 | @param scanVC 要跳转的扫描VC 24 | */ 25 | + (void)permitCameraWithTarget:(UIViewController *)VC PushScanView:(UIViewController *)scanVC; 26 | 27 | /** 28 | *是否开启系统照明灯 29 | *@param opened 是否打开 30 | */ 31 | + (void)openLight:(BOOL)opened; 32 | 33 | /** 34 | *是否开启系统震动和声音 35 | *@param shaked 是否开启震动 36 | *@param sounding 是否开启声音 37 | */ 38 | + (void)openShake:(BOOL)shaked Sound:(BOOL)sounding; 39 | 40 | 41 | /** 42 | 语音播放文字内容 43 | */ 44 | + (void)soundsPlayer:(NSString *)soundsStr; 45 | 46 | 47 | /** 48 | 过渡动画 由内向外扩张 49 | 50 | */ 51 | + (CAKeyframeAnimation *)zoomOutAnimation; 52 | 53 | /** 54 | 打开系统设置 55 | */ 56 | + (void)openSystemSettings; 57 | 58 | 59 | 60 | + (void)alertActionWithTitle:(NSString *)title Message:(NSString *)message actionHandler:(void (^ __nullable)(UIAlertAction *action))handler Target:(UIViewController *)viewController; 61 | + (void)showAlert:(NSString *)message Target:(UIViewController *)viewController; 62 | 63 | @end 64 | 65 | NS_ASSUME_NONNULL_END 66 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScanTools.m: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanTools.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/9. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import "QRCodeScanTools.h" 10 | #import "QRCodeBundle.h" 11 | 12 | /** app名字 */ 13 | #define APP_NAME [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleDisplayName"] 14 | /** 设备类型 返回 iPhone或当前其他设备 */ 15 | #define DEVICE_TYPE [UIDevice currentDevice].model 16 | #define kIOS8_OR_LATER ([[[UIDevice currentDevice] systemVersion] compare:@"8" options:NSNumericSearch] != NSOrderedAscending) 17 | 18 | @implementation QRCodeScanTools 19 | 20 | + (void)permitCameraWithTarget:(UIViewController *)VC PushScanView:(UIViewController *)scanVC{ 21 | 22 | AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 23 | if (device) { 24 | AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; 25 | if (status == AVAuthorizationStatusNotDetermined) { 26 | [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { 27 | if (granted) {// 用户第一次同意了访问相机权限 28 | dispatch_async(dispatch_get_main_queue(), ^{ 29 | [VC.navigationController pushViewController:scanVC animated:YES]; 30 | }); 31 | } else { 32 | // 用户第一次拒绝了访问相机权限 33 | dispatch_async(dispatch_get_main_queue(), ^{ 34 | [self alertActionWithTitle:@"提示" Message:[NSString stringWithFormat:@"请在%@的\"设置-隐私-相机\"选项中,\r允许%@访问你的相机。",DEVICE_TYPE,APP_NAME] actionHandler:^(UIAlertAction *action) { 35 | [self openSystemSettings]; 36 | } Target:VC]; 37 | }); 38 | } 39 | }]; 40 | } else if (status == AVAuthorizationStatusAuthorized) { // 用户允许当前应用访问相机 41 | dispatch_async(dispatch_get_main_queue(), ^{ 42 | [VC.navigationController pushViewController:scanVC animated:YES]; 43 | }); 44 | } else if (status == AVAuthorizationStatusDenied) { // 用户拒绝当前应用访问相机 45 | dispatch_async(dispatch_get_main_queue(), ^{ 46 | [self alertActionWithTitle:@"提示" Message:[NSString stringWithFormat:@"请在%@的\"设置-隐私-相机\"选项中,\r允许%@访问你的相机。",DEVICE_TYPE,APP_NAME] actionHandler:^(UIAlertAction *action) { 47 | [self openSystemSettings]; 48 | } Target:VC]; 49 | }); 50 | 51 | 52 | } else if (status == AVAuthorizationStatusRestricted) { 53 | NSLog(@"因为系统原因, 无法访问相册"); 54 | } 55 | } else { 56 | dispatch_async(dispatch_get_main_queue(), ^{ 57 | [self showAlert:@"未检测到您的摄像头" Target:VC]; 58 | }); 59 | } 60 | } 61 | 62 | + (void)openLight:(BOOL)opened { 63 | AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo]; 64 | if (![device hasTorch]) { 65 | } else { 66 | if (opened) { 67 | // 开启闪光灯 68 | if(device.torchMode != AVCaptureTorchModeOn || 69 | device.flashMode != AVCaptureFlashModeOn){ 70 | [device lockForConfiguration:nil]; 71 | [device setTorchMode:AVCaptureTorchModeOn]; 72 | [device setFlashMode:AVCaptureFlashModeOn]; 73 | [device unlockForConfiguration]; 74 | } 75 | } else { 76 | // 关闭闪光灯 77 | if(device.torchMode != AVCaptureTorchModeOff || 78 | device.flashMode != AVCaptureFlashModeOff){ 79 | [device lockForConfiguration:nil]; 80 | [device setTorchMode:AVCaptureTorchModeOff]; 81 | [device setFlashMode:AVCaptureFlashModeOff]; 82 | [device unlockForConfiguration]; 83 | } 84 | } 85 | } 86 | } 87 | 88 | + (void)openShake:(BOOL)shaked Sound:(BOOL)sounding { 89 | if (shaked) { 90 | //开启系统震动 91 | AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); 92 | } 93 | if (sounding) { 94 | // AudioServicesPlaySystemSound(1360);//系统声音 95 | 96 | //设置自定义声音 97 | NSString *path = [[QRCodeBundle bundle] pathForResource:@"QRCodeScan" ofType:@"bundle"]; 98 | SystemSoundID soundID; 99 | AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:[path stringByAppendingPathComponent:@"scan_ring.wav"]], &soundID); 100 | AudioServicesPlaySystemSound(soundID); 101 | } 102 | } 103 | 104 | + (void)soundsPlayer:(NSString *)soundsStr 105 | { 106 | if(soundsStr && soundsStr.length > 0){ 107 | AVSpeechSynthesizer *player = [[AVSpeechSynthesizer alloc]init]; 108 | AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc]initWithString:soundsStr];//设置语音内容 109 | utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];//设置语言 110 | // utterance.rate = 0.1; //设置语速 111 | utterance.volume = 1; //设置音量(0.0~1.0)默认为1.0 112 | utterance.pitchMultiplier = 1; //设置语调 (0.5-2.0) 113 | utterance.postUtteranceDelay = 1; //目的是让语音合成器播放下一语句前有短暂的暂停 114 | [player speakUtterance:utterance]; 115 | } 116 | } 117 | 118 | + (CAKeyframeAnimation *)zoomOutAnimation { 119 | CAKeyframeAnimation *animationLayer = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 120 | animationLayer.duration = 0.1; 121 | 122 | NSMutableArray *values = [NSMutableArray array]; 123 | [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]]; 124 | [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]]; 125 | animationLayer.values = values; 126 | 127 | return animationLayer; 128 | } 129 | 130 | 131 | #warning 使用openURL前添加scheme:prefs 132 | + (void)openSystemSettings { 133 | [[UIApplication sharedApplication] openURL:[NSURL URLWithString:kIOS8_OR_LATER ? UIApplicationOpenSettingsURLString : @"prefs:root"]]; 134 | } 135 | 136 | 137 | 138 | 139 | 140 | #pragma mark -弹窗 141 | + (void)alertActionWithTitle:(NSString *)title Message:(NSString *)message actionHandler:(void (^ __nullable)(UIAlertAction *action))handler Target:(UIViewController *)viewController 142 | { 143 | UIAlertController *alert=[UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; 144 | UIAlertAction *confirm=[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:handler]; 145 | [alert addAction:confirm]; 146 | 147 | UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消"style:UIAlertActionStyleCancel handler:nil]; 148 | [alert addAction:cancel]; 149 | [viewController presentViewController:alert animated:YES completion:nil]; 150 | } 151 | 152 | + (void)showAlert:(NSString *)message Target:(UIViewController *)viewController 153 | { 154 | UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert]; 155 | UIAlertAction *confirm=[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:nil]; 156 | [alert addAction:confirm]; 157 | [viewController presentViewController:alert animated:YES completion:nil]; 158 | } 159 | 160 | @end 161 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScanView.h: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanView.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/10. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "UIView+QRCodeExt.h" 11 | #import "UIImage+QRCodeExt.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | typedef enum : NSUInteger { 16 | ScanToInput,//扫描切换至输入 17 | InputToScan,//输入切换至扫描 18 | } ScanViewAnimationTransform; 19 | 20 | @interface QRCodeScanView : UIView 21 | 22 | /** 是否显示扫描输入切换按钮 默认NO */ 23 | @property (nonatomic,assign) BOOL showScanInputExchange; 24 | 25 | /** 添加并开启扫描线运动动画 */ 26 | - (void)addLineAnimateLoop; 27 | /** 停止并移除扫描线运动动画 */ 28 | - (void)removeLineAnimateLoop; 29 | 30 | /** 文本输入结果 */ 31 | @property (nonatomic,copy) void (^textInputResult)(NSString *inputResult); 32 | 33 | /** 扫描输入样式切换 ScanToInput->需停止扫描session ; InputToScan-> 需开启扫描session */ 34 | @property (nonatomic,copy) void (^scanViewTransformExchange)(ScanViewAnimationTransform transformType); 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/QRCodeScanView.m: -------------------------------------------------------------------------------- 1 | // 2 | // QRCodeScanView.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2019/12/10. 6 | // Copyright © 2019 singularity. All rights reserved. 7 | // 8 | 9 | #import "QRCodeScanView.h" 10 | #import "QRCodeScanHeader.h" 11 | #import "QRCodeScanTools.h" 12 | 13 | 14 | @interface QRCodeScanView () 15 | 16 | /**计时器*/ 17 | @property (strong, nonatomic) CADisplayLink *link; 18 | /**实际有效扫描区域的背景图(亦或者自己设置一个边框)*/ 19 | @property (strong, nonatomic) UIImageView *bgImg; 20 | /**有效扫描区域循环往返的一条线(这里用的是一个背景图)*/ 21 | @property (strong, nonatomic) UIImageView *scrollLine; 22 | /**扫码有效区域外自加的文字提示*/ 23 | @property (strong, nonatomic) UILabel *tip; 24 | /**用于记录scrollLine的上下循环状态*/ 25 | @property (assign, nonatomic) BOOL lineAnimateUp; 26 | /** 遮盖图层 */ 27 | @property (nonatomic,weak) CAShapeLayer *shapeLayer; 28 | /** 遮盖视图 */ 29 | @property (nonatomic,strong) UIView *maskView; 30 | /** 切换按钮 */ 31 | @property (nonatomic,strong) UIButton *switchBtn; 32 | /** 手动输入框 */ 33 | @property (nonatomic,strong) UITextField *codeNumText; 34 | @property (nonatomic,strong) UIView *codeTextView; 35 | 36 | @end 37 | 38 | @implementation QRCodeScanView 39 | 40 | - (instancetype)initWithFrame:(CGRect)frame{ 41 | self=[super initWithFrame:frame]; 42 | if (self) { 43 | 44 | self.lineAnimateUp = YES; 45 | [self setScanView]; 46 | [self setMaskViewShapeLayer]; 47 | } 48 | return self; 49 | } 50 | 51 | 52 | - (void)setScanView{ 53 | 54 | //添加一个可见的扫描有效区域的框(这里直接是设置一个背景图片) 55 | [self addSubview:self.bgImg]; 56 | //添加一个上下循环运动的线条(这里直接是添加一个背景图片来运动) 57 | [self addSubview:self.scrollLine]; 58 | //添加遮罩图层 59 | [self addSubview:self.maskView]; 60 | //添加其他有效控件 61 | [self addSubview:self.tip]; 62 | [self addSubview:self.switchBtn]; 63 | } 64 | 65 | 66 | - (void)setMaskViewShapeLayer{ 67 | //设置中空区域,即有效扫描区域(中间扫描区域透明度比周边要低的效果)绘制黑色底框 中空正方形 68 | CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 69 | shapeLayer.path = [self scanPath].CGPath; 70 | self.maskView.layer.mask = shapeLayer; 71 | _shapeLayer=shapeLayer; 72 | } 73 | 74 | 75 | 76 | - (void)setShowScanInputExchange:(BOOL)showScanInputExchange{ 77 | _showScanInputExchange=showScanInputExchange; 78 | self.switchBtn.hidden=!showScanInputExchange; 79 | } 80 | 81 | 82 | - (void)addLineAnimateLoop{ 83 | [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 84 | } 85 | 86 | - (void)removeLineAnimateLoop{ 87 | [self.link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 88 | } 89 | 90 | 91 | #pragma mark -扫描区域动画类型转换 92 | - (void)setScanTypeTransform:(ScanViewAnimationTransform)transformType 93 | { 94 | [_shapeLayer addAnimation:[self animationType:transformType] forKey:@"animate"]; 95 | _maskView.layer.mask = _shapeLayer; 96 | } 97 | 98 | #pragma mark -动画切换样式 99 | - (CAKeyframeAnimation *)animationType:(ScanViewAnimationTransform)animationType{ 100 | CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"path"]; 101 | if (animationType==ScanToInput) {//从扫描到输入 102 | keyframeAnimation.values = @[(__bridge id)[self scanPath].CGPath, 103 | (__bridge id)[self inputPath].CGPath]; 104 | }else{//从输入到扫描 105 | keyframeAnimation.values = @[(__bridge id)[self inputPath].CGPath, 106 | (__bridge id)[self scanPath].CGPath]; 107 | } 108 | // keyframeAnimation.keyTimes = @[@(0.0), @(0.3), @(0.5), @(0.75), @(0.9)]; 109 | keyframeAnimation.fillMode = kCAFillModeForwards; 110 | keyframeAnimation.removedOnCompletion = NO; 111 | keyframeAnimation.duration = 0.5; 112 | return keyframeAnimation; 113 | } 114 | 115 | - (UIBezierPath *)scanPath{ 116 | UIBezierPath *rectPath = [UIBezierPath bezierPathWithRect:self.bounds]; 117 | [rectPath appendPath:[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(QRCode_BarBGImgX, QRCode_BarBGImgY, QRCode_BarBGImgWidth, QRCode_BarBGImgHeight) cornerRadius:1] bezierPathByReversingPath]]; 118 | return rectPath; 119 | } 120 | 121 | - (UIBezierPath *)inputPath{ 122 | UIBezierPath *rectPath = [UIBezierPath bezierPathWithRect:self.bounds]; 123 | [rectPath appendPath:[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(QRCode_BarBGImgX, QRCode_BarBGImgY, QRCode_BarBGImgWidth, QRCode_InputTextHeight) cornerRadius:1] bezierPathByReversingPath]]; 124 | return rectPath; 125 | } 126 | 127 | 128 | #pragma mark -输入结果 129 | - (BOOL)textFieldShouldReturn:(UITextField *)textField{ 130 | [textField resignFirstResponder]; 131 | if (self.textInputResult) { 132 | self.textInputResult(textField.text); 133 | } 134 | return YES; 135 | } 136 | 137 | 138 | #pragma mark -切换状态 139 | - (void)exchangeSacnClick:(UIButton *)sender{ 140 | sender.selected=!sender.selected; 141 | if (!sender.selected) {//扫描 142 | [UIView animateWithDuration:0.5 animations:^{ 143 | [UIView setAnimationCurve:UIViewAnimationCurveLinear];//均匀线性动画 144 | self.bgImg.frame=CGRectMake(QRCode_BarBGImgX, QRCode_BarBGImgY, QRCode_BarBGImgWidth, QRCode_BarBGImgHeight); 145 | [self setScanTypeTransform:InputToScan]; 146 | [self.codeTextView removeFromSuperview]; 147 | [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 148 | self.switchBtn.frame=CGRectMake(QRCode_SCREEN_WIDTH/2-59, QRCode_MaxY(self.bgImg)+16, 118, 32); 149 | } completion:^(BOOL finished) { 150 | [self.codeNumText resignFirstResponder]; 151 | [self addSubview:self.scrollLine]; 152 | [self addSubview:self.tip]; 153 | if (self.scanViewTransformExchange) { 154 | self.scanViewTransformExchange(InputToScan); 155 | } 156 | }]; 157 | 158 | }else{//手动输入 159 | [UIView animateWithDuration:0.5 animations:^{ 160 | [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 161 | self.bgImg.frame=CGRectMake(QRCode_BarBGImgX, QRCode_BarBGImgY, QRCode_BarBGImgWidth, QRCode_InputTextHeight); 162 | [self setScanTypeTransform:ScanToInput]; 163 | [self.link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 164 | [self.scrollLine removeFromSuperview]; 165 | [self.tip removeFromSuperview]; 166 | self.switchBtn.frame=CGRectMake(QRCode_SCREEN_WIDTH/2-59, QRCode_MaxY(self.bgImg)+16, 118, 32); 167 | 168 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.45 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 169 | [self addSubview:self.codeTextView]; 170 | }); 171 | } completion:^(BOOL finished) { 172 | [self.codeNumText becomeFirstResponder]; 173 | if (self.scanViewTransformExchange) { 174 | self.scanViewTransformExchange(ScanToInput); 175 | } 176 | }]; 177 | 178 | } 179 | } 180 | 181 | 182 | #pragma mark - 线条运动的动画 183 | - (void)LineAnimation { 184 | if (self.lineAnimateUp) { 185 | CGFloat y = self.scrollLine.frame.origin.y; 186 | y += 2; 187 | [self.scrollLine setQRCode_y:y]; 188 | if (y >= (QRCode_BarBGImgY+QRCode_BarBGImgHeight-QRCode_ScrollLineHeight)) { 189 | self.lineAnimateUp = NO; 190 | } 191 | }else{ 192 | CGFloat y = self.scrollLine.frame.origin.y; 193 | y -= 2; 194 | [self.scrollLine setQRCode_y:y]; 195 | if (y <= QRCode_BarBGImgY) { 196 | self.lineAnimateUp = YES; 197 | } 198 | } 199 | } 200 | 201 | #pragma mark -基础视图 202 | - (UIImageView *)bgImg { 203 | if (!_bgImg) { 204 | _bgImg = [[UIImageView alloc]initWithFrame:CGRectMake(QRCode_BarBGImgX, QRCode_BarBGImgY, QRCode_BarBGImgWidth, QRCode_BarBGImgHeight)]; 205 | _bgImg.image = [UIImage QRCodeImageNamed:@"scan_scanFrame"]; 206 | } 207 | return _bgImg; 208 | } 209 | 210 | - (UIImageView *)scrollLine { 211 | if (!_scrollLine) { 212 | _scrollLine = [[UIImageView alloc]initWithFrame:CGRectMake(QRCode_BarBGImgX, QRCode_BarBGImgY, QRCode_BarBGImgWidth, QRCode_ScrollLineHeight)]; 213 | _scrollLine.image = [UIImage QRCodeImageNamed:@"scan_scanLine"]; 214 | } 215 | return _scrollLine; 216 | } 217 | 218 | - (UILabel *)tip { 219 | if (!_tip) { 220 | _tip = [[UILabel alloc]initWithFrame:CGRectMake(QRCode_BarBGImgX, QRCode_BarTipY, QRCode_BarBGImgWidth, QRCode_BarTipHeight)]; 221 | _tip.text = @"二维码/条形码扫描"; 222 | _tip.numberOfLines = 0; 223 | _tip.textColor = [UIColor whiteColor]; 224 | _tip.textAlignment = NSTextAlignmentCenter; 225 | _tip.font = [UIFont systemFontOfSize:13]; 226 | } 227 | return _tip; 228 | } 229 | 230 | - (UIButton *)switchBtn{ 231 | if (!_switchBtn) { 232 | _switchBtn=[UIButton new]; 233 | _switchBtn.titleLabel.font=[UIFont systemFontOfSize:13]; 234 | [_switchBtn setTitle:@" 切换手动输入" forState:UIControlStateNormal]; 235 | [_switchBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 236 | [_switchBtn addTarget:self action:@selector(exchangeSacnClick:) forControlEvents:UIControlEventTouchUpInside]; 237 | _switchBtn.frame=CGRectMake(QRCode_SCREEN_WIDTH/2-59, QRCode_MaxY(_bgImg)+16, 118, 32); 238 | _switchBtn.backgroundColor=[[UIColor whiteColor]colorWithAlphaComponent:0.35]; 239 | [_switchBtn setImage:[UIImage QRCodeImageNamed:@"scan_exchange"] forState:UIControlStateNormal]; 240 | [_switchBtn setTitle:@" 切换至扫描" forState:UIControlStateSelected]; 241 | _switchBtn.layer.masksToBounds=YES; 242 | _switchBtn.layer.cornerRadius=16.5; 243 | _switchBtn.selected=NO; 244 | _switchBtn.hidden=YES; 245 | } 246 | return _switchBtn; 247 | } 248 | 249 | - (UIView *)codeTextView{ 250 | if (!_codeTextView) { 251 | _codeTextView=[[UIView alloc]initWithFrame:CGRectMake(QRCode_BarBGImgX+1, QRCode_BarBGImgY+1, QRCode_BarBGImgWidth-2, QRCode_InputTextHeight-2)]; 252 | _codeTextView.backgroundColor=[QRCode_BLACK_COLOR colorWithAlphaComponent:0.75]; 253 | 254 | _codeNumText=[UITextField new]; 255 | _codeNumText.placeholder=@"二维码/条形码"; 256 | _codeNumText.font=[UIFont systemFontOfSize:15]; 257 | _codeNumText.textColor=[UIColor whiteColor]; 258 | _codeNumText.attributedPlaceholder = [[NSAttributedString alloc] initWithString:_codeNumText.placeholder attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]; 259 | _codeNumText.frame=CGRectMake(15, 0, _codeTextView.QRCode_width-15, _codeTextView.QRCode_height); 260 | _codeNumText.clearButtonMode=UITextFieldViewModeWhileEditing; 261 | _codeNumText.returnKeyType=UIReturnKeySearch; 262 | _codeNumText.delegate=self; 263 | [_codeTextView addSubview:self.codeNumText]; 264 | } 265 | return _codeTextView; 266 | } 267 | 268 | 269 | - (CADisplayLink *)link { 270 | if (!_link) { 271 | _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(LineAnimation)]; 272 | } 273 | return _link; 274 | } 275 | 276 | - (UIView *)maskView{ 277 | if (!_maskView) { 278 | _maskView = [[UIView alloc] initWithFrame:self.bounds]; 279 | _maskView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:QRCode_BGAlpha]; 280 | } 281 | return _maskView; 282 | } 283 | 284 | 285 | 286 | @end 287 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/UIImage+QRCodeExt.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+QRCodeExt.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2021/9/13. 6 | // Copyright © 2021 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface UIImage (QRCodeExt) 14 | 15 | + (UIImage *)QRCodeImageNamed:(NSString *)imgName; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/UIImage+QRCodeExt.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+QRCodeExt.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2021/9/13. 6 | // Copyright © 2021 singularity. All rights reserved. 7 | // 8 | 9 | #import "UIImage+QRCodeExt.h" 10 | #import "QRCodeBundle.h" 11 | 12 | @implementation UIImage (QRCodeExt) 13 | 14 | + (UIImage *)QRCodeImageNamed:(NSString *)imgName { 15 | NSString *path = [[QRCodeBundle bundle] pathForResource:@"QRCodeScan" ofType:@"bundle"]; 16 | NSString *imagePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",imgName]]; 17 | return [UIImage imageWithContentsOfFile:imagePath]; 18 | } 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/UIView+QRCodeExt.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+QRCodeExt.h 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2021/9/13. 6 | // Copyright © 2021 singularity. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface UIView (QRCodeExt) 14 | 15 | @property (nonatomic, assign) CGSize QRCode_size; 16 | @property (nonatomic, assign) CGFloat QRCode_width; 17 | @property (nonatomic, assign) CGFloat QRCode_height; 18 | @property (nonatomic, assign) CGFloat QRCode_x; 19 | @property (nonatomic, assign) CGFloat QRCode_y; 20 | @property (nonatomic, assign) CGFloat QRCode_centerX; 21 | @property (nonatomic, assign) CGFloat QRCode_centerY; 22 | 23 | @property CGFloat QRCode_top; 24 | @property CGFloat QRCode_left; 25 | 26 | @property CGFloat QRCode_bottom; 27 | @property CGFloat QRCode_right; 28 | 29 | @end 30 | 31 | NS_ASSUME_NONNULL_END 32 | -------------------------------------------------------------------------------- /QRCodeScan/Classes/UIView+QRCodeExt.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+QRCodeExt.m 3 | // QRCodeScan 4 | // 5 | // Created by 李雪阳 on 2021/9/13. 6 | // Copyright © 2021 singularity. All rights reserved. 7 | // 8 | 9 | #import "UIView+QRCodeExt.h" 10 | 11 | @implementation UIView (QRCodeExt) 12 | 13 | - (void)setQRCode_size:(CGSize)QRCode_size 14 | { 15 | CGRect frame = self.frame; 16 | frame.size = QRCode_size; 17 | self.frame = frame; 18 | } 19 | 20 | - (CGSize)QRCode_size 21 | { 22 | return self.frame.size; 23 | } 24 | 25 | - (void)setQRCode_width:(CGFloat)QRCode_width 26 | { 27 | CGRect frame = self.frame; 28 | frame.size.width = QRCode_width; 29 | self.frame = frame; 30 | } 31 | 32 | - (void)setQRCode_height:(CGFloat)QRCode_height 33 | { 34 | CGRect frame = self.frame; 35 | frame.size.height = QRCode_height; 36 | self.frame = frame; 37 | } 38 | 39 | - (void)setQRCode_x:(CGFloat)QRCode_x 40 | { 41 | CGRect frame = self.frame; 42 | frame.origin.x = QRCode_x; 43 | self.frame = frame; 44 | } 45 | 46 | - (void)setQRCode_y:(CGFloat)QRCode_y 47 | { 48 | CGRect frame = self.frame; 49 | frame.origin.y = QRCode_y; 50 | self.frame = frame; 51 | } 52 | 53 | - (void)setQRCode_centerX:(CGFloat)QRCode_centerX 54 | { 55 | CGPoint center = self.center; 56 | center.x = QRCode_centerX; 57 | self.center = center; 58 | } 59 | 60 | - (void)setQRCode_centerY:(CGFloat)QRCode_centerY 61 | { 62 | CGPoint center = self.center; 63 | center.y = QRCode_centerY; 64 | self.center = center; 65 | } 66 | 67 | - (CGFloat)QRCode_centerY 68 | { 69 | return self.center.y; 70 | } 71 | 72 | - (CGFloat)QRCode_centerX 73 | { 74 | return self.center.x; 75 | } 76 | 77 | - (CGFloat)QRCode_width 78 | { 79 | return self.frame.size.width; 80 | } 81 | 82 | - (CGFloat)QRCode_height 83 | { 84 | return self.frame.size.height; 85 | } 86 | 87 | - (CGFloat)QRCode_x 88 | { 89 | return self.frame.origin.x; 90 | } 91 | 92 | - (CGFloat)QRCode_y 93 | { 94 | return self.frame.origin.y; 95 | } 96 | 97 | - (CGFloat)QRCode_top 98 | { 99 | return self.frame.origin.y; 100 | } 101 | 102 | - (void)setQRCode_top:(CGFloat)QRCode_top 103 | { 104 | CGRect newframe = self.frame; 105 | newframe.origin.y = QRCode_top; 106 | self.frame = newframe; 107 | } 108 | 109 | - (CGFloat)QRCode_left 110 | { 111 | return self.frame.origin.x; 112 | } 113 | 114 | - (void)setQRCode_left:(CGFloat)QRCode_left 115 | { 116 | CGRect newframe = self.frame; 117 | newframe.origin.x = QRCode_left; 118 | self.frame = newframe; 119 | } 120 | 121 | - (CGFloat)QRCode_bottom 122 | { 123 | return self.frame.origin.y + self.frame.size.height; 124 | } 125 | 126 | - (void)setQRCode_bottom:(CGFloat)QRCode_bottom 127 | { 128 | CGRect newframe = self.frame; 129 | newframe.origin.y = QRCode_bottom - self.frame.size.height; 130 | self.frame = newframe; 131 | } 132 | 133 | - (CGFloat)QRCode_right 134 | { 135 | return self.frame.origin.x + self.frame.size.width; 136 | } 137 | 138 | - (void)setQRCode_right:(CGFloat)QRCode_right 139 | { 140 | CGFloat delta = QRCode_right - (self.frame.origin.x + self.frame.size.width); 141 | CGRect newframe = self.frame; 142 | newframe.origin.x += delta ; 143 | self.frame = newframe; 144 | } 145 | 146 | @end 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QRCodeScan 2 | 3 | 4 | ![参考](https://github.com/XueYangLee/QRCodeScan/blob/master/screen.GIF) 5 | 6 | 二维码/条形码的扫描及扫描与输入形式的切换 7 | ``` 8 | 相机扫描 9 | _scanManager=[[QRCodeScanManager alloc]initWithPreviewLayerSuperView:self.view ScanResult:^(NSString * _Nonnull scanResult) { 10 | 11 | [QRCodeScanTools openShake:YES Sound:YES]; 12 | if ([weakSelf.scanManager sessionIsRunning]) { 13 | [weakSelf.scanManager sessionStopRunning]; 14 | [weakSelf.scanView removeLineAnimateLoop]; 15 | } 16 | [weakSelf QRCodeResult:scanResult]; 17 | }]; 18 | 19 | 20 | 相册调用 21 | [self.scanManager presentPhotoLibraryReadQRCodeImageWithRooterVC:self ReadResult:^(NSString * _Nonnull readResult) { 22 | [self QRCodeResult:readResult]; 23 | }]; 24 | 25 | ``` 26 | 27 | 二维码的生成 28 | ``` 29 | 生成普通二维码 30 | - (void)setDefaultQRCode{ 31 | UIImageView *code=[[UIImageView alloc]initWithFrame:CGRectMake(10, 90, 100, 100)]; 32 | code.image=[QRCodeGenerateTools generateWithDefaultQRCodeData:@"https://github.com/XueYangLee/QRCodeScan" imageViewWidth:100]; 33 | [self.view addSubview:code]; 34 | } 35 | 36 | 生成带图片二维码 37 | - (void)setLogoQRCode{ 38 | UIImageView *code=[[UIImageView alloc]initWithFrame:CGRectMake(10, 200, 100, 100)]; 39 | code.image=[QRCodeGenerateTools generateWithLogoQRCodeData:@"https://github.com/XueYangLee/QRCodeScan" logoImageName:@"scan_photo" logoScaleToSuperView:0.2]; 40 | [self.view addSubview:code]; 41 | } 42 | 43 | 生成彩色二维码 44 | - (void)setColorQRCode{ 45 | UIImageView *code=[[UIImageView alloc]initWithFrame:CGRectMake(10, 310, 100, 100)]; 46 | code.image=[QRCodeGenerateTools generateWithColorQRCodeData:@"https://github.com/XueYangLee/QRCodeScan" backgroundColor:[CIColor blueColor] mainColor:[CIColor yellowColor]]; 47 | [self.view addSubview:code]; 48 | } 49 | ``` 50 | 51 | 52 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /screen.GIF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XueYangLee/QRCodeScan/8167b76e0a0fb25555258aff2b3f7f6ffb3e46fa/screen.GIF --------------------------------------------------------------------------------