()
26 |
27 | /// Previous index
28 | @State private var previousIndex: Int = 0
29 |
30 | /// Current offset to be animated
31 | @State private var offset: CGFloat = 0
32 |
33 | /// Max diff offset to be animated
34 | private var maxOffset: CGFloat {
35 | return config.itemSpacing * 2
36 | }
37 |
38 | private var stepState: Step.State {
39 | return state.stateFor(step: step)
40 | }
41 |
42 | /// Get image for the current step
43 | private var image: Image? {
44 | return stepState != .completed ? step.image : config.defaultImage
45 | }
46 |
47 | /// Get foreground color for the current step
48 | private var foregroundColor: Color {
49 | switch stepState {
50 | case .uncompleted:
51 | return config.disabledColor
52 | default:
53 | return config.primaryColor
54 | }
55 | }
56 |
57 | /// Update the offset to animate according the next index
58 | private func updateOffset(nextIndex: Int) {
59 | let diff = nextIndex - previousIndex
60 | if abs(diff) != 1 {
61 | offset = 0
62 | return
63 | }
64 |
65 | if
66 | (previousIndex == state.data.endIndex && diff > 0) ||
67 | (nextIndex == state.data.endIndex && diff < 0)
68 | {
69 | offset = 0
70 | } else if previousIndex == step.index {
71 | offset = CGFloat(diff) * maxOffset
72 | } else if nextIndex == step.index {
73 | offset = -CGFloat(diff) * maxOffset
74 | } else {
75 | offset = 0
76 | }
77 | }
78 |
79 | private func onCompletionEffect() {
80 | if self.offset != 0 {
81 | offset = 0
82 | }
83 | }
84 |
85 | var body: some View {
86 | Container(title: step.title) {
87 | element
88 | .frame(width: config.size, height: config.size)
89 | .padding(config.figurePadding)
90 | .if(step.index == state.currentIndex, then: {
91 | $0.background(config.primaryColor).foregroundColor(config.secondaryColor)
92 | }, else: {
93 | $0.overlay(
94 | Circle().stroke(lineWidth: config.lineThickness)
95 | )
96 | })
97 | .cornerRadius(config.size)
98 | }
99 | .foregroundColor(foregroundColor)
100 | .modifier(
101 | OffsetEffect(
102 | offset: offset,
103 | pct: abs(offset) > 0 ? 1 : 0,
104 | onCompletion: onCompletionEffect
105 | )
106 | )
107 | .animation(config.animation)
108 | .onReceive(state.$currentIndex, perform: { (nextIndex) in
109 | self.updateOffset(nextIndex: nextIndex)
110 | self.previousIndex = nextIndex
111 | })
112 | .onReceive(inspection.notice) { self.inspection.visit(self, $0) }
113 | }
114 |
115 | @ViewBuilder
116 | private var element: some View {
117 | if let image {
118 | image.resizable()
119 | } else {
120 | Text("\(step.index + 1)")
121 | .font(.system(size: config.size))
122 | }
123 | }
124 | }
125 |
126 | #if DEBUG
127 | struct Item_Previews: PreviewProvider {
128 | static var previews: some View {
129 | let steps = ["First", "", ""]
130 | let state = StepsState(data: steps)
131 | return (
132 | Steps(state: state, onCreateStep: { element in
133 | Step(title: element)
134 | }).padding()
135 | )
136 | }
137 | }
138 | #endif
139 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | [](https://github.com/asam139/Steps/actions)
6 | [](https://github.com/asam139/Steps)
7 | [](https://cocoapods.org/pods/Steps)
8 | [](https://swift.org/package-manager/)
9 | [](https://codecov.io/gh/asam139/Steps)
10 | [](https://swift.org)
11 | [](https://developer.apple.com/xcode)
12 | [](https://opensource.org/licenses/MIT)
13 |
14 | Steps is a navigation bar that guides users through the steps of a task. You need to use it when a given task is complicated or has a certain sequence in the series of subtasks, we can decompose it into several steps to make things easier.
15 |
16 | ## Requirements
17 |
18 | - **iOS** 10.0+ / **tvOS** 9.0+ / **macOS** 10.10+ / **Ubuntu** 14.04+
19 | - Swift 5.0+
20 |
21 | ## Installation
22 |
23 |
24 | CocoaPods
25 | To integrate Steps into your Xcode project using CocoaPods, specify it in your Podfile:
26 |
27 | pod 'Steps'
28 |
29 |
30 |
31 | Swift Package Manager
32 | You can use The Swift Package Manager to install Steps by adding the proper description to your Package.swift file:
33 |
34 | import PackageDescription
35 |
36 | let package = Package(
37 | name: "YOUR_PROJECT_NAME",
38 | targets: [],
39 | dependencies: [
40 | .package(url: "https://github.com/asam139/Steps.git", from: "0.2.0")
41 | ]
42 | )
43 |
44 |
45 | Next, add Steps to your targets dependencies like so:
46 | .target(
47 | name: "YOUR_TARGET_NAME",
48 | dependencies: [
49 | "Steps",
50 | ]
51 | ),
52 | Then run swift package update.
53 |
54 |
55 |
56 |
57 |
58 | Manually
59 | Add the Steps project to your Xcode project
60 |
61 |
62 | ## Example
63 |
64 |
65 |
66 |
67 |
68 | struct Item {
69 | var title: String
70 | var image: Image?
71 | }
72 |
73 | struct ContentView: View {
74 | @ObservedObject private var stepsState: StepsState-
75 |
76 | init() {
77 | let items = [
78 | Item(title: "First_", image: Image(systemName: "wind")),
79 | Item(title: ""),
80 | Item(title: "Second__", image: Image(systemName: "tornado")),
81 | Item(title: ""),
82 | Item(title: "Fifth_____", image: Image(systemName: "hurricane"))
83 | ]
84 | stepsState = StepsState(data: items)
85 | }
86 |
87 | func onCreateStep(_ item: Item) -> Step {
88 | return Step(title: item.title, image: item.image)
89 | }
90 |
91 | var body: some View {
92 | VStack(spacing: 12) {
93 | Steps(state: stepsState, onCreateStep:onCreateStep)
94 | .itemSpacing(10)
95 | .font(.caption)
96 | .padding()
97 |
98 | Button(action: {
99 | self.stepsState.nextStep()
100 | }) {
101 | Text("Next")
102 | }
103 | .disabled(!stepsState.hasNext)
104 | Button(action: {
105 | self.stepsState.previousStep()
106 | }) {
107 | Text("Previous")
108 | }
109 | .disabled(!stepsState.hasPrevious)
110 | }.padding()
111 | }
112 | }
113 |
114 |
115 | ## Get involved
116 |
117 | We want your feedback.
118 | Please refer to [contributing guidelines](https://github.com/asam139/Steps/tree/master/CONTRIBUTING.md) before participating.
119 |
120 | ## Thanks
121 |
122 | Special thanks to:
123 |
124 | - Hoping new contributors
125 |
126 | ## License
127 |
128 | Steps is released under the MIT license. See [LICENSE](https://github.com/asam139/Steps/blob/master/LICENSE) for more information.
129 |
--------------------------------------------------------------------------------
/Sources/Steps/Steps.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import Combine
3 | import SwifterSwiftUI
4 |
5 | /// 🏄♂️ A navigation bar that guides users through the steps of a task.
6 | public struct Steps: View {
7 |
8 | /// The main state of the component
9 | @ObservedObject private(set) var state: StepsState
10 |
11 | /// Block to create each step
12 | let onCreateStep: (Element) -> Step
13 |
14 | /// Action when a step is selected by the user
15 | var onSelectStepAtIndex: ((Int) -> Void)?
16 |
17 | /// The style of the component
18 | let config: Config
19 |
20 | /// Helper to inspect
21 | let inspection = Inspection()
22 |
23 | /// Initializes a new `Steps`.
24 | ///
25 | /// - Parameter state: State to manage component
26 | /// - Parameter onCreateStep: Block to create each step
27 | public init(state: StepsState, config: Config = Config(), onCreateStep: @escaping (Element) -> Step) {
28 | self.state = state
29 | self.config = config
30 | self.onCreateStep = onCreateStep
31 | }
32 |
33 | /// Initializes a new separator
34 | ///
35 | /// - Parameters:
36 | /// - index: index of the step
37 | private func renderIndex(_ index: Int) -> some View {
38 | let element = state.data[index]
39 | var step = onCreateStep(element)
40 | step.index = index
41 |
42 | #if os(iOS) || os(watchOS) || os(macOS)
43 | let first = Item(step: step)
44 | .if(onSelectStepAtIndex != nil) { item in
45 | item.onTapGesture {
46 | self.onSelectStepAtIndex?(index)
47 | }.eraseToAnyView()
48 | }
49 | .eraseToAnyView()
50 | #elseif os(tvOS)
51 | let first = Item(step: step).eraseToAnyView()
52 | #endif
53 |
54 | let second: AnyView? = index < state.data.endIndex - 1 ?
55 | Separator(step: step).eraseToAnyView() : nil
56 | return ViewBuilder.buildBlock(first, second)
57 | }
58 |
59 | public var body: some View {
60 | HStack(alignment: .top, spacing: config.itemSpacing) {
61 | ForEach(state.data.indices, id: \.self) { index in
62 | self.renderIndex(index)
63 | }
64 | }
65 | .environmentObject(state)
66 | .environmentObject(config)
67 | .onReceive(inspection.notice) { self.inspection.visit(self, $0) }
68 | }
69 | }
70 |
71 | #if DEBUG
72 | struct Steps_Previews: PreviewProvider {
73 | static var previews: some View {
74 | let steps = ["First", "", ""]
75 | let state = StepsState(data: steps)
76 | return (
77 | Steps(state: state, onCreateStep: { element in
78 | Step(title: element)
79 | }).padding()
80 | )
81 | }
82 | }
83 | #endif
84 |
85 | // MARK: Builders
86 | extension Steps: Mutable {
87 | /// Set action when a step is selected by the user
88 | ///
89 | /// - Parameter action: new action to call when a step is selected
90 | @available(iOS 13.0, OSX 10.15, watchOS 6.0, *)
91 | @available(tvOS, unavailable)
92 | public func onSelectStepAtIndex(_ action: ((Int) -> Void)?) -> Self {
93 | return mutating(keyPath: \.onSelectStepAtIndex, value: action)
94 | }
95 |
96 | /// Adds space between each page
97 | ///
98 | /// - Parameter value: Spacing between elements
99 | public func itemSpacing(_ value: CGFloat) -> Self {
100 | config.itemSpacing = value
101 | return self
102 | }
103 |
104 | /// Modify size of each step element
105 | ///
106 | /// - Parameter value: Size of each step element
107 | public func size(_ value: CGFloat) -> Self {
108 | config.size = value
109 | return self
110 | }
111 |
112 | /// Modify the line thickness of all elements
113 | ///
114 | /// - Parameter value: Line thickness of all elements
115 | public func lineThickness(_ value: CGFloat) -> Self {
116 | config.lineThickness = value
117 | return self
118 | }
119 |
120 | /// Modify color for current and completed steps
121 | ///
122 | /// - Parameter value: Color for current and completed steps
123 | public func primaryColor(_ value: Color) -> Self {
124 | config.primaryColor = value
125 | return self
126 | }
127 |
128 | /// Modify color for text inside step element
129 | ///
130 | /// - Parameter value: Color for text inside step element
131 | public func secondaryColor(_ value: Color) -> Self {
132 | config.secondaryColor = value
133 | return self
134 | }
135 |
136 | /// Modify color for text inside step element
137 | ///
138 | /// - Parameter value: Color for uncompleted steps
139 | public func disabledColor(_ value: Color) -> Self {
140 | config.disabledColor = value
141 | return self
142 | }
143 |
144 | /// Modify color for text inside step element
145 | ///
146 | /// - Parameter value: Color for uncompleted steps
147 | public func defaultImage(_ value: Image) -> Self {
148 | config.defaultImage = value
149 | return self
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing Guidelines
2 |
3 | This document contains information and guidelines about contributing to this project. Please read it before you start participating.
4 |
5 | **Topics**
6 |
7 | - [Asking Questions](#asking-questions)
8 | - [Ways to Contribute](#ways-to-contribute)
9 | - [Adding new code](#adding-new-code)
10 | - [Adding Tests](#adding-tests)
11 | - [Adding documentation](#adding-documentation)
12 | - [Adding changelog entries](#adding-changelog-entries)
13 | - [Reporting Issues](#reporting-issues)
14 |
15 | ---
16 |
17 | ## Asking Questions
18 |
19 | We don't use GitHub as a support forum.
20 | For any usage questions that are not specific to the project itself, please ask on [Stack Overflow](https://stackoverflow.com) instead with the tag Steps.
21 | 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.
22 | This also allows us to focus on improving the project for others.
23 |
24 | ---
25 |
26 | ## Ways to Contribute
27 |
28 | You can contribute to the project in a variety of ways:
29 |
30 | - Improve documentation 🙏
31 | - Add more extensions 👍
32 | - Add missing unit tests 😅
33 | - Fixing or reporting bugs 😱
34 |
35 | If you're new to Open Source or Swift the Steps community is a great place to get involved.
36 |
37 | **Your contribution is always welcomed, no contribution is too small.**
38 |
39 | ---
40 |
41 | ## Adding new code
42 |
43 | Please refer to the following rules before submitting a pull request with your new extensions:
44 |
45 | - Make sure no similar extension already exist in Steps.
46 | - Add your contributions to [**master branch**](https://github.com/asam139/Steps/tree/master):
47 | - by doing this we can merge new pull-requests into **master** branch as soon as they are accepted, and add them to the next releases once they are fully tested.
48 | - Mention the original source of extension source (if possible) as a comment inside extension:
49 |
50 | ```swift
51 | public extension SomeType {
52 |
53 | public name: SomeType {
54 | // https://stackoverflow.com/somepage
55 | // .. code
56 | }
57 |
58 | }
59 | ```
60 |
61 | - All methods should be well documented. see [Adding documentation](#adding-documentation)
62 | - All methods should be tested. See [Adding Tests](#adding-tests) to know more.
63 | - Classes and tests are ordered inside files in the following order:
64 |
65 | ```swift
66 | // MARK: - enums
67 | public enum {
68 | // ...
69 | }
70 |
71 | // MARK: - Properties
72 | public extension SomeType {}
73 |
74 | // MARK: - Methods
75 | public extension SomeType {}
76 |
77 | // MARK: - Initializers
78 | public extension SomeType {}
79 | ```
80 |
81 | ---
82 |
83 | ## Adding Tests
84 |
85 | Please follow these guidelines before submitting a pull request with new tests:
86 |
87 | - Every extended Steps type should have one specific subclass of XCTestCase.
88 | - There should be a one to one relationship between methods/properties and their backing tests.
89 | - The subclass should be marked as final.
90 | - All extensions files and test files have a one to one relationship.
91 | - (example: all tests for "**StringExtensions.swift**" are found in the "**StringExtensionsTests.swift**" file)
92 | - Steps source files should not be added to the test target directly, but you should rather import Steps into the test target by using: @testable import Steps
93 | - Tests are ordered inside files in the same order as classes.
94 |
95 | ---
96 |
97 | ## Adding documentation
98 |
99 | Use the following template to add documentation for extensions
100 | > Replace placeholders inside <>
101 |
102 | > Remove any extra lines, eg. if method does not return any value, delete the `- Returns:` line
103 |
104 | ### Documentation template for units with single parameter
105 |
106 | ```swift
107 | /// Steps: .
108 | ///
109 | ///
110 | ///
111 | /// - Parameter : .
112 | /// - Throws:
113 | /// - Returns:
114 | ```
115 |
116 | ### Documentation template for units with multiple parameters
117 |
118 | ```swift
119 | /// Steps: .
120 | ///
121 | ///
122 | ///
123 | /// - Parameters:
124 | /// - : .
125 | /// - : .
126 | /// - Throws:
127 | /// - Returns:
128 | ```
129 |
130 | ### Documentation template for enums
131 |
132 | ```swift
133 | /// Steps: .
134 | ///
135 | /// - :
136 | /// - :
137 | /// - :
138 | /// - :
139 | ```
140 |
141 | ### Documentation Examples
142 |
143 | ```swift
144 |
145 | /// Steps: Sum of all elements in array.
146 | ///
147 | /// [1, 2, 3, 4, 5].sum() -> 15
148 | ///
149 | /// - Returns: Sum of the array's elements.
150 | func sum() -> Element {
151 | // ...
152 | }
153 |
154 | /// Steps: Date by changing value of calendar component.
155 | ///
156 | /// - Parameters:
157 | /// - component: component type.
158 | /// - value: new value of component to change.
159 | /// - Returns: original date after changing given component to given value.
160 | func changing(_ component: Calendar.Component, value: Int) -> Date? {
161 | // ...
162 | }
163 |
164 | ```
165 |
166 | ### Power Tip
167 |
168 | In Xcode select a method and press `command` + `alt` + `/` to create a documentation template!
169 |
170 | ---
171 |
172 | ## Adding changelog entries
173 |
174 | The [Changelog](https://github.com/asam139/Steps/blob/master/CHANGELOG.md) is a file which contains a curated, chronologically ordered list of notable changes for each version of a project. Please make sure to add a changelog entry describing your contribution to it every time there is a notable change.
175 |
176 | The [Changelog Guidelines](https://github.com/asam139/Steps/blob/master/CHANGELOG_GUIDELINES.md) contains instructions for maintaining (or adding new entries) to the Changelog.
177 |
178 | ---
179 |
180 | ## Reporting Issues
181 |
182 | A great way to contribute to the project is to send a detailed issue when you encounter a problem.
183 | We always appreciate a well-written, thorough bug report.
184 |
185 | Check that the project [issues page](https://github.com/asam139/Steps/issues) doesn't already include that problem or suggestion before submitting an issue.
186 | If you find a match, add a quick "**+1**" or "**I have this problem too**".
187 | Doing this helps prioritize the most common problems and requests.
188 |
189 | **When reporting issues, please include the following:**
190 |
191 | - What did you do?
192 | - What did you expect to happen?
193 | - What happened instead?
194 | - Steps version
195 | - Xcode version
196 | - macOS version running Xcode
197 | - Swift version
198 | - Platform(s) running Steps
199 | - Demo Project (if available)
200 |
201 | This information will help us review and fix your issue faster.
202 |
203 | ---
204 |
205 | ## [No Brown M&M's](http://en.wikipedia.org/wiki/Van_Halen#Contract_riders)
206 |
207 | If you made it all the way to the end, bravo dear user, we love you. You can include the 🚀 emoji in the top of your ticket to signal to us that you did in fact read this file and are trying to conform to it as best as possible: `:rocket:`.
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | CFPropertyList (3.0.6)
5 | rexml
6 | activesupport (6.1.7.3)
7 | concurrent-ruby (~> 1.0, >= 1.0.2)
8 | i18n (>= 1.6, < 2)
9 | minitest (>= 5.1)
10 | tzinfo (~> 2.0)
11 | zeitwerk (~> 2.3)
12 | addressable (2.8.4)
13 | public_suffix (>= 2.0.2, < 6.0)
14 | algoliasearch (1.27.5)
15 | httpclient (~> 2.8, >= 2.8.3)
16 | json (>= 1.5.1)
17 | artifactory (3.0.15)
18 | atomos (0.1.3)
19 | aws-eventstream (1.2.0)
20 | aws-partitions (1.756.0)
21 | aws-sdk-core (3.171.0)
22 | aws-eventstream (~> 1, >= 1.0.2)
23 | aws-partitions (~> 1, >= 1.651.0)
24 | aws-sigv4 (~> 1.5)
25 | jmespath (~> 1, >= 1.6.1)
26 | aws-sdk-kms (1.63.0)
27 | aws-sdk-core (~> 3, >= 3.165.0)
28 | aws-sigv4 (~> 1.1)
29 | aws-sdk-s3 (1.121.0)
30 | aws-sdk-core (~> 3, >= 3.165.0)
31 | aws-sdk-kms (~> 1)
32 | aws-sigv4 (~> 1.4)
33 | aws-sigv4 (1.5.2)
34 | aws-eventstream (~> 1, >= 1.0.2)
35 | babosa (1.0.4)
36 | claide (1.1.0)
37 | cocoapods (1.12.1)
38 | addressable (~> 2.8)
39 | claide (>= 1.0.2, < 2.0)
40 | cocoapods-core (= 1.12.1)
41 | cocoapods-deintegrate (>= 1.0.3, < 2.0)
42 | cocoapods-downloader (>= 1.6.0, < 2.0)
43 | cocoapods-plugins (>= 1.0.0, < 2.0)
44 | cocoapods-search (>= 1.0.0, < 2.0)
45 | cocoapods-trunk (>= 1.6.0, < 2.0)
46 | cocoapods-try (>= 1.1.0, < 2.0)
47 | colored2 (~> 3.1)
48 | escape (~> 0.0.4)
49 | fourflusher (>= 2.3.0, < 3.0)
50 | gh_inspector (~> 1.0)
51 | molinillo (~> 0.8.0)
52 | nap (~> 1.0)
53 | ruby-macho (>= 2.3.0, < 3.0)
54 | xcodeproj (>= 1.21.0, < 2.0)
55 | cocoapods-core (1.12.1)
56 | activesupport (>= 5.0, < 8)
57 | addressable (~> 2.8)
58 | algoliasearch (~> 1.0)
59 | concurrent-ruby (~> 1.1)
60 | fuzzy_match (~> 2.0.4)
61 | nap (~> 1.0)
62 | netrc (~> 0.11)
63 | public_suffix (~> 4.0)
64 | typhoeus (~> 1.0)
65 | cocoapods-deintegrate (1.0.5)
66 | cocoapods-downloader (1.6.3)
67 | cocoapods-plugins (1.0.0)
68 | nap
69 | cocoapods-search (1.0.1)
70 | cocoapods-trunk (1.6.0)
71 | nap (>= 0.8, < 2.0)
72 | netrc (~> 0.11)
73 | cocoapods-try (1.2.0)
74 | colored (1.2)
75 | colored2 (3.1.2)
76 | commander (4.6.0)
77 | highline (~> 2.0.0)
78 | concurrent-ruby (1.2.2)
79 | declarative (0.0.20)
80 | digest-crc (0.6.4)
81 | rake (>= 12.0.0, < 14.0.0)
82 | domain_name (0.5.20190701)
83 | unf (>= 0.0.5, < 1.0.0)
84 | dotenv (2.8.1)
85 | emoji_regex (3.2.3)
86 | escape (0.0.4)
87 | ethon (0.16.0)
88 | ffi (>= 1.15.0)
89 | excon (0.99.0)
90 | faraday (1.10.3)
91 | faraday-em_http (~> 1.0)
92 | faraday-em_synchrony (~> 1.0)
93 | faraday-excon (~> 1.1)
94 | faraday-httpclient (~> 1.0)
95 | faraday-multipart (~> 1.0)
96 | faraday-net_http (~> 1.0)
97 | faraday-net_http_persistent (~> 1.0)
98 | faraday-patron (~> 1.0)
99 | faraday-rack (~> 1.0)
100 | faraday-retry (~> 1.0)
101 | ruby2_keywords (>= 0.0.4)
102 | faraday-cookie_jar (0.0.7)
103 | faraday (>= 0.8.0)
104 | http-cookie (~> 1.0.0)
105 | faraday-em_http (1.0.0)
106 | faraday-em_synchrony (1.0.0)
107 | faraday-excon (1.1.0)
108 | faraday-httpclient (1.0.1)
109 | faraday-multipart (1.0.4)
110 | multipart-post (~> 2)
111 | faraday-net_http (1.0.1)
112 | faraday-net_http_persistent (1.2.0)
113 | faraday-patron (1.0.0)
114 | faraday-rack (1.0.0)
115 | faraday-retry (1.0.3)
116 | faraday_middleware (1.2.0)
117 | faraday (~> 1.0)
118 | fastimage (2.2.6)
119 | fastlane (2.212.2)
120 | CFPropertyList (>= 2.3, < 4.0.0)
121 | addressable (>= 2.8, < 3.0.0)
122 | artifactory (~> 3.0)
123 | aws-sdk-s3 (~> 1.0)
124 | babosa (>= 1.0.3, < 2.0.0)
125 | bundler (>= 1.12.0, < 3.0.0)
126 | colored
127 | commander (~> 4.6)
128 | dotenv (>= 2.1.1, < 3.0.0)
129 | emoji_regex (>= 0.1, < 4.0)
130 | excon (>= 0.71.0, < 1.0.0)
131 | faraday (~> 1.0)
132 | faraday-cookie_jar (~> 0.0.6)
133 | faraday_middleware (~> 1.0)
134 | fastimage (>= 2.1.0, < 3.0.0)
135 | gh_inspector (>= 1.1.2, < 2.0.0)
136 | google-apis-androidpublisher_v3 (~> 0.3)
137 | google-apis-playcustomapp_v1 (~> 0.1)
138 | google-cloud-storage (~> 1.31)
139 | highline (~> 2.0)
140 | json (< 3.0.0)
141 | jwt (>= 2.1.0, < 3)
142 | mini_magick (>= 4.9.4, < 5.0.0)
143 | multipart-post (~> 2.0.0)
144 | naturally (~> 2.2)
145 | optparse (~> 0.1.1)
146 | plist (>= 3.1.0, < 4.0.0)
147 | rubyzip (>= 2.0.0, < 3.0.0)
148 | security (= 0.1.3)
149 | simctl (~> 1.6.3)
150 | terminal-notifier (>= 2.0.0, < 3.0.0)
151 | terminal-table (>= 1.4.5, < 2.0.0)
152 | tty-screen (>= 0.6.3, < 1.0.0)
153 | tty-spinner (>= 0.8.0, < 1.0.0)
154 | word_wrap (~> 1.0.0)
155 | xcodeproj (>= 1.13.0, < 2.0.0)
156 | xcpretty (~> 0.3.0)
157 | xcpretty-travis-formatter (>= 0.0.3)
158 | ffi (1.15.5)
159 | fourflusher (2.3.1)
160 | fuzzy_match (2.0.4)
161 | gh_inspector (1.1.3)
162 | google-apis-androidpublisher_v3 (0.40.0)
163 | google-apis-core (>= 0.11.0, < 2.a)
164 | google-apis-core (0.11.0)
165 | addressable (~> 2.5, >= 2.5.1)
166 | googleauth (>= 0.16.2, < 2.a)
167 | httpclient (>= 2.8.1, < 3.a)
168 | mini_mime (~> 1.0)
169 | representable (~> 3.0)
170 | retriable (>= 2.0, < 4.a)
171 | rexml
172 | webrick
173 | google-apis-iamcredentials_v1 (0.17.0)
174 | google-apis-core (>= 0.11.0, < 2.a)
175 | google-apis-playcustomapp_v1 (0.13.0)
176 | google-apis-core (>= 0.11.0, < 2.a)
177 | google-apis-storage_v1 (0.19.0)
178 | google-apis-core (>= 0.9.0, < 2.a)
179 | google-cloud-core (1.6.0)
180 | google-cloud-env (~> 1.0)
181 | google-cloud-errors (~> 1.0)
182 | google-cloud-env (1.6.0)
183 | faraday (>= 0.17.3, < 3.0)
184 | google-cloud-errors (1.3.1)
185 | google-cloud-storage (1.44.0)
186 | addressable (~> 2.8)
187 | digest-crc (~> 0.4)
188 | google-apis-iamcredentials_v1 (~> 0.1)
189 | google-apis-storage_v1 (~> 0.19.0)
190 | google-cloud-core (~> 1.6)
191 | googleauth (>= 0.16.2, < 2.a)
192 | mini_mime (~> 1.0)
193 | googleauth (1.5.2)
194 | faraday (>= 0.17.3, < 3.a)
195 | jwt (>= 1.4, < 3.0)
196 | memoist (~> 0.16)
197 | multi_json (~> 1.11)
198 | os (>= 0.9, < 2.0)
199 | signet (>= 0.16, < 2.a)
200 | highline (2.0.3)
201 | http-cookie (1.0.5)
202 | domain_name (~> 0.5)
203 | httpclient (2.8.3)
204 | i18n (1.13.0)
205 | concurrent-ruby (~> 1.0)
206 | jmespath (1.6.2)
207 | json (2.6.3)
208 | jwt (2.7.0)
209 | memoist (0.16.2)
210 | mini_magick (4.12.0)
211 | mini_mime (1.1.2)
212 | minitest (5.18.0)
213 | molinillo (0.8.0)
214 | multi_json (1.15.0)
215 | multipart-post (2.0.0)
216 | nanaimo (0.3.0)
217 | nap (1.1.0)
218 | naturally (2.2.1)
219 | netrc (0.11.0)
220 | optparse (0.1.1)
221 | os (1.1.4)
222 | plist (3.7.0)
223 | public_suffix (4.0.7)
224 | rake (13.0.6)
225 | representable (3.2.0)
226 | declarative (< 0.1.0)
227 | trailblazer-option (>= 0.1.1, < 0.2.0)
228 | uber (< 0.2.0)
229 | retriable (3.1.2)
230 | rexml (3.2.5)
231 | rouge (2.0.7)
232 | ruby-macho (2.5.1)
233 | ruby2_keywords (0.0.5)
234 | rubyzip (2.3.2)
235 | security (0.1.3)
236 | signet (0.17.0)
237 | addressable (~> 2.8)
238 | faraday (>= 0.17.5, < 3.a)
239 | jwt (>= 1.5, < 3.0)
240 | multi_json (~> 1.10)
241 | simctl (1.6.10)
242 | CFPropertyList
243 | naturally
244 | terminal-notifier (2.0.0)
245 | terminal-table (1.8.0)
246 | unicode-display_width (~> 1.1, >= 1.1.1)
247 | trailblazer-option (0.1.2)
248 | tty-cursor (0.7.1)
249 | tty-screen (0.8.1)
250 | tty-spinner (0.9.3)
251 | tty-cursor (~> 0.7)
252 | typhoeus (1.4.0)
253 | ethon (>= 0.9.0)
254 | tzinfo (2.0.6)
255 | concurrent-ruby (~> 1.0)
256 | uber (0.1.0)
257 | unf (0.1.4)
258 | unf_ext
259 | unf_ext (0.0.8.2)
260 | unicode-display_width (1.8.0)
261 | webrick (1.8.1)
262 | word_wrap (1.0.0)
263 | xcodeproj (1.22.0)
264 | CFPropertyList (>= 2.3.3, < 4.0)
265 | atomos (~> 0.1.3)
266 | claide (>= 1.0.2, < 2.0)
267 | colored2 (~> 3.1)
268 | nanaimo (~> 0.3.0)
269 | rexml (~> 3.2.4)
270 | xcpretty (0.3.0)
271 | rouge (~> 2.0.7)
272 | xcpretty-json-formatter (0.1.1)
273 | xcpretty (~> 0.2, >= 0.0.7)
274 | xcpretty-travis-formatter (1.0.1)
275 | xcpretty (~> 0.2, >= 0.0.7)
276 | zeitwerk (2.6.8)
277 |
278 | PLATFORMS
279 | ruby
280 |
281 | DEPENDENCIES
282 | cocoapods
283 | fastlane
284 | xcpretty
285 | xcpretty-json-formatter
286 |
287 | BUNDLED WITH
288 | 2.4.12
289 |
--------------------------------------------------------------------------------
/Example/Example.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 54;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 97930A7D29FBDC6C0098E0A8 /* Steps in Frameworks */ = {isa = PBXBuildFile; productRef = 97930A7C29FBDC6C0098E0A8 /* Steps */; };
11 | 9C3CACED2440EFCB0088C114 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C3CACEC2440EFCB0088C114 /* ContentView.swift */; };
12 | D9A12776235699C600D136A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9A12775235699C600D136A5 /* AppDelegate.swift */; };
13 | D9A12778235699C600D136A5 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9A12777235699C600D136A5 /* SceneDelegate.swift */; };
14 | D9A1277D235699C600D136A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D9A1277B235699C600D136A5 /* Main.storyboard */; };
15 | D9A1277F235699C700D136A5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D9A1277E235699C700D136A5 /* Assets.xcassets */; };
16 | D9A12782235699C700D136A5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D9A12780235699C700D136A5 /* LaunchScreen.storyboard */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXCopyFilesBuildPhase section */
20 | 9C70629B24422A000061E8D8 /* Embed Frameworks */ = {
21 | isa = PBXCopyFilesBuildPhase;
22 | buildActionMask = 2147483647;
23 | dstPath = "";
24 | dstSubfolderSpec = 10;
25 | files = (
26 | );
27 | name = "Embed Frameworks";
28 | runOnlyForDeploymentPostprocessing = 0;
29 | };
30 | /* End PBXCopyFilesBuildPhase section */
31 |
32 | /* Begin PBXFileReference section */
33 | 97930A7B29FBDC3D0098E0A8 /* Steps */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Steps; path = ..; sourceTree = ""; };
34 | 9C3CACEC2440EFCB0088C114 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
35 | D9A12772235699C600D136A5 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
36 | D9A12775235699C600D136A5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
37 | D9A12777235699C600D136A5 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
38 | D9A1277C235699C600D136A5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
39 | D9A1277E235699C700D136A5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
40 | D9A12781235699C700D136A5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
41 | D9A12783235699C700D136A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
42 | /* End PBXFileReference section */
43 |
44 | /* Begin PBXFrameworksBuildPhase section */
45 | D9A1276F235699C600D136A5 /* Frameworks */ = {
46 | isa = PBXFrameworksBuildPhase;
47 | buildActionMask = 2147483647;
48 | files = (
49 | 97930A7D29FBDC6C0098E0A8 /* Steps in Frameworks */,
50 | );
51 | runOnlyForDeploymentPostprocessing = 0;
52 | };
53 | /* End PBXFrameworksBuildPhase section */
54 |
55 | /* Begin PBXGroup section */
56 | D9A12769235699C600D136A5 = {
57 | isa = PBXGroup;
58 | children = (
59 | 97930A7B29FBDC3D0098E0A8 /* Steps */,
60 | D9A12774235699C600D136A5 /* Sources */,
61 | D9A12773235699C600D136A5 /* Products */,
62 | D9A127892356A25E00D136A5 /* Frameworks */,
63 | );
64 | sourceTree = "";
65 | };
66 | D9A12773235699C600D136A5 /* Products */ = {
67 | isa = PBXGroup;
68 | children = (
69 | D9A12772235699C600D136A5 /* Example.app */,
70 | );
71 | name = Products;
72 | sourceTree = "";
73 | };
74 | D9A12774235699C600D136A5 /* Sources */ = {
75 | isa = PBXGroup;
76 | children = (
77 | D9A12775235699C600D136A5 /* AppDelegate.swift */,
78 | D9A12777235699C600D136A5 /* SceneDelegate.swift */,
79 | 9C3CACEC2440EFCB0088C114 /* ContentView.swift */,
80 | D9A1277B235699C600D136A5 /* Main.storyboard */,
81 | D9A1277E235699C700D136A5 /* Assets.xcassets */,
82 | D9A12780235699C700D136A5 /* LaunchScreen.storyboard */,
83 | D9A12783235699C700D136A5 /* Info.plist */,
84 | );
85 | path = Sources;
86 | sourceTree = "";
87 | };
88 | D9A127892356A25E00D136A5 /* Frameworks */ = {
89 | isa = PBXGroup;
90 | children = (
91 | );
92 | name = Frameworks;
93 | sourceTree = "";
94 | };
95 | /* End PBXGroup section */
96 |
97 | /* Begin PBXNativeTarget section */
98 | D9A12771235699C600D136A5 /* Example */ = {
99 | isa = PBXNativeTarget;
100 | buildConfigurationList = D9A12786235699C700D136A5 /* Build configuration list for PBXNativeTarget "Example" */;
101 | buildPhases = (
102 | D9A1276E235699C600D136A5 /* Sources */,
103 | D9A1276F235699C600D136A5 /* Frameworks */,
104 | D9A12770235699C600D136A5 /* Resources */,
105 | 9C70629B24422A000061E8D8 /* Embed Frameworks */,
106 | 9C7F4436244CB076005DC0C8 /* Lint */,
107 | );
108 | buildRules = (
109 | );
110 | dependencies = (
111 | );
112 | name = Example;
113 | packageProductDependencies = (
114 | 97930A7C29FBDC6C0098E0A8 /* Steps */,
115 | );
116 | productName = "iOS Example";
117 | productReference = D9A12772235699C600D136A5 /* Example.app */;
118 | productType = "com.apple.product-type.application";
119 | };
120 | /* End PBXNativeTarget section */
121 |
122 | /* Begin PBXProject section */
123 | D9A1276A235699C600D136A5 /* Project object */ = {
124 | isa = PBXProject;
125 | attributes = {
126 | LastSwiftUpdateCheck = 1110;
127 | LastUpgradeCheck = 1410;
128 | ORGANIZATIONNAME = "Saul Moreno Abril";
129 | TargetAttributes = {
130 | D9A12771235699C600D136A5 = {
131 | CreatedOnToolsVersion = 11.1;
132 | };
133 | };
134 | };
135 | buildConfigurationList = D9A1276D235699C600D136A5 /* Build configuration list for PBXProject "Example" */;
136 | compatibilityVersion = "Xcode 9.3";
137 | developmentRegion = en;
138 | hasScannedForEncodings = 0;
139 | knownRegions = (
140 | en,
141 | Base,
142 | );
143 | mainGroup = D9A12769235699C600D136A5;
144 | productRefGroup = D9A12773235699C600D136A5 /* Products */;
145 | projectDirPath = "";
146 | projectRoot = "";
147 | targets = (
148 | D9A12771235699C600D136A5 /* Example */,
149 | );
150 | };
151 | /* End PBXProject section */
152 |
153 | /* Begin PBXResourcesBuildPhase section */
154 | D9A12770235699C600D136A5 /* Resources */ = {
155 | isa = PBXResourcesBuildPhase;
156 | buildActionMask = 2147483647;
157 | files = (
158 | D9A12782235699C700D136A5 /* LaunchScreen.storyboard in Resources */,
159 | D9A1277F235699C700D136A5 /* Assets.xcassets in Resources */,
160 | D9A1277D235699C600D136A5 /* Main.storyboard in Resources */,
161 | );
162 | runOnlyForDeploymentPostprocessing = 0;
163 | };
164 | /* End PBXResourcesBuildPhase section */
165 |
166 | /* Begin PBXShellScriptBuildPhase section */
167 | 9C7F4436244CB076005DC0C8 /* Lint */ = {
168 | isa = PBXShellScriptBuildPhase;
169 | alwaysOutOfDate = 1;
170 | buildActionMask = 2147483647;
171 | files = (
172 | );
173 | inputFileListPaths = (
174 | );
175 | inputPaths = (
176 | );
177 | name = Lint;
178 | outputFileListPaths = (
179 | );
180 | outputPaths = (
181 | );
182 | runOnlyForDeploymentPostprocessing = 0;
183 | shellPath = /bin/sh;
184 | shellScript = "unset SDKROOT\nexport PATH=\"$PATH:/opt/homebrew/bin\"\n\nif which mint >/dev/null && mint which swiftlint; then\n cd ..\n mint run realm/SwiftLint@0.51.0 swiftlint autocorrect --format\nelse\n echo \"warning: Mint not installed, download from https://github.com/yonaskolb/mint\"\nfi\n";
185 | };
186 | /* End PBXShellScriptBuildPhase section */
187 |
188 | /* Begin PBXSourcesBuildPhase section */
189 | D9A1276E235699C600D136A5 /* Sources */ = {
190 | isa = PBXSourcesBuildPhase;
191 | buildActionMask = 2147483647;
192 | files = (
193 | D9A12776235699C600D136A5 /* AppDelegate.swift in Sources */,
194 | D9A12778235699C600D136A5 /* SceneDelegate.swift in Sources */,
195 | 9C3CACED2440EFCB0088C114 /* ContentView.swift in Sources */,
196 | );
197 | runOnlyForDeploymentPostprocessing = 0;
198 | };
199 | /* End PBXSourcesBuildPhase section */
200 |
201 | /* Begin PBXVariantGroup section */
202 | D9A1277B235699C600D136A5 /* Main.storyboard */ = {
203 | isa = PBXVariantGroup;
204 | children = (
205 | D9A1277C235699C600D136A5 /* Base */,
206 | );
207 | name = Main.storyboard;
208 | sourceTree = "";
209 | };
210 | D9A12780235699C700D136A5 /* LaunchScreen.storyboard */ = {
211 | isa = PBXVariantGroup;
212 | children = (
213 | D9A12781235699C700D136A5 /* Base */,
214 | );
215 | name = LaunchScreen.storyboard;
216 | sourceTree = "";
217 | };
218 | /* End PBXVariantGroup section */
219 |
220 | /* Begin XCBuildConfiguration section */
221 | D9A12784235699C700D136A5 /* Debug */ = {
222 | isa = XCBuildConfiguration;
223 | buildSettings = {
224 | ALWAYS_SEARCH_USER_PATHS = NO;
225 | CLANG_ANALYZER_NONNULL = YES;
226 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
227 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
228 | CLANG_CXX_LIBRARY = "libc++";
229 | CLANG_ENABLE_MODULES = YES;
230 | CLANG_ENABLE_OBJC_ARC = YES;
231 | CLANG_ENABLE_OBJC_WEAK = YES;
232 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
233 | CLANG_WARN_BOOL_CONVERSION = YES;
234 | CLANG_WARN_COMMA = YES;
235 | CLANG_WARN_CONSTANT_CONVERSION = YES;
236 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
239 | CLANG_WARN_EMPTY_BODY = YES;
240 | CLANG_WARN_ENUM_CONVERSION = YES;
241 | CLANG_WARN_INFINITE_RECURSION = YES;
242 | CLANG_WARN_INT_CONVERSION = YES;
243 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
244 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
245 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
246 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
247 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
248 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
249 | CLANG_WARN_STRICT_PROTOTYPES = YES;
250 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
251 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
252 | CLANG_WARN_UNREACHABLE_CODE = YES;
253 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
254 | COPY_PHASE_STRIP = NO;
255 | DEBUG_INFORMATION_FORMAT = dwarf;
256 | ENABLE_STRICT_OBJC_MSGSEND = YES;
257 | ENABLE_TESTABILITY = YES;
258 | GCC_C_LANGUAGE_STANDARD = gnu11;
259 | GCC_DYNAMIC_NO_PIC = NO;
260 | GCC_NO_COMMON_BLOCKS = YES;
261 | GCC_OPTIMIZATION_LEVEL = 0;
262 | GCC_PREPROCESSOR_DEFINITIONS = (
263 | "DEBUG=1",
264 | "$(inherited)",
265 | );
266 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
267 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
268 | GCC_WARN_UNDECLARED_SELECTOR = YES;
269 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
270 | GCC_WARN_UNUSED_FUNCTION = YES;
271 | GCC_WARN_UNUSED_VARIABLE = YES;
272 | IPHONEOS_DEPLOYMENT_TARGET = 13.1;
273 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
274 | MTL_FAST_MATH = YES;
275 | ONLY_ACTIVE_ARCH = YES;
276 | SDKROOT = iphoneos;
277 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
278 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
279 | };
280 | name = Debug;
281 | };
282 | D9A12785235699C700D136A5 /* Release */ = {
283 | isa = XCBuildConfiguration;
284 | buildSettings = {
285 | ALWAYS_SEARCH_USER_PATHS = NO;
286 | CLANG_ANALYZER_NONNULL = YES;
287 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
288 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
289 | CLANG_CXX_LIBRARY = "libc++";
290 | CLANG_ENABLE_MODULES = YES;
291 | CLANG_ENABLE_OBJC_ARC = YES;
292 | CLANG_ENABLE_OBJC_WEAK = YES;
293 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
294 | CLANG_WARN_BOOL_CONVERSION = YES;
295 | CLANG_WARN_COMMA = YES;
296 | CLANG_WARN_CONSTANT_CONVERSION = YES;
297 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
298 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
299 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
300 | CLANG_WARN_EMPTY_BODY = YES;
301 | CLANG_WARN_ENUM_CONVERSION = YES;
302 | CLANG_WARN_INFINITE_RECURSION = YES;
303 | CLANG_WARN_INT_CONVERSION = YES;
304 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
305 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
306 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
308 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
309 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
310 | CLANG_WARN_STRICT_PROTOTYPES = YES;
311 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
312 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
313 | CLANG_WARN_UNREACHABLE_CODE = YES;
314 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
315 | COPY_PHASE_STRIP = NO;
316 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
317 | ENABLE_NS_ASSERTIONS = NO;
318 | ENABLE_STRICT_OBJC_MSGSEND = YES;
319 | GCC_C_LANGUAGE_STANDARD = gnu11;
320 | GCC_NO_COMMON_BLOCKS = YES;
321 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
322 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
323 | GCC_WARN_UNDECLARED_SELECTOR = YES;
324 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
325 | GCC_WARN_UNUSED_FUNCTION = YES;
326 | GCC_WARN_UNUSED_VARIABLE = YES;
327 | IPHONEOS_DEPLOYMENT_TARGET = 13.1;
328 | MTL_ENABLE_DEBUG_INFO = NO;
329 | MTL_FAST_MATH = YES;
330 | SDKROOT = iphoneos;
331 | SWIFT_COMPILATION_MODE = wholemodule;
332 | SWIFT_OPTIMIZATION_LEVEL = "-O";
333 | VALIDATE_PRODUCT = YES;
334 | };
335 | name = Release;
336 | };
337 | D9A12787235699C700D136A5 /* Debug */ = {
338 | isa = XCBuildConfiguration;
339 | buildSettings = {
340 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
341 | CODE_SIGN_STYLE = Automatic;
342 | DEVELOPMENT_TEAM = U96GUE2A6L;
343 | INFOPLIST_FILE = Sources/Info.plist;
344 | LD_RUNPATH_SEARCH_PATHS = (
345 | "$(inherited)",
346 | "@executable_path/Frameworks",
347 | );
348 | PRODUCT_BUNDLE_IDENTIFIER = "com.saulmorenoabril.steps.iOS-Example";
349 | PRODUCT_NAME = "$(TARGET_NAME)";
350 | SWIFT_VERSION = 5.0;
351 | TARGETED_DEVICE_FAMILY = "1,2";
352 | };
353 | name = Debug;
354 | };
355 | D9A12788235699C700D136A5 /* Release */ = {
356 | isa = XCBuildConfiguration;
357 | buildSettings = {
358 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
359 | CODE_SIGN_STYLE = Automatic;
360 | DEVELOPMENT_TEAM = U96GUE2A6L;
361 | INFOPLIST_FILE = Sources/Info.plist;
362 | LD_RUNPATH_SEARCH_PATHS = (
363 | "$(inherited)",
364 | "@executable_path/Frameworks",
365 | );
366 | PRODUCT_BUNDLE_IDENTIFIER = "com.saulmorenoabril.steps.iOS-Example";
367 | PRODUCT_NAME = "$(TARGET_NAME)";
368 | SWIFT_VERSION = 5.0;
369 | TARGETED_DEVICE_FAMILY = "1,2";
370 | };
371 | name = Release;
372 | };
373 | /* End XCBuildConfiguration section */
374 |
375 | /* Begin XCConfigurationList section */
376 | D9A1276D235699C600D136A5 /* Build configuration list for PBXProject "Example" */ = {
377 | isa = XCConfigurationList;
378 | buildConfigurations = (
379 | D9A12784235699C700D136A5 /* Debug */,
380 | D9A12785235699C700D136A5 /* Release */,
381 | );
382 | defaultConfigurationIsVisible = 0;
383 | defaultConfigurationName = Release;
384 | };
385 | D9A12786235699C700D136A5 /* Build configuration list for PBXNativeTarget "Example" */ = {
386 | isa = XCConfigurationList;
387 | buildConfigurations = (
388 | D9A12787235699C700D136A5 /* Debug */,
389 | D9A12788235699C700D136A5 /* Release */,
390 | );
391 | defaultConfigurationIsVisible = 0;
392 | defaultConfigurationName = Release;
393 | };
394 | /* End XCConfigurationList section */
395 |
396 | /* Begin XCSwiftPackageProductDependency section */
397 | 97930A7C29FBDC6C0098E0A8 /* Steps */ = {
398 | isa = XCSwiftPackageProductDependency;
399 | productName = Steps;
400 | };
401 | /* End XCSwiftPackageProductDependency section */
402 | };
403 | rootObject = D9A1276A235699C600D136A5 /* Project object */;
404 | }
405 |
--------------------------------------------------------------------------------