File: README.md
EFQRCode is a lightweight, pure-Swift library for generating stylized QRCode images with watermark or icon, and for recognizing QRCode from images, inspired by qrcode and react-qrbtf. Based on CoreGraphics, CoreImage, and ImageIO, EFQRCode provides you a better way to handle QRCode in your app, no matter if it is on iOS, macOS, watchOS, tvOS, and/or visionOS. You can integrate EFQRCode through CocoaPods, Carthage, and/or Swift Package Manager.
Examples
|||
:---------------------:|:---------------------:|:---------------------:|:---------------------:
|||
|||
Demo Projects
App Store
You can click the App Store button below to download demo, support iOS, tvOS and watchOS:
You can also click the Mac App Store button below to download demo for macOS:
Compile Demo Manually
To run the example project manually, clone the repo, demos are in the 'Examples' folder, then open EFQRCode.xcworkspace with Xcode and select the target you want, run.
Or you can run the following command in terminal:
git clone [email protected]:EFPrefix/EFQRCode.git; cd EFQRCode; open 'EFQRCode.xcworkspace'Requirements
iOS 13.0+ / macOS 10.15+ / tvOS 13.0+ / watchOS 6.0+ / visionOS 1.0+
Installation
CocoaPods
EFQRCode is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'EFQRCode', '~> 7.0.3'Then, run the following command:
$ pod installCarthage
Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
You can install Carthage with Homebrew using the following command:
$ brew update
$ brew install carthageTo integrate EFQRCode into your Xcode project using Carthage, specify it in your Cartfile:
github "EFPrefix/EFQRCode" ~> 7.0.3Run carthage update to build the framework and drag the built EFQRCode.framework into your Xcode project.
Swift Package Manager
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the Swift compiler.
Once you have your Swift package set up, adding EFQRCode as a dependency is as easy as adding it to the dependencies value of your Package.swift.
dependencies: [
.package(url: "https://github.com/EFPrefix/EFQRCode.git", .upToNextMinor(from: "7.0.3"))
]Quick Start
1. Import EFQRCode
Import EFQRCode module where you want to use it:
import EFQRCode2. Recognition
A String Array is returned as there might be several QR Codes in a single CGImage:
if let testImage = UIImage(named: "test.png")?.cgImage {
let codes = EFQRCode.Recognizer(image: testImage).recognize()
if !codes.isEmpty {
print("There are \(codes.count) codes")
for (index, code) in codes.enumerated() {
print("The content of QR Code \(index) is \(code).")
}
} else {
print("There is no QR Codes in testImage.")
}
}3. Generation
3.1 Create QR Code with static image
let generator = try? EFQRCode.Generator("https://github.com/EFPrefix/EFQRCode", style: .image(
params: .init(image: .init(image: .static(image: UIImage(named: "WWF")?.cgImage!), allowTransparent: true)))
)
if let image = try? generator?.toImage(width: 180).cgImage {
print("Create QRCode image success \(image)")
} else {
print("Create QRCode image failed!")
}Result:
3.2 Generation from animated images
You can create a dynamic QR code by passing in a sequence of animated images. The usage method is as follows:
let generator = try? EFQRCode.Generator("https://github.com/EFPrefix/EFQRCode", style: .image(
params: .init(image: .init(image: .animated(images: cgImages, imageDelays: cgImageDelays))))
)
if let imageData = try? generator?.toGIFData(width: 512) {
print("Create QRCode image success \(imageData)")
} else {
print("Create QRCode image failed!")
}You can get more information from the demo, result will like this:
3.3 Exportable types
- Static: NSImage, UIImage, PDF, PNG, JPEG
- Animated: APNG, GIF, SVG, MOV, MP4, M4V
4. Next
Learn more from DeepWiki.
Recommendations
- Please select a high contrast foreground and background color combinations;
- To improve the definition of QRCode images, increase
size; - Oversized generation dimensions, excessive QR code content, and overly large imported media may lead to generation failures;
- It is recommended to test the QRCode image before put it into use;
- Any contributing and pull requests are warmly welcome;
- Part of the pictures in the demo project and guide come from the internet. If there is any infringement of your legitimate rights and interests, please contact us to delete.
Contributors
Backers
Sponsors
- Thanks for the help from MacStadium's Open Source Program.
- Thanks for the help from JetBrains's Open Source Support Program.
Contact
Twitter: @EyreFree777
Weibo: @EyreFree
Email: [email protected]
License
EFQRCode is available under the MIT license. See the LICENSE file for more info.
File: CHANGELOG.md
Change Log
[7.0.3](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.3) (2025-08-03)
Fix
- Fix Package.swift
[7.0.2](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.2) (2025-06-01)
Add
- Support visionOS
[7.0.1](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.1) (2025-05-29)
Fix
- fix: spm minimum platform and dependency #168
[7.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.0) (2025-05-24)
Add
- Change rendering engine to SVG based (SwiftDraw)
- Support more QR code styles:
- Basic style
- Bubble style
- 2.5D style
- DSJ style
- Function style
- Image style (Old)
- ImageFill style
- Line style
- RandomRectangle style
- ResampleImage style
- Support multiple export formats:
- SVG (Vector)
- PDF (Vector)
- PNG
- JPEG
- APNG
- GIF
- MOV
- MP4
- M4V
- Support transparent background
- Add backdrop parameter for background customization
- Add image mode parameter for more display options
- Add icon alpha handling
Remove
- Remove Objective-C support
[6.2.2](https://github.com/EFPrefix/EFQRCode/releases/tag/6.2.2) (2023-03-06)
Fix
- Fix compiler error when compiled using Xcode 14.3 #153
[6.2.1](https://github.com/EFPrefix/EFQRCode/releases/tag/6.2.1) (2022-03-03)
Fix
- Fix
EFCirclePointStyleto respectisTimingPointStyledsettings.
[6.2.0](https://github.com/EFPrefix/EFQRCode/releases/tag/6.2.0) (2021-11-21)
Add
- Add
EFPointStyleprotocol to allow customizing foreground point style.
Deprecate
EFPointShapeis deprecated. UseEFPointStyleinstead.
[6.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/6.1.0) (2021-04-08)
Add
- Supports chaining
EFQRCodeGeneratorconfiguration methods. EFQRCodeGeneratorproperties are now public.EFQRCodeGenerator.clearCachecan be used to free up memories used for caching results.- English documentation is now available through Xcode quick help.
- Swift:
EFWatermarkMode.rectForWatermark(ofSize:inCanvasOfSize:)can be used to calculate the frame for watermark image in a canvas. - Objective-C: New tests to ensure APIs are available in Objective-C.
Change
- Renamed
EFQRCodeGeneratorconfiguration methods to be more consistent.- Renamed
EFQRCodeand reordered convenience generate function arguments to be consistent with generator methods.
- Renamed
EFQRCodeGeneratornow caches more generated contents to improve performance.EFQRCodeRecognizerexpects non-nil image and returns non-nil array of results. The returned array may still be empty.EFIntSizeis now an immutable, final class.- Renamed
CGColorextensionswhiteandblackto omit first argument label. - Objective-C:
EFQRCodeGeneratorandEFQRCodeRecognizeris now fully available to configure/use in Objective-C.
Deprecate
EFQRCodeMode.noneis now deprecated. UsenilandEFQRCodeMode?instead.
Remove
EFUIntPixelis no longer a part of the public interface.- GIF generation no longer takes
pathToSaveparameter. - Objective-C:
EFQRCodeis no longer available in Objective-C. UseEFQRCodeGeneratorandEFQRCodeRecognizerinstead.
[6.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/6.0.0) (2020-11-04)
Add
- Add support to compile for macOS 10.10 using CocoaPods.
Changed
swift_qrcodejsis now conditional dependency with Swift Package Manager 5.3+.
Remove
[5.1.9](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.9) (2020-11-04)
Add
- Add Playgrounds with usage example #98.
Fix
- Fix SwiftPM syntax in README #99;
- Fix GIF frame delay time setting #104;
- Now generates QRCode with correct, specified content encoding on watchOS;
- Pin
swift_qrcodejsto 1.2.0, up to next minor #102.
[5.1.8](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.8) (2020-09-18)
Fix
- Fix issue #95
[5.1.7](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.7) (2020-09-14)
Add
Fix
- Update
swift_qrcodejsto 1.1.4.
[5.1.6](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.6) (2019-11-21)
Fix
- Remove dependency
EFFoundation.
[5.1.5](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.5) (2019-11-20)
Fix
- Fix podspec.
[5.1.4](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.4) (2019-11-19)
Fix
- Fix issue #83.
[5.1.3](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.3) (2019-10-13)
Fix
- Fix conflicts with
SwifterSwift.
[5.1.2](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.2) (2019-10-10)
Fix
- Fix
ciColor()in extension of UIColor.
[5.1.1](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.1) (2019-10-09)
Add
- Add subspec
watchOS.
Change
- Make extensions internal;
- Update swift package;
- Update gif generation;
- Add dependency on
EFFoundation.
[5.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.0) (2019-09-17)
Add
Add parameter ignoreTiming.
[5.0.1](https://github.com/EFPrefix/EFQRCode/releases/tag/5.0.1) (2019-09-11)
Fix
Fix issue #65.
[5.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/5.0.0) (2019-03-31)
Add
- Add documentation for some extension methods.
Change
- Update to Swift 5;
- Improve internal implementation to allocate memory needed all at once.
Remove
- Remove Microsoft App Center SDK from examples.
[4.5.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.5.0) (2019-01-13)
Add
- Add point style
diamond; - Add
Objective-Csupport; - Add
accessibilityIgnoresInvertColorssupport.
[4.4.2](https://github.com/EFPrefix/EFQRCode/releases/tag/4.4.2) (2018-11-14)
Add
- Add parameters to meet the needs of #50.
[4.4.1](https://github.com/EFPrefix/EFQRCode/releases/tag/4.4.1) (2018-11-08)
Add
- Add dependency on swift_qrcodejs.
[4.4.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.4.0) (2018-11-05)
Add
- Upgrade to Swift 4.2.
[4.3.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.3.0) (2018-09-14)
Fix
- Update version.
[4.2.2](https://github.com/EFPrefix/EFQRCode/releases/tag/4.2.2) (2018-01-09)
Add
- Add multiple threads support for GIF.
[4.2.1](https://github.com/EFPrefix/EFQRCode/releases/tag/4.2.1) (2018-01-09)
Fix
- Add border for watchOS.
[4.2.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.2.0) (2018-01-03)
Add
- Support watchOS;
- Add example for watchOS.
[4.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.1.0) (2017-11-01)
Add
- Add GIF support.
[4.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.0.0) (2017-09-21)
Add
- Update for Swift 4.
[1.2.7](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.7) (2017-07-26)
Add
- Add support for Objective-C.
[1.2.6](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.6) (2017-07-25)
Fix
- Fix issue #21.
[1.2.5](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.5) (2017-05-24)
Add
- Add binarization;
- Add point shape.
Fix
- Fix issue #11.
[1.2.4](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.4) (2017-04-23)
Add
- Add example for macOS;
- Add example for tvOS.
Fix
- Fix iOS 8 error.
[1.2.3](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.3) (2017-04-18)
Fix
- Fix CocoaPods platform.
[1.2.2](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.2) (2017-04-17)
Add
- Support Carthage;
- Support tvOS;
- Support macOS.
[1.2.1](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.1) (2017-04-11)
Add
- Change parameter size and iconSize from CGFloat to EFIntSize;
- Remove UIKit.
Fix
- Increase efficiency;
- Fix issue #4.
[1.2.0](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.0) (2017-04-01)
Add
- Add parameter foregroundPointOffset;
- Add parameter allowTransparent.
Fix
- Make it more Object-oriented;
- Make it faster and more effective;
- Improve demo;
- Improve documentation.
[1.1.1](https://github.com/EFPrefix/EFQRCode/releases/tag/1.1.1) (2017-02-15)
Fix
- Detail modification;
- Improve documentation.
[1.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/1.1.0) (2017-02-10)
Add
- Add watermark image and some other feature.
Fix
- Remove UIImage extension;
- Improve documentation.
[1.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/1.0.0) (2017-01-24)
First public release.
File: .jazzy.yaml
EFQRCode Jazzy config
module: EFQRCode
author: EyreFree
theme: fullwidth
readme: README.md
root_url: https://efprefix.github.io/EFQRCode
github_url: https://github.com/EFPrefix/EFQRCode
github_file_prefix: https://github.com/EFPrefix/EFQRCode/blob/main
dash_url: https://efprefix.github.io/EFQRCode/docsets/EFQRCode.xml
exclude: ./Source/EFQRCode+Migration*
xcodebuild_arguments: [-workspace, 'EFQRCode.xcworkspace', -scheme, 'EFQRCode iOS', -sdk, 'iphoneos']
output: docs
File: Examples/iOS/Resources/Assets.xcassets/Contents.json
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "20.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "29.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "76.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "83.5.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "AppIcon.jpg",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/EFQRCoder.imageset/Contents.json
{
"images" : [
{
"filename" : "1024.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/Resources/Assets.xcassets/Generator.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/launchimage.imageset/Contents.json
{
"images" : [
{
"filename" : "launchimage.jpg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/Resources/Assets.xcassets/more.imageset/Contents.json
{
"images" : [
{
"filename" : "WechatIMG199.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/Resources/Assets.xcassets/Recognizer.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/Contents.json
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/EyreFree.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "eyrefree.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/GitHub.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "github.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/Pikachu.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Pikachu.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/Swift.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Swift.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Beethoven.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Beethoven.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Jobs.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Jobs.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Miku.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Miku.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Wille.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "wille.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/WWF.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "WWF.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/Resources/Assets.xcassets/transparentHolder.imageset/Contents.json
{
"images" : [
{
"filename" : "istockphoto-875273764-170667a.jpg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example/Assets.xcassets/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json
{
"images" : [
{
"size" : "24x24",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "38mm"
},
{
"size" : "27.5x27.5",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "42mm"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "[email protected]",
"role" : "companionSettings",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "[email protected]",
"role" : "companionSettings",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "38mm"
},
{
"size" : "44x44",
"idiom" : "watch",
"filename" : "AppIcon88.png",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "40mm"
},
{
"size" : "50x50",
"idiom" : "watch",
"filename" : "AppIcon100.png",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "44mm"
},
{
"size" : "86x86",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "38mm"
},
{
"size" : "98x98",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "42mm"
},
{
"size" : "108x108",
"idiom" : "watch",
"filename" : "AppIcon216.png",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "44mm"
},
{
"size" : "1024x1024",
"idiom" : "watch-marketing",
"filename" : "AppIcon.jpg",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Contents.json
{
"assets" : [
{
"filename" : "Circular.imageset",
"idiom" : "watch",
"role" : "circular"
},
{
"filename" : "Extra Large.imageset",
"idiom" : "watch",
"role" : "extra-large"
},
{
"filename" : "Graphic Bezel.imageset",
"idiom" : "watch",
"role" : "graphic-bezel"
},
{
"filename" : "Graphic Circular.imageset",
"idiom" : "watch",
"role" : "graphic-circular"
},
{
"filename" : "Graphic Corner.imageset",
"idiom" : "watch",
"role" : "graphic-corner"
},
{
"filename" : "Graphic Extra Large.imageset",
"idiom" : "watch",
"role" : "graphic-extra-large"
},
{
"filename" : "Graphic Large Rectangular.imageset",
"idiom" : "watch",
"role" : "graphic-large-rectangular"
},
{
"filename" : "Modular.imageset",
"idiom" : "watch",
"role" : "modular"
},
{
"filename" : "Utilitarian.imageset",
"idiom" : "watch",
"role" : "utilitarian"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json
{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/Contents.json
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/EyreFree.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "eyrefree.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/GitHub.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "github.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/Pikachu.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Pikachu.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/Swift.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Swift.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Beethoven.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Beethoven.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Jobs.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Jobs.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Miku.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Miku.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Wille.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "wille.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/WWF.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "WWF.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json
{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "16.png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "32.png",
"scale" : "1x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "128.png",
"scale" : "1x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "256.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "512.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/drag.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "drag.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/Generator.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/Generator_D.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator_D.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/launchimage.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "launchimage.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/Recognizer.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/macOS/macOS Example/Assets.xcassets/Recognizer_D.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer_D.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json
{
"assets" : [
{
"size" : "1280x768",
"idiom" : "tv",
"filename" : "App Icon - Large.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "400x240",
"idiom" : "tv",
"filename" : "App Icon - Small.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "2320x720",
"idiom" : "tv",
"filename" : "Top Shelf Image Wide.imageset",
"role" : "top-shelf-image-wide"
},
{
"size" : "1920x720",
"idiom" : "tv",
"filename" : "Top Shelf Image.imageset",
"role" : "top-shelf-image"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
{
"images" : [
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
{
"images" : [
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json
{
"images" : [
{
"idiom" : "tv",
"filename" : "EFQRCode.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json
{
"images" : [
{
"idiom" : "tv",
"filename" : "EFQRCode.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Generator.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/LaunchImage.launchimage/Contents.json
{
"images" : [
{
"orientation" : "landscape",
"idiom" : "tv",
"extent" : "full-screen",
"minimum-system-version" : "11.0",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "tv",
"filename" : "EFQRCode.png",
"extent" : "full-screen",
"minimum-system-version" : "9.0",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Recognizer.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/Contents.json
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/EyreFree.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "eyrefree.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/GitHub.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "github.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/Pikachu.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Pikachu.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/Swift.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Swift.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Contents.json
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Beethoven.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Beethoven.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Jobs.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Jobs.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Miku.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "Miku.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Wille.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "wille.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/WWF.imageset/Contents.json
{
"images" : [
{
"idiom" : "universal",
"filename" : "WWF.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
File: .github/CODE_OF_CONDUCT.md
Contributor Covenant Code of Conduct
Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
Our Standards
Examples of behavior that contributes to creating a positive environment include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [email protected]. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
Attribution
This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at http://contributor-covenant.org/version/1/4
File: .github/CONTRIBUTING.md
Contributing Guidelines
This document contains information and guidelines about contributing to this project.
Please read it before you start participating.
Topics
Asking Questions
We don't use GitHub as a support forum.
For any usage questions that are not specific to the project itself,
please ask on Stack Overflow instead.
By doing so, you'll be more likely to quickly solve your problem,
and you'll allow anyone else with the same question to find the answer.
This also allows maintainers to focus on improving the project for others.
Reporting Issues
A great way to contribute to the project
is to send a detailed issue when you encounter an problem.
We always appreciate a well-written, thorough bug report.
Check that the project issues database
doesn't already include that problem or suggestion before submitting an issue.
If you find a match, add a quick "+1" or "I have this problem too."
Doing this helps prioritize the most common problems and requests.
When reporting issues, please include the following:
- The version of Xcode you're using
- The version of iOS or macOS you're targeting
- The full output of any stack trace or compiler error
- A code snippet that reproduces the described behavior, if applicable
- Any other details that would be useful in understanding the problem
This information will help us review and fix your issue faster.
Developer's Certificate of Origin
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
Financial contributions
We also welcome financial contributions in full transparency on our open collective.
Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.
Credits
Contributors
Thank you to all the people who have already contributed to EFQRCode!
Backers
Thank you to all our backers! [Become a backer]
Sponsors
Thank you to all our sponsors! (please ask your company to also support this open source project by becoming a sponsor)
Some of the ideas and wording for the statements above were based on work by the Alamofire communities. We commend them for their efforts to facilitate collaboration in their projects.
File: .github/FUNDING.yml
These are supported funding model platforms
github: [EyreFree, ApolloZhu]
patreon: EyreFree
open_collective: efqrcode
ko_fi: eyrefree
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
custom: https://www.efqrcode.com/donations.jpg
File: .github/ISSUE_TEMPLATE/config.yml
blank_issues_enabled: false
contact_links:
- name: “RTFM” - Read the Fancy Manual
url: https://efprefix.github.io/EFQRCode/
about: Maybe the documentation can help? - name: Mail
url: mailto:[email protected]
about: Contact if necessary
File: .github/ISSUE_TEMPLATE/default.md
name: Have a Question?
about: Please file an issue with this template.
title: ''
Check List
- I have read the README.md, but the information I need is not there.
- I have searched in existing issues, but did not find a similar one.
Issue Description
Description
Reproduce
Other Comment
File: .github/workflows/ci.yml
name: CI
Comprehensive CI workflow that includes builds, tests, and validations
on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ main, master, develop ]
Cancel any in-progress workflow runs for the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer
jobs:
Swift Package Manager Build
spm-build:
name: SPM Build
runs-on: macos-latest
strategy:
matrix:
platform: [iOS, macOS, tvOS, watchOS, visionOS]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest
- name: Build with SPM
run: |
case "${{ matrix.platform }}" in
iOS)
SDK_PATH=$(xcrun --sdk iphonesimulator --show-sdk-path)
swift build \
-Xcc "-isysroot" -Xcc "$SDK_PATH" \
-Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
-Xswiftc "-target" -Xswiftc "arm64-apple-ios13.0-simulator"
;;
macOS)
swift build
;;
tvOS)
SDK_PATH=$(xcrun --sdk appletvsimulator --show-sdk-path)
swift build \
-Xcc "-isysroot" -Xcc "$SDK_PATH" \
-Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
-Xswiftc "-target" -Xswiftc "arm64-apple-tvos13.0-simulator"
;;
watchOS)
SDK_PATH=$(xcrun --sdk watchsimulator --show-sdk-path)
swift build \
-Xcc "-isysroot" -Xcc "$SDK_PATH" \
-Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
-Xswiftc "-target" -Xswiftc "arm64-apple-watchos6.0-simulator"
;;
visionOS)
SDK_PATH=$(xcrun --sdk xrsimulator --show-sdk-path)
swift build \
-Xcc "-isysroot" -Xcc "$SDK_PATH" \
-Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
-Xswiftc "-target" -Xswiftc "arm64-apple-xros1.0-simulator"
;;
esacXcode Build Test
xcode-build:
name: Xcode Build
runs-on: macos-latest
strategy:
matrix:
destination:
- 'platform=iOS Simulator,name=iPhone 15,OS=latest'
- 'platform=macOS'
- 'platform=tvOS Simulator,name=Apple TV,OS=latest'
- 'platform=watchOS Simulator,name=Apple Watch Series 9 (45mm),OS=latest'
- 'platform=visionOS Simulator,name=Apple Vision Pro,OS=latest'
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest
- name: Build with Xcode
run: |
xcodebuild clean build \
-workspace EFQRCode.xcworkspace \
-scheme "${{ contains(matrix.destination, 'iOS') && 'iOS Example' || contains(matrix.destination, 'macOS') && 'macOS Example' || contains(matrix.destination, 'tvOS') && 'tvOS Example' || contains(matrix.destination, 'watchOS') && 'watchOS Example' || 'iOS Example' }}" \
-destination "${{ matrix.destination }}" \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
ONLY_ACTIVE_ARCH=NOFinal Status Check
status-check:
name: Status Check
runs-on: macos-latest
needs: [spm-build, xcode-build]
if: always()
steps:
- name: Check Results
run: |
if [[ "${{ needs.spm-build.result }}" != "success" ]] || [[ "${{ needs.xcode-build.result }}" != "success" ]]; then
echo "❌ Build checks failed - PR will be blocked"
exit 1
fi
echo "✅ All checks passed successfully!"File: .github/workflows/cocoapods-lint.yml
name: CocoaPods Lint
Trigger the workflow on push and pull request events
on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ main, master, develop ]
Cancel any in-progress workflow runs for the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
cocoapods-lint:
name: Pod Lib Lint
runs-on: macos-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.0'
bundler-cache: true
- name: Install CocoaPods
run: |
gem install cocoapods --no-document
pod --version
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Show Xcode Version
run: xcodebuild -version
- name: Update CocoaPods Repo
run: pod repo update
- name: Pod Lib Lint - iOS
run: |
echo "🔍 Running pod lib lint for iOS..."
pod lib lint EFQRCode.podspec \
--platforms=ios \
--allow-warnings \
--verbose \
--fail-fast
- name: Pod Lib Lint - macOS
run: |
echo "🔍 Running pod lib lint for macOS..."
pod lib lint EFQRCode.podspec \
--platforms=osx \
--allow-warnings \
--verbose \
--fail-fast
- name: Pod Lib Lint - tvOS
run: |
echo "🔍 Running pod lib lint for tvOS..."
pod lib lint EFQRCode.podspec \
--platforms=tvos \
--allow-warnings \
--verbose \
--fail-fast
- name: Pod Lib Lint - watchOS
run: |
echo "🔍 Running pod lib lint for watchOS..."
pod lib lint EFQRCode.podspec \
--platforms=watchos \
--allow-warnings \
--verbose \
--fail-fast
- name: Pod Lib Lint - visionOS
run: |
echo "🔍 Running pod lib lint for visionOS..."
pod lib lint EFQRCode.podspec \
--platforms=visionos \
--allow-warnings \
--verbose \
--fail-fast
continue-on-error: true # visionOS support might not be available in all Xcode versions
- name: Pod Lib Lint - All Platforms
run: |
echo "🔍 Running comprehensive pod lib lint for all platforms..."
pod lib lint EFQRCode.podspec \
--allow-warnings \
--verbose \
--fail-fast
- name: Pod Spec Lint
run: |
echo "🔍 Running pod spec lint..."
pod spec lint EFQRCode.podspec \
--allow-warnings \
--verbose \
--fail-fast
- name: Success Notification
if: success()
run: |
echo "✅ All CocoaPods lint checks passed successfully!"
echo "🎉 The pod is ready for publishing."
- name: Failure Notification
if: failure()
run: |
echo "❌ CocoaPods lint checks failed!"
echo "🔧 Please fix the issues before merging the PR."
echo "📋 Check the logs above for detailed error information."
exit 1File: .github/workflows/docs.yml
name: Documentation
on:
push:
branches:
- main
- docs
Cancel any in-progress workflow runs for the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
jazzy:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install Jazzy
run: sudo gem install jazzy
- name: Resolve Swift Package dependencies
run: xcodebuild -resolvePackageDependencies
- name: Generate Documentation
run: ./docs.sh
continue-on-error: false
- name: Publish
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./docs
File: .github/workflows/documentation.yml
name: Documentation
Only run on pull requests to check documentation changes
on:
pull_request:
branches: [ main, master, develop ]
Cancel any in-progress workflow runs for the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer
jobs:
Documentation Check
documentation-check:
name: Documentation Check
runs-on: macos-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest
- name: Install Jazzy
run: sudo gem install jazzy
- name: Resolve Swift Package dependencies
run: xcodebuild -resolvePackageDependencies
- name: Generate Documentation
run: ./docs.sh
continue-on-error: falseStatus Check
status-check:
name: Documentation Status Check
runs-on: macos-latest
needs: [documentation-check]
if: always()
steps:
- name: Check Results
run: |
if [[ "${{ needs.documentation-check.result }}" != "success" ]]; then
echo "❌ Documentation generation failed"
exit 1
fi
echo "✅ Documentation check passed successfully!"