├── .circleci
└── config.yml
├── .gitattributes
├── .github
├── CODEOWNERS
├── ISSUE_TEMPLATE
│ ├── Bug Report.yml
│ ├── Feature Request.yml
│ └── config.yml
├── PULL_REQUEST_TEMPLATE.md
├── stale.yml
└── workflows
│ └── semgrep.yml
├── .gitignore
├── LICENSE
├── README.md
└── Sample-01
├── .swiftlint.yml
├── Auth0.plist.example
├── README.md
├── Sources
├── MainView.swift
├── ProfileView.swift
├── Supporting Files
│ ├── App.swift
│ ├── Assets.xcassets
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ └── Contents.json
│ │ ├── Auth0.imageset
│ │ │ ├── Contents.json
│ │ │ └── auth0.svg
│ │ ├── Background.colorset
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── Grey.colorset
│ │ │ └── Contents.json
│ │ ├── Orange.colorset
│ │ │ └── Contents.json
│ │ └── Pink.colorset
│ │ │ └── Contents.json
│ ├── Views.swift
│ ├── iOS
│ │ └── SpaceGrotesk.ttf
│ └── macOS
│ │ └── macOS.entitlements
└── User.swift
├── SwiftSample (iOS).entitlements
├── SwiftSample--iOS--Info.plist
├── SwiftSample.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── xcshareddata
│ └── xcschemes
│ └── SwiftSample (iOS).xcscheme
├── Tests
├── Shared
│ ├── ProfileCellTests.swift
│ ├── ProfileViewTests.swift
│ └── UserTests.swift
├── iOS
│ ├── HeroViewTests.swift
│ └── ProfileHeaderTests.swift
└── macOS
│ ├── HeroViewTests.swift
│ └── ProfileHeaderTests.swift
└── UITests
└── SmokeTests.swift
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | version: 2.1
2 |
3 | executors:
4 | macos-executor:
5 | parameters:
6 | xcode:
7 | type: string
8 | shell: /bin/bash --login -eo pipefail
9 | macos:
10 | xcode: << parameters.xcode >>
11 | environment:
12 | LC_ALL: en_US.UTF-8
13 | LANG: en_US.UTF-8
14 | HOMEBREW_LOGS: ~/homebrew-logs
15 | HOMEBREW_TEMP: ~/homebrew-temp
16 | HOMEBREW_NO_AUTO_UPDATE: 1
17 | HOMEBREW_NO_INSTALL_CLEANUP: 1
18 |
19 | commands:
20 | prepare:
21 | steps:
22 | - run:
23 | name: Install Swiftlint
24 | command: brew install swiftlint
25 | - run:
26 | name: Rename Auth0.plist.example
27 | command: mv Sample-01/Auth0.plist.example Sample-01/Auth0.plist
28 | build-ios:
29 | parameters:
30 | scheme:
31 | type: string
32 | steps:
33 | - run:
34 | name: Run iOS tests
35 | command: |
36 | SIMULATOR='platform=iOS Simulator,name=iPhone 14'
37 | if [ -z "$CIRCLE_PR_NUMBER" ]; then
38 | sed -i '' -e "s/{DOMAIN}/$AUTH0_DOMAIN/" Sample-01/Auth0.plist
39 | sed -i '' -e "s/{CLIENT_ID}/$AUTH0_CLIENT_ID/" Sample-01/Auth0.plist
40 | xcodebuild test \
41 | -project 'Sample-01/<< parameters.scheme >>.xcodeproj' \
42 | -scheme '<< parameters.scheme >> (iOS)' \
43 | -destination "$SIMULATOR" \
44 | -configuration Debug | xcpretty
45 | else
46 | xcodebuild test \
47 | -project 'Sample-01/<< parameters.scheme >>.xcodeproj' \
48 | -scheme '<< parameters.scheme >> (iOS)' \
49 | -destination "$SIMULATOR" \
50 | -configuration Debug \
51 | -skip-testing:<< parameters.scheme >>UITests | xcpretty
52 | fi
53 | build-macos:
54 | parameters:
55 | scheme:
56 | type: string
57 | steps:
58 | - run:
59 | name: Run macOS tests
60 | command: xcodebuild test -project 'Sample-01/<< parameters.scheme >>.xcodeproj' -scheme '<< parameters.scheme >> (macOS)' -destination 'platform=macOS,arch=x86_64' -configuration Debug | xcpretty
61 |
62 | jobs:
63 | build:
64 | parameters:
65 | platform:
66 | type: string
67 | xcode:
68 | type: string
69 | scheme:
70 | type: string
71 | executor:
72 | name: macos-executor
73 | xcode: << parameters.xcode >>
74 | steps:
75 | - checkout
76 | - prepare
77 | - when:
78 | condition:
79 | equal: [ios, << parameters.platform >>]
80 | steps:
81 | - build-ios:
82 | scheme: << parameters.scheme >>
83 | - when:
84 | condition:
85 | equal: [macos, << parameters.platform >>]
86 | steps:
87 | - build-macos:
88 | scheme: << parameters.scheme >>
89 |
90 | workflows:
91 | build:
92 | jobs:
93 | - build:
94 | scheme: "SwiftSample"
95 | matrix:
96 | parameters:
97 | platform: ["ios", "macos"]
98 | xcode: ["14.0.1"]
99 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.swift text diff=swift
2 | *.ttf binary
3 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | * @auth0-samples/dx-sdks-engineer
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/Bug Report.yml:
--------------------------------------------------------------------------------
1 | name: 🐞 Report a bug
2 | description: Have you found a bug or issue? Create a bug report for this sample
3 |
4 | body:
5 | - type: markdown
6 | attributes:
7 | value: |
8 | **Please do not report security vulnerabilities here**. The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues.
9 |
10 | - type: checkboxes
11 | id: checklist
12 | attributes:
13 | label: Checklist
14 | options:
15 | - label: I have looked into the [Readme](https://github.com/auth0-samples/auth0-ios-swift-sample/tree/master/Sample-01#readme) and have not found a suitable solution or answer.
16 | required: true
17 | - label: I have searched the [issues](https://github.com/auth0-samples/auth0-ios-swift-sample/issues) and have not found a suitable solution or answer.
18 | required: true
19 | - label: I have searched the [Auth0 Community](https://community.auth0.com) forums and have not found a suitable solution or answer.
20 | required: true
21 | - label: I agree to the terms within the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
22 | required: true
23 |
24 | - type: textarea
25 | id: description
26 | attributes:
27 | label: Description
28 | description: Provide a clear and concise description of the issue, including what you expected to happen.
29 | validations:
30 | required: true
31 |
32 | - type: textarea
33 | id: reproduction
34 | attributes:
35 | label: Reproduction
36 | description: Detail the steps taken to reproduce this error, and whether this issue can be reproduced consistently or if it is intermittent.
37 | placeholder: |
38 | 1. Step 1...
39 | 2. Step 2...
40 | 3. ...
41 | validations:
42 | required: true
43 |
44 | - type: textarea
45 | id: additional-context
46 | attributes:
47 | label: Additional context
48 | description: Any other relevant information you think would be useful.
49 | validations:
50 | required: false
51 |
52 | - type: dropdown
53 | id: environment-platform
54 | attributes:
55 | label: Platform
56 | multiple: true
57 | options:
58 | - iOS
59 | - iPadOS
60 | - macOS
61 | validations:
62 | required: true
63 |
64 | - type: input
65 | id: environment-platform-version
66 | attributes:
67 | label: Platform version(s)
68 | validations:
69 | required: false
70 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/Feature Request.yml:
--------------------------------------------------------------------------------
1 | name: 🧩 Feature request
2 | description: Suggest an idea or a feature for this sample
3 | labels: ["feature request"]
4 |
5 | body:
6 | - type: checkboxes
7 | id: checklist
8 | attributes:
9 | label: Checklist
10 | options:
11 | - label: I have looked into the [Readme](https://github.com/auth0-samples/auth0-ios-swift-sample/tree/master/Sample-01#readme) and have not found a suitable solution or answer.
12 | required: true
13 | - label: I have searched the [issues](https://github.com/auth0-samples/auth0-ios-swift-sample/issues) and have not found a suitable solution or answer.
14 | required: true
15 | - label: I have searched the [Auth0 Community](https://community.auth0.com) forums and have not found a suitable solution or answer.
16 | required: true
17 | - label: I agree to the terms within the [Auth0 Code of Conduct](https://github.com/auth0/open-source-template/blob/master/CODE-OF-CONDUCT.md).
18 | required: true
19 |
20 | - type: textarea
21 | id: description
22 | attributes:
23 | label: Describe the problem you'd like to have solved
24 | description: A clear and concise description of what the problem is.
25 | validations:
26 | required: true
27 |
28 | - type: textarea
29 | id: ideal-solution
30 | attributes:
31 | label: Describe the ideal solution
32 | description: A clear and concise description of what you want to happen.
33 | validations:
34 | required: true
35 |
36 | - type: textarea
37 | id: alternatives-and-workarounds
38 | attributes:
39 | label: Alternatives and current workarounds
40 | description: A clear and concise description of any alternatives you've considered or any workarounds that are currently in place.
41 | validations:
42 | required: false
43 |
44 | - type: textarea
45 | id: additional-context
46 | attributes:
47 | label: Additional context
48 | description: Add any other context or screenshots about the feature request here.
49 | validations:
50 | required: false
51 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: 🤔 Help & Questions
4 | url: https://community.auth0.com
5 | about: Ask general support or usage questions in the Auth0 Community forums.
6 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 |
6 |
7 | - [ ] All new/changed/fixed functionality is covered by tests (or N/A)
8 |
9 |
12 |
13 | ### 📋 Changes
14 |
15 |
21 |
22 | ### 📎 References
23 |
24 |
34 |
35 | ### 🎯 Testing
36 |
37 |
42 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Configuration for probot-stale - https://github.com/probot/stale
2 |
3 | # Number of days of inactivity before an Issue or Pull Request becomes stale
4 | daysUntilStale: 90
5 |
6 | # Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
7 | daysUntilClose: 7
8 |
9 | # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
10 | exemptLabels: []
11 |
12 | # Set to true to ignore issues with an assignee (defaults to false)
13 | exemptAssignees: true
14 |
15 | # Label to use when marking as stale
16 | staleLabel: closed:stale
17 |
18 | # Comment to post when marking as stale. Set to `false` to disable
19 | markComment: >
20 | This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. If you have not received a response for our team (apologies for the delay) and this is still a blocker, please reply with additional information or just a ping. Thank you for your contribution! 🙇♂️
--------------------------------------------------------------------------------
/.github/workflows/semgrep.yml:
--------------------------------------------------------------------------------
1 | name: Semgrep
2 |
3 | on:
4 | pull_request: {}
5 |
6 | push:
7 | branches: ["master", "main"]
8 |
9 | schedule:
10 | - cron: '30 0 1,15 * *'
11 |
12 | jobs:
13 | semgrep:
14 | name: Scan
15 | runs-on: ubuntu-latest
16 | container:
17 | image: returntocorp/semgrep
18 | # Skip any PR created by dependabot to avoid permission issues
19 | if: (github.actor != 'dependabot[bot]')
20 | steps:
21 | - uses: actions/checkout@v3
22 |
23 | - run: semgrep ci
24 | env:
25 | SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
26 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata
19 |
20 | ## Other
21 | *.xccheckout
22 | *.moved-aside
23 | *.xcuserstate
24 | *.xcscmblueprint
25 | *.DS_Store
26 |
27 | ## Obj-C/Swift specific
28 | *.hmap
29 | *.ipa
30 |
31 | ## Playgrounds
32 | timeline.xctimeline
33 | playground.xcworkspace
34 |
35 | # Swift Package Manager
36 | #
37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
38 | # Packages/
39 | .build/
40 | Package.resolved
41 |
42 | # CocoaPods
43 | #
44 | # We recommend against adding the Pods directory to your .gitignore. However
45 | # you should judge for yourself, the pros and cons are mentioned at:
46 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
47 | #
48 | # Pods/
49 |
50 | Podfile.lock
51 |
52 | # Carthage
53 | #
54 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
55 | # Carthage/Checkouts
56 |
57 | Carthage/Build
58 |
59 | # fastlane
60 | #
61 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
62 | # screenshots whenever they are needed.
63 | # For more information about the recommended setup visit:
64 | # https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md
65 |
66 | fastlane/report.xml
67 | fastlane/screenshots
68 |
69 | Auth0.plist
70 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2022 Auth0 Samples
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Auth0 Swift Samples
2 |
3 | This is the sample application for the [Auth0 Swift Quickstart](https://auth0.com/docs/quickstart/native/ios-swift) using the [Auth0.swift](https://github.com/auth0/Auth0.swift) SDK. The sample source code can be found in the [Sample-01 directory](Sample-01).
4 |
5 | ## Issue Reporting
6 |
7 | For general support or usage questions, use the [Auth0 Community](https://community.auth0.com/tags/c/sdks/5/swift) forums or raise a [support ticket](https://support.auth0.com/). Only [raise an issue](https://github.com/auth0-samples/auth0-ios-swift-sample/issues) if you have found a bug or want to request a feature.
8 |
9 | **Do not report security vulnerabilities on the public GitHub issue tracker.** The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues.
10 |
11 | ---
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | Auth0 is an easy-to-implement, adaptable authentication and authorization platform. To learn more check out Why Auth0?
22 |
23 | This project is licensed under the MIT license. See the LICENSE file for more info.
24 |
--------------------------------------------------------------------------------
/Sample-01/.swiftlint.yml:
--------------------------------------------------------------------------------
1 | opt_in_rules: # some rules are only opt-in
2 | - empty_count
3 | # Find all the available rules by running:
4 | # swiftlint rules
5 | included: # paths to include during linting. `--path` is ignored if present.
6 | - Sources
7 | # configurable rules can be customized from this configuration file
8 | # rules that have both warning and error levels, can set just the warning level
9 | # implicitly
10 | line_length: 120
11 | # they can set both implicitly with an array
12 | type_body_length:
13 | - 300 # warning
14 | - 400 # error
15 | type_name:
16 | min_length: 3 # only warning
17 | identifier_name:
18 | min_length: # only min_length
19 | warning: 3 # only error
20 | reporter: "xcode" # reporter type (xcode, json, csv, checkstyle, junit)
21 |
--------------------------------------------------------------------------------
/Sample-01/Auth0.plist.example:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Domain
6 | {DOMAIN}
7 | ClientId
8 | {CLIENT_ID}
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Sample-01/README.md:
--------------------------------------------------------------------------------
1 | # Swift Sample Application
2 |
3 | This sample application demonstrates the integration of the [Auth0.swift](https://github.com/auth0/Auth0.swift) SDK into a Swift iOS / macOS application. The sample is a companion to the [Auth0 Swift Quickstart](https://auth0.com/docs/quickstart/native/ios-swift).
4 |
5 | ## Requirements
6 |
7 | - iOS 15+ / macOS 11+
8 | - Xcode 14.x / 15.x
9 |
10 | > [!NOTE]
11 | > On iOS 17.4+ and macOS 14.4+ it is possible to use Universal Links as callback and logout URLs. Auth0.swift will fall back to using a custom URL scheme on older iOS / macOS versions.
12 | >
13 | > **This feature requires Xcode 15.3+ and a paid Apple Developer account**.
14 | >
15 | > If you do not have a paid Apple Developer account, skip **step 2** and comment out the two `useHTTPS()` calls in `MainView.swift`.
16 |
17 | > [!IMPORTANT]
18 | > On every step, if you have a [custom domain](https://auth0.com/docs/customize/custom-domains), replace the `YOUR_AUTH0_DOMAIN` and `{DOMAIN}` placeholders with your custom domain instead of the value from the settings page.
19 |
20 | ## Configuration
21 |
22 | ### 1. Configure the callback and logout URLs
23 |
24 | Go to the settings page of your [Auth0 application](https://manage.auth0.com/#/applications/) and add the following URLs to **Allowed Callback URLs** and **Allowed Logout URLs**, depending on the app target you want to run –either **SwiftSample (iOS)** or **SwiftSample (macOS)**.
25 |
26 | #### SwiftSample (iOS)
27 |
28 | ```text
29 | https://YOUR_AUTH0_DOMAIN/ios/YOUR_BUNDLE_IDENTIFIER/callback,
30 | YOUR_BUNDLE_IDENTIFIER://YOUR_AUTH0_DOMAIN/ios/YOUR_BUNDLE_IDENTIFIER/callback
31 | ```
32 |
33 | #### SwiftSample (macOS)
34 |
35 | ```text
36 | https://YOUR_AUTH0_DOMAIN/macos/YOUR_BUNDLE_IDENTIFIER/callback,
37 | YOUR_BUNDLE_IDENTIFIER://YOUR_AUTH0_DOMAIN/macos/YOUR_BUNDLE_IDENTIFIER/callback
38 | ```
39 |
40 |
41 | Example
42 |
43 | If your iOS bundle identifier were `com.example.MyApp` and your Auth0 Domain were `example.us.auth0.com`, then this value would be:
44 |
45 | ```text
46 | https://example.us.auth0.com/ios/com.example.MyApp/callback,
47 | com.example.MyApp://example.us.auth0.com/ios/com.example.MyApp/callback
48 | ```
49 |
50 |
51 | > [!IMPORTANT]
52 | > Make sure that the Auth0 application type is **Native**. Otherwise, you might run into errors due to the different configurations of other application types.
53 |
54 | ### 2. Configure the associated domain
55 |
56 | ### 2.1. Configure the entitlement
57 |
58 | Open `SwiftSample.xcodeproj` in Xcode and go to the settings of the app target you want to run. In the **Signing & Capabilities** tab, change the default bundle identifier from `com.auth0.samples.SwiftSample` to another value of your choosing. Then, ensure the **Automatically manage signing** box is checked, and that your Apple Team is selected.
59 |
60 | Under **Associated Domains**, find the following entry:
61 |
62 | ```text
63 | webcredentials:YOUR_AUTH0_DOMAIN
64 | ```
65 |
66 | Replace the `YOUR_AUTH0_DOMAIN` placeholder with the domain of your Auth0 application.
67 |
68 |
69 | Example
70 |
71 | If your Auth0 Domain were `example.us.auth0.com`, then this value would be:
72 |
73 | ```text
74 | webcredentials:example.us.auth0.com
75 | ```
76 |
77 |
78 | ### 2.2. Configure the Team ID and bundle identifier
79 |
80 | Open the settings page of your Auth0 application, scroll to the end, and open **Advanced Settings > Device Settings**. In the **iOS** section, set **Team ID** to your [Apple Team ID](https://developer.apple.com/help/account/manage-your-team/locate-your-team-id/), and **App ID** to the app's bundle identifier.
81 |
82 | 
83 |
84 | This will add the app to your Auth0 tenant's `apple-app-site-association` file.
85 |
86 | > [!NOTE]
87 | > For the associated domain to work, the app must be signed with your team certificate **even when building for the iOS simulator**. Make sure you are using the Apple Team whose Team ID is configured in the settings page of your Auth0 application.
88 |
89 | ### 3. Configure Auth0.swift
90 |
91 | Rename the `Auth0.plist.example` file to `Auth0.plist`, and replace the `{CLIENT_ID}` and `{DOMAIN}` placeholders with the Client ID and domain of your Auth0 application.
92 |
93 | ```xml
94 |
95 |
96 |
97 |
98 | ClientId
99 | {CLIENT_ID}
100 | Domain
101 | {DOMAIN}
102 |
103 |
104 | ```
105 |
106 | ## Issue Reporting
107 |
108 | For general support or usage questions, use the [Auth0 Community](https://community.auth0.com/tags/c/sdks/5/swift) forums or raise a [support ticket](https://support.auth0.com/). Only [raise an issue](https://github.com/auth0-samples/auth0-ios-swift-sample/issues) if you have found a bug or want to request a feature.
109 |
110 | **Do not report security vulnerabilities on the public GitHub issue tracker.** The [Responsible Disclosure Program](https://auth0.com/responsible-disclosure-policy) details the procedure for disclosing security issues.
111 |
112 | ---
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | Auth0 is an easy-to-implement, adaptable authentication and authorization platform. To learn more check out Why Auth0?
123 |
124 | This project is licensed under the MIT license. See the LICENSE file for more info.
125 |
--------------------------------------------------------------------------------
/Sample-01/Sources/MainView.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import Auth0
3 |
4 | struct MainView: View {
5 | @State var user: User?
6 |
7 | var body: some View {
8 | if let user = self.user {
9 | VStack {
10 | ProfileView(user: user)
11 | Button("Logout", action: self.logout)
12 | }
13 | } else {
14 | VStack {
15 | HeroView()
16 | Button("Login", action: self.login)
17 | }
18 | }
19 | }
20 | }
21 |
22 | extension MainView {
23 | func login() {
24 | Auth0
25 | .webAuth()
26 | .useHTTPS() // Use a Universal Link callback URL on iOS 17.4+ / macOS 14.4+
27 | .start { result in
28 | switch result {
29 | case .success(let credentials):
30 | self.user = User(from: credentials.idToken)
31 | case .failure(let error):
32 | print("Failed with: \(error)")
33 | }
34 | }
35 | }
36 |
37 | func logout() {
38 | Auth0
39 | .webAuth()
40 | .useHTTPS() // Use a Universal Link logout URL on iOS 17.4+ / macOS 14.4+
41 | .clearSession { result in
42 | switch result {
43 | case .success:
44 | self.user = nil
45 | case .failure(let error):
46 | print("Failed with: \(error)")
47 | }
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Sample-01/Sources/ProfileView.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 |
3 | struct ProfileView: View {
4 | let user: User
5 |
6 | var body: some View {
7 | List {
8 | Section(header: ProfileHeader(picture: user.picture)) {
9 | ProfileCell(key: "ID", value: user.id)
10 | ProfileCell(key: "Name", value: user.name)
11 | ProfileCell(key: "Email", value: user.email)
12 | ProfileCell(key: "Email verified?", value: user.emailVerified)
13 | ProfileCell(key: "Updated at", value: user.updatedAt)
14 | }
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/App.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 |
3 | @main
4 | struct SwiftSampleApp: App {
5 | var body: some Scene {
6 | WindowGroup {
7 | MainView()
8 | #if os(iOS)
9 | .padding(.bottom, 16)
10 | .ignoresSafeArea(.keyboard, edges: .bottom)
11 | .background(Color("Background").ignoresSafeArea())
12 | .buttonStyle(PrimaryButtonStyle())
13 | .onAppear {
14 | UITableView.appearance().backgroundColor = .clear
15 | UITableView.appearance().bounces = false
16 | }
17 | #else
18 | .padding(.bottom, 32)
19 | .frame(maxWidth: 400, maxHeight: 300)
20 | #endif
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | },
93 | {
94 | "idiom" : "mac",
95 | "scale" : "1x",
96 | "size" : "16x16"
97 | },
98 | {
99 | "idiom" : "mac",
100 | "scale" : "2x",
101 | "size" : "16x16"
102 | },
103 | {
104 | "idiom" : "mac",
105 | "scale" : "1x",
106 | "size" : "32x32"
107 | },
108 | {
109 | "idiom" : "mac",
110 | "scale" : "2x",
111 | "size" : "32x32"
112 | },
113 | {
114 | "idiom" : "mac",
115 | "scale" : "1x",
116 | "size" : "128x128"
117 | },
118 | {
119 | "idiom" : "mac",
120 | "scale" : "2x",
121 | "size" : "128x128"
122 | },
123 | {
124 | "idiom" : "mac",
125 | "scale" : "1x",
126 | "size" : "256x256"
127 | },
128 | {
129 | "idiom" : "mac",
130 | "scale" : "2x",
131 | "size" : "256x256"
132 | },
133 | {
134 | "idiom" : "mac",
135 | "scale" : "1x",
136 | "size" : "512x512"
137 | },
138 | {
139 | "idiom" : "mac",
140 | "scale" : "2x",
141 | "size" : "512x512"
142 | }
143 | ],
144 | "info" : {
145 | "author" : "xcode",
146 | "version" : 1
147 | }
148 | }
149 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/Auth0.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "auth0.svg",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | },
12 | "properties" : {
13 | "preserves-vector-representation" : true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/Auth0.imageset/auth0.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/Background.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "250",
9 | "green" : "247",
10 | "red" : "246"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/Grey.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "53",
9 | "green" : "46",
10 | "red" : "42"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/Orange.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "64",
9 | "green" : "79",
10 | "red" : "255"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Assets.xcassets/Pink.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "color" : {
5 | "color-space" : "srgb",
6 | "components" : {
7 | "alpha" : "1.000",
8 | "blue" : "221",
9 | "green" : "68",
10 | "red" : "255"
11 | }
12 | },
13 | "idiom" : "universal"
14 | }
15 | ],
16 | "info" : {
17 | "author" : "xcode",
18 | "version" : 1
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/Views.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 |
3 | struct HeroView: View {
4 | private let tracking: CGFloat = -4
5 |
6 | var body: some View {
7 | #if os(iOS)
8 | Image("Auth0")
9 | .resizable()
10 | .aspectRatio(contentMode: .fit)
11 | .frame(width: 25, height: 28, alignment: .center)
12 | .padding(.top, 8)
13 | VStack(alignment: .leading, spacing: -32) {
14 | Text("Swift")
15 | .tracking(self.tracking)
16 | .foregroundStyle(
17 | .linearGradient(
18 | colors: [Color("Orange"), Color("Pink")],
19 | startPoint: .topLeading,
20 | endPoint: .bottomTrailing
21 | ))
22 | Text("Sample")
23 | .tracking(self.tracking)
24 | Text("App")
25 | .tracking(self.tracking)
26 | }
27 | .frame(maxWidth: .infinity, maxHeight: .infinity)
28 | .font(.custom("SpaceGrotesk-Medium", size: 80))
29 | #else
30 | Text("Swift Sample App")
31 | .font(.title)
32 | #endif
33 | }
34 | }
35 |
36 | struct ProfileHeader: View {
37 | @State var picture: String
38 |
39 | private let size: CGFloat = 100
40 |
41 | var body: some View {
42 | #if os(iOS)
43 | AsyncImage(url: URL(string: picture), content: { image in
44 | image.resizable()
45 | }, placeholder: {
46 | Color.clear
47 | })
48 | .frame(width: self.size, height: self.size)
49 | .clipShape(Circle())
50 | .padding(.bottom, 24)
51 | #else
52 | Text("Profile")
53 | #endif
54 | }
55 | }
56 |
57 | struct ProfileCell: View {
58 | @State var key: String
59 | @State var value: String
60 |
61 | private let size: CGFloat = 14
62 |
63 | var body: some View {
64 | HStack {
65 | Text(key)
66 | .font(.system(size: self.size, weight: .semibold))
67 | Spacer()
68 | Text(value)
69 | .font(.system(size: self.size, weight: .regular))
70 | #if os(iOS)
71 | .foregroundColor(Color("Grey"))
72 | #endif
73 | }
74 | #if os(iOS)
75 | .listRowBackground(Color.white)
76 | #endif
77 | }
78 | }
79 |
80 | struct PrimaryButtonStyle: ButtonStyle {
81 | private let padding: CGFloat = 8
82 |
83 | func makeBody(configuration: Configuration) -> some View {
84 | configuration.label
85 | .font(.system(size: 14, weight: .semibold))
86 | .padding(.init(top: self.padding,
87 | leading: self.padding * 6,
88 | bottom: self.padding,
89 | trailing: self.padding * 6))
90 | .background(Color.black)
91 | .foregroundColor(.white)
92 | .clipShape(RoundedRectangle(cornerRadius: 8))
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/iOS/SpaceGrotesk.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/auth0-samples/auth0-ios-swift-sample/788b50cf262b08aac4143670b187503387705583/Sample-01/Sources/Supporting Files/iOS/SpaceGrotesk.ttf
--------------------------------------------------------------------------------
/Sample-01/Sources/Supporting Files/macOS/macOS.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.developer.associated-domains
6 |
7 | webcredentials:YOUR_AUTH0_DOMAIN
8 |
9 | com.apple.security.app-sandbox
10 |
11 | com.apple.security.files.user-selected.read-only
12 |
13 | com.apple.security.network.client
14 |
15 | com.apple.security.network.server
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Sample-01/Sources/User.swift:
--------------------------------------------------------------------------------
1 | import JWTDecode
2 |
3 | struct User {
4 | let id: String
5 | let name: String
6 | let email: String
7 | let emailVerified: String
8 | let picture: String
9 | let updatedAt: String
10 | }
11 |
12 | extension User {
13 | init?(from idToken: String) {
14 | guard let jwt = try? decode(jwt: idToken),
15 | let id = jwt.subject,
16 | let name = jwt["name"].string,
17 | let email = jwt["email"].string,
18 | let emailVerified = jwt["email_verified"].boolean,
19 | let picture = jwt["picture"].string,
20 | let updatedAt = jwt["updated_at"].string else {
21 | return nil
22 | }
23 | self.id = id
24 | self.name = name
25 | self.email = email
26 | self.emailVerified = String(describing: emailVerified)
27 | self.picture = picture
28 | self.updatedAt = updatedAt
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Sample-01/SwiftSample (iOS).entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.developer.associated-domains
6 |
7 | webcredentials:YOUR_AUTH0_DOMAIN
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Sample-01/SwiftSample--iOS--Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleURLTypes
6 |
7 |
8 | CFBundleTypeRole
9 | Editor
10 | CFBundleURLName
11 | auth0
12 | CFBundleURLSchemes
13 |
14 | $(PRODUCT_BUNDLE_IDENTIFIER)
15 |
16 |
17 |
18 | UIAppFonts
19 |
20 | SpaceGrotesk.ttf
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/Sample-01/SwiftSample.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 55;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 5C5DBE83277210B400E19935 /* Auth0 in Frameworks */ = {isa = PBXBuildFile; productRef = 5C5DBE82277210B400E19935 /* Auth0 */; };
11 | 5C5DBE86277210C100E19935 /* Auth0 in Frameworks */ = {isa = PBXBuildFile; productRef = 5C5DBE85277210C100E19935 /* Auth0 */; };
12 | 5C5DBE88277212E000E19935 /* Auth0.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5C5DBE87277212E000E19935 /* Auth0.plist */; };
13 | 5C5DBE89277212E000E19935 /* Auth0.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5C5DBE87277212E000E19935 /* Auth0.plist */; };
14 | 5C6537242772F5D90035759D /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6537232772F5D90035759D /* ProfileView.swift */; };
15 | 5C6537252772F5D90035759D /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6537232772F5D90035759D /* ProfileView.swift */; };
16 | 5C6537272772F5EE0035759D /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6537262772F5EE0035759D /* User.swift */; };
17 | 5C6537282772F5EE0035759D /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6537262772F5EE0035759D /* User.swift */; };
18 | 5C78D9C127740963000B4B71 /* Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C78D9C027740963000B4B71 /* Views.swift */; };
19 | 5C78D9C227740975000B4B71 /* Views.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C78D9C027740963000B4B71 /* Views.swift */; };
20 | 5CD3A4642784F5F900B67D88 /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = 5CD3A4632784F5F900B67D88 /* ViewInspector */; };
21 | 5CD3A4672784F61200B67D88 /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = 5CD3A4662784F61200B67D88 /* ViewInspector */; };
22 | 5CD3A46B27850B9000B67D88 /* HeroViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A46A27850B9000B67D88 /* HeroViewTests.swift */; };
23 | 5CD3A46D27850BA200B67D88 /* HeroViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A46C27850BA200B67D88 /* HeroViewTests.swift */; };
24 | 5CD3A470278510C600B67D88 /* ProfileHeaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A46E2785107000B67D88 /* ProfileHeaderTests.swift */; };
25 | 5CD3A47227851EF500B67D88 /* ProfileHeaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A47127851EF500B67D88 /* ProfileHeaderTests.swift */; };
26 | 5CD3A4742785217600B67D88 /* ProfileCellTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A4732785217600B67D88 /* ProfileCellTests.swift */; };
27 | 5CD3A476278522C600B67D88 /* ProfileCellTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A4732785217600B67D88 /* ProfileCellTests.swift */; };
28 | 5CD3A4782785237000B67D88 /* ProfileViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A4772785237000B67D88 /* ProfileViewTests.swift */; };
29 | 5CD3A4792785237000B67D88 /* ProfileViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A4772785237000B67D88 /* ProfileViewTests.swift */; };
30 | 5CD3A4832785EB1000B67D88 /* UserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A4822785EB1000B67D88 /* UserTests.swift */; };
31 | 5CD3A4842785EB1000B67D88 /* UserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A4822785EB1000B67D88 /* UserTests.swift */; };
32 | 5CD3A48F2788DFCD00B67D88 /* SmokeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CD3A48E2788DFCD00B67D88 /* SmokeTests.swift */; };
33 | 5CDD8865277102DC00052307 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDD8855277102DA00052307 /* App.swift */; };
34 | 5CDD8866277102DC00052307 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDD8855277102DA00052307 /* App.swift */; };
35 | 5CDD8867277102DC00052307 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDD8856277102DA00052307 /* MainView.swift */; };
36 | 5CDD8868277102DC00052307 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDD8856277102DA00052307 /* MainView.swift */; };
37 | 5CDD8869277102DC00052307 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CDD8857277102DC00052307 /* Assets.xcassets */; };
38 | 5CDD886A277102DC00052307 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CDD8857277102DC00052307 /* Assets.xcassets */; };
39 | D569776D278D97D3008E6498 /* SpaceGrotesk.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D569776C278D97D3008E6498 /* SpaceGrotesk.ttf */; };
40 | /* End PBXBuildFile section */
41 |
42 | /* Begin PBXContainerItemProxy section */
43 | 5CD3A44D2784E54E00B67D88 /* PBXContainerItemProxy */ = {
44 | isa = PBXContainerItemProxy;
45 | containerPortal = 5CDD8850277102DA00052307 /* Project object */;
46 | proxyType = 1;
47 | remoteGlobalIDString = 5CDD885B277102DC00052307;
48 | remoteInfo = "SwiftSample (iOS)";
49 | };
50 | 5CD3A45B2784E5BC00B67D88 /* PBXContainerItemProxy */ = {
51 | isa = PBXContainerItemProxy;
52 | containerPortal = 5CDD8850277102DA00052307 /* Project object */;
53 | proxyType = 1;
54 | remoteGlobalIDString = 5CDD8861277102DC00052307;
55 | remoteInfo = "SwiftSample (macOS)";
56 | };
57 | 5CD3A4902788DFCD00B67D88 /* PBXContainerItemProxy */ = {
58 | isa = PBXContainerItemProxy;
59 | containerPortal = 5CDD8850277102DA00052307 /* Project object */;
60 | proxyType = 1;
61 | remoteGlobalIDString = 5CDD885B277102DC00052307;
62 | remoteInfo = "SwiftSample (iOS)";
63 | };
64 | /* End PBXContainerItemProxy section */
65 |
66 | /* Begin PBXFileReference section */
67 | 5C5DBE87277212E000E19935 /* Auth0.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Auth0.plist; path = ../Auth0.plist; sourceTree = ""; };
68 | 5C6537232772F5D90035759D /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = ""; };
69 | 5C6537262772F5EE0035759D /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = ""; };
70 | 5C78D9C027740963000B4B71 /* Views.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Views.swift; sourceTree = ""; };
71 | 5CA7AC192B893232008EBDCF /* SwiftSample (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SwiftSample (iOS).entitlements"; sourceTree = ""; };
72 | 5CD3A4492784E54E00B67D88 /* SwiftSampleTests (iOS).xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftSampleTests (iOS).xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
73 | 5CD3A4572784E5BC00B67D88 /* SwiftSampleTests (macOS).xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftSampleTests (macOS).xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
74 | 5CD3A46A27850B9000B67D88 /* HeroViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroViewTests.swift; sourceTree = ""; };
75 | 5CD3A46C27850BA200B67D88 /* HeroViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeroViewTests.swift; sourceTree = ""; };
76 | 5CD3A46E2785107000B67D88 /* ProfileHeaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileHeaderTests.swift; sourceTree = ""; };
77 | 5CD3A47127851EF500B67D88 /* ProfileHeaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileHeaderTests.swift; sourceTree = ""; };
78 | 5CD3A4732785217600B67D88 /* ProfileCellTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileCellTests.swift; sourceTree = ""; };
79 | 5CD3A4772785237000B67D88 /* ProfileViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewTests.swift; sourceTree = ""; };
80 | 5CD3A4822785EB1000B67D88 /* UserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTests.swift; sourceTree = ""; };
81 | 5CD3A48A2788DFCD00B67D88 /* SwiftSampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftSampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
82 | 5CD3A48E2788DFCD00B67D88 /* SmokeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmokeTests.swift; sourceTree = ""; };
83 | 5CDD8855277102DA00052307 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; };
84 | 5CDD8856277102DA00052307 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; };
85 | 5CDD8857277102DC00052307 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
86 | 5CDD885C277102DC00052307 /* SwiftSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftSample.app; sourceTree = BUILT_PRODUCTS_DIR; };
87 | 5CDD8862277102DC00052307 /* SwiftSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftSample.app; sourceTree = BUILT_PRODUCTS_DIR; };
88 | 5CDD8864277102DC00052307 /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = ""; };
89 | D569776C278D97D3008E6498 /* SpaceGrotesk.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = SpaceGrotesk.ttf; sourceTree = ""; };
90 | /* End PBXFileReference section */
91 |
92 | /* Begin PBXFrameworksBuildPhase section */
93 | 5CD3A4462784E54E00B67D88 /* Frameworks */ = {
94 | isa = PBXFrameworksBuildPhase;
95 | buildActionMask = 2147483647;
96 | files = (
97 | 5CD3A4642784F5F900B67D88 /* ViewInspector in Frameworks */,
98 | );
99 | runOnlyForDeploymentPostprocessing = 0;
100 | };
101 | 5CD3A4542784E5BC00B67D88 /* Frameworks */ = {
102 | isa = PBXFrameworksBuildPhase;
103 | buildActionMask = 2147483647;
104 | files = (
105 | 5CD3A4672784F61200B67D88 /* ViewInspector in Frameworks */,
106 | );
107 | runOnlyForDeploymentPostprocessing = 0;
108 | };
109 | 5CD3A4872788DFCD00B67D88 /* Frameworks */ = {
110 | isa = PBXFrameworksBuildPhase;
111 | buildActionMask = 2147483647;
112 | files = (
113 | );
114 | runOnlyForDeploymentPostprocessing = 0;
115 | };
116 | 5CDD8859277102DC00052307 /* Frameworks */ = {
117 | isa = PBXFrameworksBuildPhase;
118 | buildActionMask = 2147483647;
119 | files = (
120 | 5C5DBE83277210B400E19935 /* Auth0 in Frameworks */,
121 | );
122 | runOnlyForDeploymentPostprocessing = 0;
123 | };
124 | 5CDD885F277102DC00052307 /* Frameworks */ = {
125 | isa = PBXFrameworksBuildPhase;
126 | buildActionMask = 2147483647;
127 | files = (
128 | 5C5DBE86277210C100E19935 /* Auth0 in Frameworks */,
129 | );
130 | runOnlyForDeploymentPostprocessing = 0;
131 | };
132 | /* End PBXFrameworksBuildPhase section */
133 |
134 | /* Begin PBXGroup section */
135 | 5C5DBE8A277217D800E19935 /* Sources */ = {
136 | isa = PBXGroup;
137 | children = (
138 | 5C78D9BF2774093F000B4B71 /* Supporting Files */,
139 | 5CDD8856277102DA00052307 /* MainView.swift */,
140 | 5C6537232772F5D90035759D /* ProfileView.swift */,
141 | 5C6537262772F5EE0035759D /* User.swift */,
142 | 5C5DBE87277212E000E19935 /* Auth0.plist */,
143 | );
144 | path = Sources;
145 | sourceTree = "";
146 | };
147 | 5C65372C2773FCFA0035759D /* iOS */ = {
148 | isa = PBXGroup;
149 | children = (
150 | 5CA7AC192B893232008EBDCF /* SwiftSample (iOS).entitlements */,
151 | D569776C278D97D3008E6498 /* SpaceGrotesk.ttf */,
152 | );
153 | path = iOS;
154 | sourceTree = "";
155 | };
156 | 5C78D9BF2774093F000B4B71 /* Supporting Files */ = {
157 | isa = PBXGroup;
158 | children = (
159 | 5C65372C2773FCFA0035759D /* iOS */,
160 | 5CDD8863277102DC00052307 /* macOS */,
161 | 5CDD8855277102DA00052307 /* App.swift */,
162 | 5C78D9C027740963000B4B71 /* Views.swift */,
163 | 5CDD8857277102DC00052307 /* Assets.xcassets */,
164 | );
165 | path = "Supporting Files";
166 | sourceTree = "";
167 | };
168 | 5CD3A4522784E56300B67D88 /* Tests */ = {
169 | isa = PBXGroup;
170 | children = (
171 | 5CD3A475278522A800B67D88 /* Shared */,
172 | 5CD3A46827850B4F00B67D88 /* iOS */,
173 | 5CD3A46927850B5400B67D88 /* macOS */,
174 | );
175 | path = Tests;
176 | sourceTree = "";
177 | };
178 | 5CD3A46827850B4F00B67D88 /* iOS */ = {
179 | isa = PBXGroup;
180 | children = (
181 | 5CD3A46A27850B9000B67D88 /* HeroViewTests.swift */,
182 | 5CD3A46E2785107000B67D88 /* ProfileHeaderTests.swift */,
183 | );
184 | path = iOS;
185 | sourceTree = "";
186 | };
187 | 5CD3A46927850B5400B67D88 /* macOS */ = {
188 | isa = PBXGroup;
189 | children = (
190 | 5CD3A46C27850BA200B67D88 /* HeroViewTests.swift */,
191 | 5CD3A47127851EF500B67D88 /* ProfileHeaderTests.swift */,
192 | );
193 | path = macOS;
194 | sourceTree = "";
195 | };
196 | 5CD3A475278522A800B67D88 /* Shared */ = {
197 | isa = PBXGroup;
198 | children = (
199 | 5CD3A4772785237000B67D88 /* ProfileViewTests.swift */,
200 | 5CD3A4732785217600B67D88 /* ProfileCellTests.swift */,
201 | 5CD3A4822785EB1000B67D88 /* UserTests.swift */,
202 | );
203 | path = Shared;
204 | sourceTree = "";
205 | };
206 | 5CD3A48B2788DFCD00B67D88 /* UITests */ = {
207 | isa = PBXGroup;
208 | children = (
209 | 5CD3A48E2788DFCD00B67D88 /* SmokeTests.swift */,
210 | );
211 | path = UITests;
212 | sourceTree = "";
213 | };
214 | 5CDD884F277102DA00052307 = {
215 | isa = PBXGroup;
216 | children = (
217 | 5C5DBE8A277217D800E19935 /* Sources */,
218 | 5CD3A4522784E56300B67D88 /* Tests */,
219 | 5CD3A48B2788DFCD00B67D88 /* UITests */,
220 | 5CDD885D277102DC00052307 /* Products */,
221 | );
222 | sourceTree = "";
223 | };
224 | 5CDD885D277102DC00052307 /* Products */ = {
225 | isa = PBXGroup;
226 | children = (
227 | 5CDD885C277102DC00052307 /* SwiftSample.app */,
228 | 5CDD8862277102DC00052307 /* SwiftSample.app */,
229 | 5CD3A4492784E54E00B67D88 /* SwiftSampleTests (iOS).xctest */,
230 | 5CD3A4572784E5BC00B67D88 /* SwiftSampleTests (macOS).xctest */,
231 | 5CD3A48A2788DFCD00B67D88 /* SwiftSampleUITests.xctest */,
232 | );
233 | name = Products;
234 | sourceTree = "";
235 | };
236 | 5CDD8863277102DC00052307 /* macOS */ = {
237 | isa = PBXGroup;
238 | children = (
239 | 5CDD8864277102DC00052307 /* macOS.entitlements */,
240 | );
241 | path = macOS;
242 | sourceTree = "";
243 | };
244 | /* End PBXGroup section */
245 |
246 | /* Begin PBXNativeTarget section */
247 | 5CD3A4482784E54E00B67D88 /* SwiftSampleTests (iOS) */ = {
248 | isa = PBXNativeTarget;
249 | buildConfigurationList = 5CD3A4512784E54E00B67D88 /* Build configuration list for PBXNativeTarget "SwiftSampleTests (iOS)" */;
250 | buildPhases = (
251 | 5CD3A4452784E54E00B67D88 /* Sources */,
252 | 5CD3A4462784E54E00B67D88 /* Frameworks */,
253 | 5CD3A4472784E54E00B67D88 /* Resources */,
254 | );
255 | buildRules = (
256 | );
257 | dependencies = (
258 | 5CD3A44E2784E54E00B67D88 /* PBXTargetDependency */,
259 | );
260 | name = "SwiftSampleTests (iOS)";
261 | packageProductDependencies = (
262 | 5CD3A4632784F5F900B67D88 /* ViewInspector */,
263 | );
264 | productName = "SwiftSampleTests (iOS)";
265 | productReference = 5CD3A4492784E54E00B67D88 /* SwiftSampleTests (iOS).xctest */;
266 | productType = "com.apple.product-type.bundle.unit-test";
267 | };
268 | 5CD3A4562784E5BC00B67D88 /* SwiftSampleTests (macOS) */ = {
269 | isa = PBXNativeTarget;
270 | buildConfigurationList = 5CD3A45D2784E5BC00B67D88 /* Build configuration list for PBXNativeTarget "SwiftSampleTests (macOS)" */;
271 | buildPhases = (
272 | 5CD3A4532784E5BC00B67D88 /* Sources */,
273 | 5CD3A4542784E5BC00B67D88 /* Frameworks */,
274 | 5CD3A4552784E5BC00B67D88 /* Resources */,
275 | );
276 | buildRules = (
277 | );
278 | dependencies = (
279 | 5CD3A45C2784E5BC00B67D88 /* PBXTargetDependency */,
280 | );
281 | name = "SwiftSampleTests (macOS)";
282 | packageProductDependencies = (
283 | 5CD3A4662784F61200B67D88 /* ViewInspector */,
284 | );
285 | productName = "SwiftSampleTests (macOS)";
286 | productReference = 5CD3A4572784E5BC00B67D88 /* SwiftSampleTests (macOS).xctest */;
287 | productType = "com.apple.product-type.bundle.unit-test";
288 | };
289 | 5CD3A4892788DFCD00B67D88 /* SwiftSampleUITests */ = {
290 | isa = PBXNativeTarget;
291 | buildConfigurationList = 5CD3A4942788DFCD00B67D88 /* Build configuration list for PBXNativeTarget "SwiftSampleUITests" */;
292 | buildPhases = (
293 | 5CD3A4862788DFCD00B67D88 /* Sources */,
294 | 5CD3A4872788DFCD00B67D88 /* Frameworks */,
295 | 5CD3A4882788DFCD00B67D88 /* Resources */,
296 | );
297 | buildRules = (
298 | );
299 | dependencies = (
300 | 5CD3A4912788DFCD00B67D88 /* PBXTargetDependency */,
301 | );
302 | name = SwiftSampleUITests;
303 | productName = "SwiftSampleUITests (iOS)";
304 | productReference = 5CD3A48A2788DFCD00B67D88 /* SwiftSampleUITests.xctest */;
305 | productType = "com.apple.product-type.bundle.ui-testing";
306 | };
307 | 5CDD885B277102DC00052307 /* SwiftSample (iOS) */ = {
308 | isa = PBXNativeTarget;
309 | buildConfigurationList = 5CDD886D277102DC00052307 /* Build configuration list for PBXNativeTarget "SwiftSample (iOS)" */;
310 | buildPhases = (
311 | 5CDD8858277102DC00052307 /* Sources */,
312 | 5CDD8859277102DC00052307 /* Frameworks */,
313 | 5CDD885A277102DC00052307 /* Resources */,
314 | 5C64E0E62774E805008D6599 /* SwiftLint */,
315 | );
316 | buildRules = (
317 | );
318 | dependencies = (
319 | );
320 | name = "SwiftSample (iOS)";
321 | packageProductDependencies = (
322 | 5C5DBE82277210B400E19935 /* Auth0 */,
323 | );
324 | productName = "SwiftSample (iOS)";
325 | productReference = 5CDD885C277102DC00052307 /* SwiftSample.app */;
326 | productType = "com.apple.product-type.application";
327 | };
328 | 5CDD8861277102DC00052307 /* SwiftSample (macOS) */ = {
329 | isa = PBXNativeTarget;
330 | buildConfigurationList = 5CDD8870277102DC00052307 /* Build configuration list for PBXNativeTarget "SwiftSample (macOS)" */;
331 | buildPhases = (
332 | 5CDD885E277102DC00052307 /* Sources */,
333 | 5CDD885F277102DC00052307 /* Frameworks */,
334 | 5CDD8860277102DC00052307 /* Resources */,
335 | 5C64E0E72774E85D008D6599 /* SwiftLint */,
336 | );
337 | buildRules = (
338 | );
339 | dependencies = (
340 | );
341 | name = "SwiftSample (macOS)";
342 | packageProductDependencies = (
343 | 5C5DBE85277210C100E19935 /* Auth0 */,
344 | );
345 | productName = "SwiftSample (macOS)";
346 | productReference = 5CDD8862277102DC00052307 /* SwiftSample.app */;
347 | productType = "com.apple.product-type.application";
348 | };
349 | /* End PBXNativeTarget section */
350 |
351 | /* Begin PBXProject section */
352 | 5CDD8850277102DA00052307 /* Project object */ = {
353 | isa = PBXProject;
354 | attributes = {
355 | BuildIndependentTargetsInParallel = 1;
356 | LastSwiftUpdateCheck = 1320;
357 | LastUpgradeCheck = 1400;
358 | TargetAttributes = {
359 | 5CD3A4482784E54E00B67D88 = {
360 | CreatedOnToolsVersion = 13.2.1;
361 | TestTargetID = 5CDD885B277102DC00052307;
362 | };
363 | 5CD3A4562784E5BC00B67D88 = {
364 | CreatedOnToolsVersion = 13.2.1;
365 | TestTargetID = 5CDD8861277102DC00052307;
366 | };
367 | 5CD3A4892788DFCD00B67D88 = {
368 | CreatedOnToolsVersion = 13.2.1;
369 | TestTargetID = 5CDD885B277102DC00052307;
370 | };
371 | 5CDD885B277102DC00052307 = {
372 | CreatedOnToolsVersion = 13.2;
373 | };
374 | 5CDD8861277102DC00052307 = {
375 | CreatedOnToolsVersion = 13.2;
376 | };
377 | };
378 | };
379 | buildConfigurationList = 5CDD8853277102DA00052307 /* Build configuration list for PBXProject "SwiftSample" */;
380 | compatibilityVersion = "Xcode 13.0";
381 | developmentRegion = en;
382 | hasScannedForEncodings = 0;
383 | knownRegions = (
384 | en,
385 | Base,
386 | );
387 | mainGroup = 5CDD884F277102DA00052307;
388 | packageReferences = (
389 | 5C5DBE81277210B400E19935 /* XCRemoteSwiftPackageReference "Auth0.swift" */,
390 | 5CD3A4622784F5F900B67D88 /* XCRemoteSwiftPackageReference "ViewInspector" */,
391 | );
392 | productRefGroup = 5CDD885D277102DC00052307 /* Products */;
393 | projectDirPath = "";
394 | projectRoot = "";
395 | targets = (
396 | 5CDD885B277102DC00052307 /* SwiftSample (iOS) */,
397 | 5CDD8861277102DC00052307 /* SwiftSample (macOS) */,
398 | 5CD3A4482784E54E00B67D88 /* SwiftSampleTests (iOS) */,
399 | 5CD3A4562784E5BC00B67D88 /* SwiftSampleTests (macOS) */,
400 | 5CD3A4892788DFCD00B67D88 /* SwiftSampleUITests */,
401 | );
402 | };
403 | /* End PBXProject section */
404 |
405 | /* Begin PBXResourcesBuildPhase section */
406 | 5CD3A4472784E54E00B67D88 /* Resources */ = {
407 | isa = PBXResourcesBuildPhase;
408 | buildActionMask = 2147483647;
409 | files = (
410 | );
411 | runOnlyForDeploymentPostprocessing = 0;
412 | };
413 | 5CD3A4552784E5BC00B67D88 /* Resources */ = {
414 | isa = PBXResourcesBuildPhase;
415 | buildActionMask = 2147483647;
416 | files = (
417 | );
418 | runOnlyForDeploymentPostprocessing = 0;
419 | };
420 | 5CD3A4882788DFCD00B67D88 /* Resources */ = {
421 | isa = PBXResourcesBuildPhase;
422 | buildActionMask = 2147483647;
423 | files = (
424 | );
425 | runOnlyForDeploymentPostprocessing = 0;
426 | };
427 | 5CDD885A277102DC00052307 /* Resources */ = {
428 | isa = PBXResourcesBuildPhase;
429 | buildActionMask = 2147483647;
430 | files = (
431 | 5CDD8869277102DC00052307 /* Assets.xcassets in Resources */,
432 | 5C5DBE88277212E000E19935 /* Auth0.plist in Resources */,
433 | D569776D278D97D3008E6498 /* SpaceGrotesk.ttf in Resources */,
434 | );
435 | runOnlyForDeploymentPostprocessing = 0;
436 | };
437 | 5CDD8860277102DC00052307 /* Resources */ = {
438 | isa = PBXResourcesBuildPhase;
439 | buildActionMask = 2147483647;
440 | files = (
441 | 5CDD886A277102DC00052307 /* Assets.xcassets in Resources */,
442 | 5C5DBE89277212E000E19935 /* Auth0.plist in Resources */,
443 | );
444 | runOnlyForDeploymentPostprocessing = 0;
445 | };
446 | /* End PBXResourcesBuildPhase section */
447 |
448 | /* Begin PBXShellScriptBuildPhase section */
449 | 5C64E0E62774E805008D6599 /* SwiftLint */ = {
450 | isa = PBXShellScriptBuildPhase;
451 | alwaysOutOfDate = 1;
452 | buildActionMask = 2147483647;
453 | files = (
454 | );
455 | inputFileListPaths = (
456 | );
457 | inputPaths = (
458 | );
459 | name = SwiftLint;
460 | outputFileListPaths = (
461 | );
462 | outputPaths = (
463 | );
464 | runOnlyForDeploymentPostprocessing = 0;
465 | shellPath = /bin/sh;
466 | shellScript = "if [[ \"${CONFIGURATION}\" = \"Debug\" ]] && [ -z ${CIRCLECI} ] && which swiftlint >/dev/null; then\n swiftlint\nfi\n";
467 | };
468 | 5C64E0E72774E85D008D6599 /* SwiftLint */ = {
469 | isa = PBXShellScriptBuildPhase;
470 | buildActionMask = 2147483647;
471 | files = (
472 | );
473 | inputFileListPaths = (
474 | );
475 | inputPaths = (
476 | );
477 | name = SwiftLint;
478 | outputFileListPaths = (
479 | );
480 | outputPaths = (
481 | );
482 | runOnlyForDeploymentPostprocessing = 0;
483 | shellPath = /bin/sh;
484 | shellScript = "if [[ \"${CONFIGURATION}\" = \"Debug\" ]] && [ -z ${CIRCLECI} ] && which swiftlint >/dev/null; then\n swiftlint\nfi\n";
485 | };
486 | /* End PBXShellScriptBuildPhase section */
487 |
488 | /* Begin PBXSourcesBuildPhase section */
489 | 5CD3A4452784E54E00B67D88 /* Sources */ = {
490 | isa = PBXSourcesBuildPhase;
491 | buildActionMask = 2147483647;
492 | files = (
493 | 5CD3A46B27850B9000B67D88 /* HeroViewTests.swift in Sources */,
494 | 5CD3A4742785217600B67D88 /* ProfileCellTests.swift in Sources */,
495 | 5CD3A4782785237000B67D88 /* ProfileViewTests.swift in Sources */,
496 | 5CD3A470278510C600B67D88 /* ProfileHeaderTests.swift in Sources */,
497 | 5CD3A4832785EB1000B67D88 /* UserTests.swift in Sources */,
498 | );
499 | runOnlyForDeploymentPostprocessing = 0;
500 | };
501 | 5CD3A4532784E5BC00B67D88 /* Sources */ = {
502 | isa = PBXSourcesBuildPhase;
503 | buildActionMask = 2147483647;
504 | files = (
505 | 5CD3A4792785237000B67D88 /* ProfileViewTests.swift in Sources */,
506 | 5CD3A476278522C600B67D88 /* ProfileCellTests.swift in Sources */,
507 | 5CD3A47227851EF500B67D88 /* ProfileHeaderTests.swift in Sources */,
508 | 5CD3A46D27850BA200B67D88 /* HeroViewTests.swift in Sources */,
509 | 5CD3A4842785EB1000B67D88 /* UserTests.swift in Sources */,
510 | );
511 | runOnlyForDeploymentPostprocessing = 0;
512 | };
513 | 5CD3A4862788DFCD00B67D88 /* Sources */ = {
514 | isa = PBXSourcesBuildPhase;
515 | buildActionMask = 2147483647;
516 | files = (
517 | 5CD3A48F2788DFCD00B67D88 /* SmokeTests.swift in Sources */,
518 | );
519 | runOnlyForDeploymentPostprocessing = 0;
520 | };
521 | 5CDD8858277102DC00052307 /* Sources */ = {
522 | isa = PBXSourcesBuildPhase;
523 | buildActionMask = 2147483647;
524 | files = (
525 | 5CDD8867277102DC00052307 /* MainView.swift in Sources */,
526 | 5C78D9C127740963000B4B71 /* Views.swift in Sources */,
527 | 5C6537272772F5EE0035759D /* User.swift in Sources */,
528 | 5C6537242772F5D90035759D /* ProfileView.swift in Sources */,
529 | 5CDD8865277102DC00052307 /* App.swift in Sources */,
530 | );
531 | runOnlyForDeploymentPostprocessing = 0;
532 | };
533 | 5CDD885E277102DC00052307 /* Sources */ = {
534 | isa = PBXSourcesBuildPhase;
535 | buildActionMask = 2147483647;
536 | files = (
537 | 5CDD8868277102DC00052307 /* MainView.swift in Sources */,
538 | 5C78D9C227740975000B4B71 /* Views.swift in Sources */,
539 | 5C6537282772F5EE0035759D /* User.swift in Sources */,
540 | 5C6537252772F5D90035759D /* ProfileView.swift in Sources */,
541 | 5CDD8866277102DC00052307 /* App.swift in Sources */,
542 | );
543 | runOnlyForDeploymentPostprocessing = 0;
544 | };
545 | /* End PBXSourcesBuildPhase section */
546 |
547 | /* Begin PBXTargetDependency section */
548 | 5CD3A44E2784E54E00B67D88 /* PBXTargetDependency */ = {
549 | isa = PBXTargetDependency;
550 | target = 5CDD885B277102DC00052307 /* SwiftSample (iOS) */;
551 | targetProxy = 5CD3A44D2784E54E00B67D88 /* PBXContainerItemProxy */;
552 | };
553 | 5CD3A45C2784E5BC00B67D88 /* PBXTargetDependency */ = {
554 | isa = PBXTargetDependency;
555 | target = 5CDD8861277102DC00052307 /* SwiftSample (macOS) */;
556 | targetProxy = 5CD3A45B2784E5BC00B67D88 /* PBXContainerItemProxy */;
557 | };
558 | 5CD3A4912788DFCD00B67D88 /* PBXTargetDependency */ = {
559 | isa = PBXTargetDependency;
560 | target = 5CDD885B277102DC00052307 /* SwiftSample (iOS) */;
561 | targetProxy = 5CD3A4902788DFCD00B67D88 /* PBXContainerItemProxy */;
562 | };
563 | /* End PBXTargetDependency section */
564 |
565 | /* Begin XCBuildConfiguration section */
566 | 5CD3A44F2784E54E00B67D88 /* Debug */ = {
567 | isa = XCBuildConfiguration;
568 | buildSettings = {
569 | BUNDLE_LOADER = "$(TEST_HOST)";
570 | CODE_SIGN_STYLE = Automatic;
571 | CURRENT_PROJECT_VERSION = 1;
572 | GENERATE_INFOPLIST_FILE = YES;
573 | IPHONEOS_DEPLOYMENT_TARGET = 15.2;
574 | MARKETING_VERSION = 1.0;
575 | PRODUCT_BUNDLE_IDENTIFIER = "com.auth0.samples.SwiftSampleTests--iOS-";
576 | PRODUCT_NAME = "$(TARGET_NAME)";
577 | SDKROOT = iphoneos;
578 | SWIFT_EMIT_LOC_STRINGS = NO;
579 | SWIFT_VERSION = 5.0;
580 | TARGETED_DEVICE_FAMILY = "1,2";
581 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftSample.app/SwiftSample";
582 | };
583 | name = Debug;
584 | };
585 | 5CD3A4502784E54E00B67D88 /* Release */ = {
586 | isa = XCBuildConfiguration;
587 | buildSettings = {
588 | BUNDLE_LOADER = "$(TEST_HOST)";
589 | CODE_SIGN_STYLE = Automatic;
590 | CURRENT_PROJECT_VERSION = 1;
591 | GENERATE_INFOPLIST_FILE = YES;
592 | IPHONEOS_DEPLOYMENT_TARGET = 15.2;
593 | MARKETING_VERSION = 1.0;
594 | PRODUCT_BUNDLE_IDENTIFIER = "com.auth0.samples.SwiftSampleTests--iOS-";
595 | PRODUCT_NAME = "$(TARGET_NAME)";
596 | SDKROOT = iphoneos;
597 | SWIFT_EMIT_LOC_STRINGS = NO;
598 | SWIFT_VERSION = 5.0;
599 | TARGETED_DEVICE_FAMILY = "1,2";
600 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftSample.app/SwiftSample";
601 | VALIDATE_PRODUCT = YES;
602 | };
603 | name = Release;
604 | };
605 | 5CD3A45E2784E5BC00B67D88 /* Debug */ = {
606 | isa = XCBuildConfiguration;
607 | buildSettings = {
608 | BUNDLE_LOADER = "$(TEST_HOST)";
609 | CODE_SIGN_STYLE = Automatic;
610 | CURRENT_PROJECT_VERSION = 1;
611 | DEAD_CODE_STRIPPING = YES;
612 | GENERATE_INFOPLIST_FILE = YES;
613 | MACOSX_DEPLOYMENT_TARGET = 11.6;
614 | MARKETING_VERSION = 1.0;
615 | PRODUCT_BUNDLE_IDENTIFIER = "com.auth0.samples.SwiftSampleTests--macOS-";
616 | PRODUCT_NAME = "$(TARGET_NAME)";
617 | SDKROOT = macosx;
618 | SWIFT_EMIT_LOC_STRINGS = NO;
619 | SWIFT_VERSION = 5.0;
620 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftSample.app/Contents/MacOS/SwiftSample";
621 | };
622 | name = Debug;
623 | };
624 | 5CD3A45F2784E5BC00B67D88 /* Release */ = {
625 | isa = XCBuildConfiguration;
626 | buildSettings = {
627 | BUNDLE_LOADER = "$(TEST_HOST)";
628 | CODE_SIGN_STYLE = Automatic;
629 | CURRENT_PROJECT_VERSION = 1;
630 | DEAD_CODE_STRIPPING = YES;
631 | GENERATE_INFOPLIST_FILE = YES;
632 | MACOSX_DEPLOYMENT_TARGET = 11.6;
633 | MARKETING_VERSION = 1.0;
634 | PRODUCT_BUNDLE_IDENTIFIER = "com.auth0.samples.SwiftSampleTests--macOS-";
635 | PRODUCT_NAME = "$(TARGET_NAME)";
636 | SDKROOT = macosx;
637 | SWIFT_EMIT_LOC_STRINGS = NO;
638 | SWIFT_VERSION = 5.0;
639 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftSample.app/Contents/MacOS/SwiftSample";
640 | };
641 | name = Release;
642 | };
643 | 5CD3A4922788DFCD00B67D88 /* Debug */ = {
644 | isa = XCBuildConfiguration;
645 | buildSettings = {
646 | CODE_SIGN_STYLE = Automatic;
647 | CURRENT_PROJECT_VERSION = 1;
648 | DEVELOPMENT_TEAM = 22U9KJ5PK6;
649 | GENERATE_INFOPLIST_FILE = YES;
650 | IPHONEOS_DEPLOYMENT_TARGET = 15.2;
651 | MARKETING_VERSION = 1.0;
652 | PRODUCT_BUNDLE_IDENTIFIER = "com.auth0.samples.SwiftSampleUITests--iOS-";
653 | PRODUCT_NAME = "$(TARGET_NAME)";
654 | SDKROOT = iphoneos;
655 | SWIFT_EMIT_LOC_STRINGS = NO;
656 | SWIFT_VERSION = 5.0;
657 | TARGETED_DEVICE_FAMILY = "1,2";
658 | TEST_TARGET_NAME = "SwiftSample (iOS)";
659 | };
660 | name = Debug;
661 | };
662 | 5CD3A4932788DFCD00B67D88 /* Release */ = {
663 | isa = XCBuildConfiguration;
664 | buildSettings = {
665 | CODE_SIGN_STYLE = Automatic;
666 | CURRENT_PROJECT_VERSION = 1;
667 | DEVELOPMENT_TEAM = 22U9KJ5PK6;
668 | GENERATE_INFOPLIST_FILE = YES;
669 | IPHONEOS_DEPLOYMENT_TARGET = 15.2;
670 | MARKETING_VERSION = 1.0;
671 | PRODUCT_BUNDLE_IDENTIFIER = "com.auth0.samples.SwiftSampleUITests--iOS-";
672 | PRODUCT_NAME = "$(TARGET_NAME)";
673 | SDKROOT = iphoneos;
674 | SWIFT_EMIT_LOC_STRINGS = NO;
675 | SWIFT_VERSION = 5.0;
676 | TARGETED_DEVICE_FAMILY = "1,2";
677 | TEST_TARGET_NAME = "SwiftSample (iOS)";
678 | VALIDATE_PRODUCT = YES;
679 | };
680 | name = Release;
681 | };
682 | 5CDD886B277102DC00052307 /* Debug */ = {
683 | isa = XCBuildConfiguration;
684 | buildSettings = {
685 | ALWAYS_SEARCH_USER_PATHS = NO;
686 | CLANG_ANALYZER_NONNULL = YES;
687 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
688 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
689 | CLANG_CXX_LIBRARY = "libc++";
690 | CLANG_ENABLE_MODULES = YES;
691 | CLANG_ENABLE_OBJC_ARC = YES;
692 | CLANG_ENABLE_OBJC_WEAK = YES;
693 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
694 | CLANG_WARN_BOOL_CONVERSION = YES;
695 | CLANG_WARN_COMMA = YES;
696 | CLANG_WARN_CONSTANT_CONVERSION = YES;
697 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
698 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
699 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
700 | CLANG_WARN_EMPTY_BODY = YES;
701 | CLANG_WARN_ENUM_CONVERSION = YES;
702 | CLANG_WARN_INFINITE_RECURSION = YES;
703 | CLANG_WARN_INT_CONVERSION = YES;
704 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
705 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
706 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
707 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
708 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
709 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
710 | CLANG_WARN_STRICT_PROTOTYPES = YES;
711 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
712 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
713 | CLANG_WARN_UNREACHABLE_CODE = YES;
714 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
715 | COPY_PHASE_STRIP = NO;
716 | DEAD_CODE_STRIPPING = YES;
717 | DEBUG_INFORMATION_FORMAT = dwarf;
718 | ENABLE_STRICT_OBJC_MSGSEND = YES;
719 | ENABLE_TESTABILITY = YES;
720 | GCC_C_LANGUAGE_STANDARD = gnu11;
721 | GCC_DYNAMIC_NO_PIC = NO;
722 | GCC_NO_COMMON_BLOCKS = YES;
723 | GCC_OPTIMIZATION_LEVEL = 0;
724 | GCC_PREPROCESSOR_DEFINITIONS = (
725 | "DEBUG=1",
726 | "$(inherited)",
727 | );
728 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
729 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
730 | GCC_WARN_UNDECLARED_SELECTOR = YES;
731 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
732 | GCC_WARN_UNUSED_FUNCTION = YES;
733 | GCC_WARN_UNUSED_VARIABLE = YES;
734 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
735 | MTL_FAST_MATH = YES;
736 | ONLY_ACTIVE_ARCH = YES;
737 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
738 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
739 | };
740 | name = Debug;
741 | };
742 | 5CDD886C277102DC00052307 /* Release */ = {
743 | isa = XCBuildConfiguration;
744 | buildSettings = {
745 | ALWAYS_SEARCH_USER_PATHS = NO;
746 | CLANG_ANALYZER_NONNULL = YES;
747 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
748 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
749 | CLANG_CXX_LIBRARY = "libc++";
750 | CLANG_ENABLE_MODULES = YES;
751 | CLANG_ENABLE_OBJC_ARC = YES;
752 | CLANG_ENABLE_OBJC_WEAK = YES;
753 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
754 | CLANG_WARN_BOOL_CONVERSION = YES;
755 | CLANG_WARN_COMMA = YES;
756 | CLANG_WARN_CONSTANT_CONVERSION = YES;
757 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
758 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
759 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
760 | CLANG_WARN_EMPTY_BODY = YES;
761 | CLANG_WARN_ENUM_CONVERSION = YES;
762 | CLANG_WARN_INFINITE_RECURSION = YES;
763 | CLANG_WARN_INT_CONVERSION = YES;
764 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
765 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
766 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
767 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
768 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
769 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
770 | CLANG_WARN_STRICT_PROTOTYPES = YES;
771 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
772 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
773 | CLANG_WARN_UNREACHABLE_CODE = YES;
774 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
775 | COPY_PHASE_STRIP = NO;
776 | DEAD_CODE_STRIPPING = YES;
777 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
778 | ENABLE_NS_ASSERTIONS = NO;
779 | ENABLE_STRICT_OBJC_MSGSEND = YES;
780 | GCC_C_LANGUAGE_STANDARD = gnu11;
781 | GCC_NO_COMMON_BLOCKS = YES;
782 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
783 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
784 | GCC_WARN_UNDECLARED_SELECTOR = YES;
785 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
786 | GCC_WARN_UNUSED_FUNCTION = YES;
787 | GCC_WARN_UNUSED_VARIABLE = YES;
788 | MTL_ENABLE_DEBUG_INFO = NO;
789 | MTL_FAST_MATH = YES;
790 | SWIFT_COMPILATION_MODE = wholemodule;
791 | SWIFT_OPTIMIZATION_LEVEL = "-O";
792 | };
793 | name = Release;
794 | };
795 | 5CDD886E277102DC00052307 /* Debug */ = {
796 | isa = XCBuildConfiguration;
797 | buildSettings = {
798 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
799 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
800 | CODE_SIGN_ENTITLEMENTS = "SwiftSample (iOS).entitlements";
801 | CODE_SIGN_STYLE = Automatic;
802 | CURRENT_PROJECT_VERSION = 1;
803 | ENABLE_PREVIEWS = YES;
804 | GENERATE_INFOPLIST_FILE = YES;
805 | INFOPLIST_FILE = "SwiftSample--iOS--Info.plist";
806 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
807 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
808 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
809 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
810 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
811 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
812 | LD_RUNPATH_SEARCH_PATHS = (
813 | "$(inherited)",
814 | "@executable_path/Frameworks",
815 | );
816 | MARKETING_VERSION = 1.0;
817 | PRODUCT_BUNDLE_IDENTIFIER = com.auth0.samples.SwiftSample;
818 | PRODUCT_NAME = SwiftSample;
819 | SDKROOT = iphoneos;
820 | SWIFT_EMIT_LOC_STRINGS = YES;
821 | SWIFT_VERSION = 5.0;
822 | TARGETED_DEVICE_FAMILY = "1,2";
823 | };
824 | name = Debug;
825 | };
826 | 5CDD886F277102DC00052307 /* Release */ = {
827 | isa = XCBuildConfiguration;
828 | buildSettings = {
829 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
830 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
831 | CODE_SIGN_ENTITLEMENTS = "SwiftSample (iOS).entitlements";
832 | CODE_SIGN_STYLE = Automatic;
833 | CURRENT_PROJECT_VERSION = 1;
834 | ENABLE_PREVIEWS = YES;
835 | GENERATE_INFOPLIST_FILE = YES;
836 | INFOPLIST_FILE = "SwiftSample--iOS--Info.plist";
837 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
838 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
839 | INFOPLIST_KEY_UILaunchScreen_Generation = YES;
840 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
841 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
842 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
843 | LD_RUNPATH_SEARCH_PATHS = (
844 | "$(inherited)",
845 | "@executable_path/Frameworks",
846 | );
847 | MARKETING_VERSION = 1.0;
848 | PRODUCT_BUNDLE_IDENTIFIER = com.auth0.samples.SwiftSample;
849 | PRODUCT_NAME = SwiftSample;
850 | SDKROOT = iphoneos;
851 | SWIFT_EMIT_LOC_STRINGS = YES;
852 | SWIFT_VERSION = 5.0;
853 | TARGETED_DEVICE_FAMILY = "1,2";
854 | VALIDATE_PRODUCT = YES;
855 | };
856 | name = Release;
857 | };
858 | 5CDD8871277102DC00052307 /* Debug */ = {
859 | isa = XCBuildConfiguration;
860 | buildSettings = {
861 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
862 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
863 | CODE_SIGN_ENTITLEMENTS = "Sources/Supporting Files/macOS/macOS.entitlements";
864 | CODE_SIGN_IDENTITY = "";
865 | CODE_SIGN_STYLE = Manual;
866 | COMBINE_HIDPI_IMAGES = YES;
867 | CURRENT_PROJECT_VERSION = 1;
868 | DEAD_CODE_STRIPPING = YES;
869 | DEVELOPMENT_TEAM = "";
870 | ENABLE_PREVIEWS = YES;
871 | GENERATE_INFOPLIST_FILE = YES;
872 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
873 | LD_RUNPATH_SEARCH_PATHS = (
874 | "$(inherited)",
875 | "@executable_path/../Frameworks",
876 | );
877 | MACOSX_DEPLOYMENT_TARGET = 11.0;
878 | MARKETING_VERSION = 1.0;
879 | PRODUCT_BUNDLE_IDENTIFIER = com.auth0.samples.SwiftSample;
880 | PRODUCT_NAME = SwiftSample;
881 | PROVISIONING_PROFILE_SPECIFIER = "";
882 | SDKROOT = macosx;
883 | SWIFT_EMIT_LOC_STRINGS = YES;
884 | SWIFT_VERSION = 5.0;
885 | };
886 | name = Debug;
887 | };
888 | 5CDD8872277102DC00052307 /* Release */ = {
889 | isa = XCBuildConfiguration;
890 | buildSettings = {
891 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
892 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
893 | CODE_SIGN_ENTITLEMENTS = "Sources/Supporting Files/macOS/macOS.entitlements";
894 | CODE_SIGN_IDENTITY = "";
895 | CODE_SIGN_STYLE = Manual;
896 | COMBINE_HIDPI_IMAGES = YES;
897 | CURRENT_PROJECT_VERSION = 1;
898 | DEAD_CODE_STRIPPING = YES;
899 | DEVELOPMENT_TEAM = "";
900 | ENABLE_PREVIEWS = YES;
901 | GENERATE_INFOPLIST_FILE = YES;
902 | INFOPLIST_KEY_NSHumanReadableCopyright = "";
903 | LD_RUNPATH_SEARCH_PATHS = (
904 | "$(inherited)",
905 | "@executable_path/../Frameworks",
906 | );
907 | MACOSX_DEPLOYMENT_TARGET = 11.0;
908 | MARKETING_VERSION = 1.0;
909 | PRODUCT_BUNDLE_IDENTIFIER = com.auth0.samples.SwiftSample;
910 | PRODUCT_NAME = SwiftSample;
911 | PROVISIONING_PROFILE_SPECIFIER = "";
912 | SDKROOT = macosx;
913 | SWIFT_EMIT_LOC_STRINGS = YES;
914 | SWIFT_VERSION = 5.0;
915 | };
916 | name = Release;
917 | };
918 | /* End XCBuildConfiguration section */
919 |
920 | /* Begin XCConfigurationList section */
921 | 5CD3A4512784E54E00B67D88 /* Build configuration list for PBXNativeTarget "SwiftSampleTests (iOS)" */ = {
922 | isa = XCConfigurationList;
923 | buildConfigurations = (
924 | 5CD3A44F2784E54E00B67D88 /* Debug */,
925 | 5CD3A4502784E54E00B67D88 /* Release */,
926 | );
927 | defaultConfigurationIsVisible = 0;
928 | defaultConfigurationName = Release;
929 | };
930 | 5CD3A45D2784E5BC00B67D88 /* Build configuration list for PBXNativeTarget "SwiftSampleTests (macOS)" */ = {
931 | isa = XCConfigurationList;
932 | buildConfigurations = (
933 | 5CD3A45E2784E5BC00B67D88 /* Debug */,
934 | 5CD3A45F2784E5BC00B67D88 /* Release */,
935 | );
936 | defaultConfigurationIsVisible = 0;
937 | defaultConfigurationName = Release;
938 | };
939 | 5CD3A4942788DFCD00B67D88 /* Build configuration list for PBXNativeTarget "SwiftSampleUITests" */ = {
940 | isa = XCConfigurationList;
941 | buildConfigurations = (
942 | 5CD3A4922788DFCD00B67D88 /* Debug */,
943 | 5CD3A4932788DFCD00B67D88 /* Release */,
944 | );
945 | defaultConfigurationIsVisible = 0;
946 | defaultConfigurationName = Release;
947 | };
948 | 5CDD8853277102DA00052307 /* Build configuration list for PBXProject "SwiftSample" */ = {
949 | isa = XCConfigurationList;
950 | buildConfigurations = (
951 | 5CDD886B277102DC00052307 /* Debug */,
952 | 5CDD886C277102DC00052307 /* Release */,
953 | );
954 | defaultConfigurationIsVisible = 0;
955 | defaultConfigurationName = Release;
956 | };
957 | 5CDD886D277102DC00052307 /* Build configuration list for PBXNativeTarget "SwiftSample (iOS)" */ = {
958 | isa = XCConfigurationList;
959 | buildConfigurations = (
960 | 5CDD886E277102DC00052307 /* Debug */,
961 | 5CDD886F277102DC00052307 /* Release */,
962 | );
963 | defaultConfigurationIsVisible = 0;
964 | defaultConfigurationName = Release;
965 | };
966 | 5CDD8870277102DC00052307 /* Build configuration list for PBXNativeTarget "SwiftSample (macOS)" */ = {
967 | isa = XCConfigurationList;
968 | buildConfigurations = (
969 | 5CDD8871277102DC00052307 /* Debug */,
970 | 5CDD8872277102DC00052307 /* Release */,
971 | );
972 | defaultConfigurationIsVisible = 0;
973 | defaultConfigurationName = Release;
974 | };
975 | /* End XCConfigurationList section */
976 |
977 | /* Begin XCRemoteSwiftPackageReference section */
978 | 5C5DBE81277210B400E19935 /* XCRemoteSwiftPackageReference "Auth0.swift" */ = {
979 | isa = XCRemoteSwiftPackageReference;
980 | repositoryURL = "https://github.com/auth0/Auth0.swift.git";
981 | requirement = {
982 | kind = upToNextMajorVersion;
983 | minimumVersion = 2.6.0;
984 | };
985 | };
986 | 5CD3A4622784F5F900B67D88 /* XCRemoteSwiftPackageReference "ViewInspector" */ = {
987 | isa = XCRemoteSwiftPackageReference;
988 | repositoryURL = "https://github.com/nalexn/ViewInspector";
989 | requirement = {
990 | kind = exactVersion;
991 | version = 0.9.6;
992 | };
993 | };
994 | /* End XCRemoteSwiftPackageReference section */
995 |
996 | /* Begin XCSwiftPackageProductDependency section */
997 | 5C5DBE82277210B400E19935 /* Auth0 */ = {
998 | isa = XCSwiftPackageProductDependency;
999 | package = 5C5DBE81277210B400E19935 /* XCRemoteSwiftPackageReference "Auth0.swift" */;
1000 | productName = Auth0;
1001 | };
1002 | 5C5DBE85277210C100E19935 /* Auth0 */ = {
1003 | isa = XCSwiftPackageProductDependency;
1004 | package = 5C5DBE81277210B400E19935 /* XCRemoteSwiftPackageReference "Auth0.swift" */;
1005 | productName = Auth0;
1006 | };
1007 | 5CD3A4632784F5F900B67D88 /* ViewInspector */ = {
1008 | isa = XCSwiftPackageProductDependency;
1009 | package = 5CD3A4622784F5F900B67D88 /* XCRemoteSwiftPackageReference "ViewInspector" */;
1010 | productName = ViewInspector;
1011 | };
1012 | 5CD3A4662784F61200B67D88 /* ViewInspector */ = {
1013 | isa = XCSwiftPackageProductDependency;
1014 | package = 5CD3A4622784F5F900B67D88 /* XCRemoteSwiftPackageReference "ViewInspector" */;
1015 | productName = ViewInspector;
1016 | };
1017 | /* End XCSwiftPackageProductDependency section */
1018 | };
1019 | rootObject = 5CDD8850277102DA00052307 /* Project object */;
1020 | }
1021 |
--------------------------------------------------------------------------------
/Sample-01/SwiftSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Sample-01/SwiftSample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Sample-01/SwiftSample.xcodeproj/xcshareddata/xcschemes/SwiftSample (iOS).xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
37 |
38 |
39 |
40 |
44 |
45 |
49 |
50 |
51 |
52 |
54 |
60 |
61 |
62 |
64 |
70 |
71 |
72 |
73 |
74 |
84 |
86 |
92 |
93 |
94 |
95 |
101 |
103 |
109 |
110 |
111 |
112 |
114 |
115 |
118 |
119 |
120 |
--------------------------------------------------------------------------------
/Sample-01/Tests/Shared/ProfileCellTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import ViewInspector
3 | @testable import SwiftSample
4 |
5 | class ProfileCellTests: XCTestCase {
6 | private var sut: ProfileCell!
7 |
8 | override func setUp() {
9 | self.sut = ProfileCell(key: "", value: "")
10 | }
11 |
12 | func testHasKeyAndValue() throws {
13 | let key = "foo"
14 | let value = "bar"
15 | self.sut = ProfileCell(key: key, value: value)
16 | let textViews = try self.sut.inspect().findAll(ViewType.Text.self)
17 | XCTAssertEqual(textViews.count, 2)
18 | XCTAssertEqual(try textViews[0].string(), key)
19 | XCTAssertEqual(try textViews[1].string(), value)
20 | }
21 |
22 | func testKeyUsesSemiboldFont() throws {
23 | let key = try XCTUnwrap(try self.sut.inspect().findAll(ViewType.Text.self).first)
24 | XCTAssertEqual(try key.attributes().font().weight(), .semibold)
25 | XCTAssertEqual(try key.attributes().font().size(), 14)
26 | }
27 |
28 | func testValueUsesRegularFont() throws {
29 | let key = try XCTUnwrap(try self.sut.inspect().findAll(ViewType.Text.self).last)
30 | XCTAssertEqual(try key.attributes().font().weight(), .regular)
31 | XCTAssertEqual(try key.attributes().font().size(), 14)
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Sample-01/Tests/Shared/ProfileViewTests.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import XCTest
3 | import ViewInspector
4 | @testable import SwiftSample
5 |
6 | class ProfileViewTests: XCTestCase {
7 | func testHasHeader() throws {
8 | let user = User(id: "", name: "", email: "", emailVerified: "", picture: "", updatedAt: "")
9 | let sut = ProfileView(user: user)
10 | XCTAssertNoThrow(try sut.inspect().list().find(ProfileHeader.self))
11 | }
12 |
13 | func testHasProfileValues() throws {
14 | let user = User(id: "foo", name: "bar", email: "baz", emailVerified: "qux", picture: "", updatedAt: "quux")
15 | let sut = ProfileView(user: user)
16 | let cells = try sut.inspect().list().findAll(ProfileCell.self)
17 | XCTAssertEqual(cells.count, 5)
18 | XCTAssertEqual(try cells[0].findAll(ViewType.Text.self).last?.string(), user.id)
19 | XCTAssertEqual(try cells[1].findAll(ViewType.Text.self).last?.string(), user.name)
20 | XCTAssertEqual(try cells[2].findAll(ViewType.Text.self).last?.string(), user.email)
21 | XCTAssertEqual(try cells[3].findAll(ViewType.Text.self).last?.string(), user.emailVerified)
22 | XCTAssertEqual(try cells[4].findAll(ViewType.Text.self).last?.string(), user.updatedAt)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Sample-01/Tests/Shared/UserTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | @testable import SwiftSample
3 |
4 | extension User: Equatable {
5 | public static func == (lhs: User, rhs: User) -> Bool {
6 | return (lhs.id == rhs.id)
7 | && (lhs.name == rhs.name)
8 | && (lhs.email == rhs.email)
9 | && (lhs.emailVerified == rhs.emailVerified)
10 | && (lhs.picture == rhs.picture)
11 | && (lhs.updatedAt == rhs.updatedAt)
12 | }
13 | }
14 |
15 | class UserTests: XCTestCase {
16 | func testReturnsUserFromIDToken() throws {
17 | let idToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmb28iLCJuYW1lIjoiYmFyIiwiZW1haWwiOiJmb29AZXhhbXB"
18 | + "sZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicGljdHVyZSI6ImJheiIsInVwZGF0ZWRfYXQiOiJxdXgifQ.vc9sxvhUVAHowIWJ"
19 | + "7D_WDzvqJxC4-qYXHmiBVYEKn9E"
20 | let sut = try XCTUnwrap(User(from: idToken))
21 | XCTAssertEqual(sut.id, "foo")
22 | XCTAssertEqual(sut.name, "bar")
23 | XCTAssertEqual(sut.email, "foo@example.com")
24 | XCTAssertEqual(sut.emailVerified, "true")
25 | XCTAssertEqual(sut.picture, "baz")
26 | XCTAssertEqual(sut.updatedAt, "qux")
27 | }
28 |
29 | func testReturnsNilWhenIDTokenDecodingFails() {
30 | XCTAssertNil(User(from: "foo.bar.baz"))
31 | }
32 |
33 | func testReturnsNilWhenSubjectIsMissing() {
34 | let idToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYmFyIiwiZW1haWwiOiJmb29AZXhhbXBsZS5jb20iLCJlbWF"
35 | + "pbF92ZXJpZmllZCI6dHJ1ZSwicGljdHVyZSI6ImJheiIsInVwZGF0ZWRfYXQiOiJxdXgifQ.dkS2qn1pbmznis5krUlKuornFIr-lZ_v"
36 | + "TDn36ksFzFM"
37 | XCTAssertNil(User(from: idToken))
38 | }
39 |
40 | func testReturnsNilWhenNameIsMissing() {
41 | let idToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmb28iLCJlbWFpbCI6ImZvb0BleGFtcGxlLmNvbSIsImVtYWl"
42 | + "sX3ZlcmlmaWVkIjp0cnVlLCJwaWN0dXJlIjoiYmF6IiwidXBkYXRlZF9hdCI6InF1eCJ9.92bnGEfJGKt5vsdkFHeyeykrlynn4J6tSR"
43 | + "w9ex2XsqE"
44 | XCTAssertNil(User(from: idToken))
45 | }
46 |
47 | func testReturnsNilWhenEmailIsMissing() {
48 | let idToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmb28iLCJuYW1lIjoiYmFyIiwiZW1haWxfdmVyaWZpZWQiOnR"
49 | + "ydWUsInBpY3R1cmUiOiJiYXoiLCJ1cGRhdGVkX2F0IjoicXV4In0.g9zSyuxzfNlN_-6E1FJfJdQhGpPMTLI0W8hIaiyylng"
50 | XCTAssertNil(User(from: idToken))
51 | }
52 |
53 | func testReturnsNilWhenEmailVerifiedIsMissing() {
54 | let idToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmb28iLCJuYW1lIjoiYmFyIiwiZW1haWwiOiJmb29AZXhhbXB"
55 | + "sZS5jb20iLCJwaWN0dXJlIjoiYmF6IiwidXBkYXRlZF9hdCI6InF1eCJ9.OpiRejUet5bC2-ea4AtTQp7PI1kvDHM_lGLKLyrM5Z0"
56 | XCTAssertNil(User(from: idToken))
57 | }
58 |
59 | func testReturnsNilWhenPictureIsMissing() {
60 | let idToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmb28iLCJuYW1lIjoiYmFyIiwiZW1haWwiOiJmb29AZXhhbXB"
61 | + "sZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwidXBkYXRlZF9hdCI6InF1eCJ9.A1BwdpsSf3azr8I724tVdz0iWA9qrVwFOHOf_D"
62 | + "WekQY"
63 | XCTAssertNil(User(from: idToken))
64 | }
65 |
66 | func testReturnsNilWhenUpdatedAtIsMissing() {
67 | let idToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmb28iLCJuYW1lIjoiYmFyIiwiZW1haWwiOiJmb29AZXhhbXB"
68 | + "sZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicGljdHVyZSI6ImJheiJ9.mHTo0v7jIVQ9ELcstaDV3FxSUsXr4IMejKRY0e2MQ9"
69 | + "Y"
70 | XCTAssertNil(User(from: idToken))
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/Sample-01/Tests/iOS/HeroViewTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import ViewInspector
3 | @testable import SwiftSample
4 |
5 | class HeroViewTests: XCTestCase {
6 | private let sut = HeroView()
7 |
8 | func testHasLogo() throws {
9 | let logo = try self.sut.inspect().image(0)
10 | XCTAssertEqual(try logo.actualImage().name(), "Auth0")
11 | XCTAssertEqual(try logo.aspectRatio().contentMode, .fit)
12 | XCTAssertEqual(try logo.fixedWidth(), 25)
13 | XCTAssertEqual(try logo.fixedHeight(), 28)
14 | }
15 |
16 | func testLogoUsesFixedSize() throws {
17 | let logo = try self.sut.inspect().image(0)
18 | XCTAssertEqual(try logo.fixedWidth(), 25)
19 | XCTAssertEqual(try logo.fixedHeight(), 28)
20 | XCTAssertEqual(try logo.aspectRatio().contentMode, .fit)
21 | }
22 |
23 | func testHasText() throws {
24 | let textViews = try self.sut.inspect().vStack(1).findAll(ViewType.Text.self)
25 | XCTAssertEqual(textViews.count, 3)
26 | XCTAssertEqual(try textViews[0].string(), "Swift")
27 | XCTAssertEqual(try textViews[1].string(), "Sample")
28 | XCTAssertEqual(try textViews[2].string(), "App")
29 | }
30 |
31 | func testTextUsesCustomFont() throws {
32 | for text in try self.sut.inspect().vStack(1).findAll(ViewType.Text.self) {
33 | XCTAssertEqual(try text.attributes().font().name(), "SpaceGrotesk-Medium")
34 | XCTAssertEqual(try text.attributes().font().size(), 80)
35 | }
36 | }
37 |
38 | func testTextUsesFlexibleSize() throws {
39 | let vStack = try self.sut.inspect().vStack(1)
40 | XCTAssertEqual(try vStack.flexFrame().maxWidth, .infinity)
41 | XCTAssertEqual(try vStack.flexFrame().maxHeight, .infinity)
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/Sample-01/Tests/iOS/ProfileHeaderTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import ViewInspector
3 | @testable import SwiftSample
4 |
5 | class ProfileHeaderTests: XCTestCase {
6 | private let sut = ProfileHeader(picture: "")
7 |
8 | func testHasAsyncImage() throws {
9 | XCTAssertNoThrow(try self.sut.inspect().asyncImage())
10 | }
11 |
12 | func testAsyncImageUsesFixedSize() throws {
13 | let size: CGFloat = 100
14 | XCTAssertEqual(try self.sut.inspect().asyncImage().fixedHeight(), size)
15 | XCTAssertEqual(try self.sut.inspect().asyncImage().fixedHeight(), size)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Sample-01/Tests/macOS/HeroViewTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import ViewInspector
3 | @testable import SwiftSample
4 |
5 | class HeroViewTests: XCTestCase {
6 | private let sut = HeroView()
7 |
8 | func testHasText() throws {
9 | XCTAssertEqual(try self.sut.inspect().text().string(), "Swift Sample App")
10 | }
11 |
12 | func testTextUsesTitleFont() throws {
13 | XCTAssertEqual(try self.sut.inspect().text().attributes().font().style(), .title)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sample-01/Tests/macOS/ProfileHeaderTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import ViewInspector
3 | @testable import SwiftSample
4 |
5 | class ProfileHeaderTests: XCTestCase {
6 | private let sut = ProfileHeader(picture: "")
7 |
8 | func testHasText() throws {
9 | XCTAssertEqual(try self.sut.inspect().text().string(), "Profile")
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Sample-01/UITests/SmokeTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 |
3 | class SmokeTests: XCTestCase {
4 | private let email = ProcessInfo.processInfo.environment["USER_EMAIL"]!
5 | private let password = ProcessInfo.processInfo.environment["USER_PASSWORD"]!
6 | private let loginButton = "Login"
7 | private let logoutButton = "Logout"
8 | private let continueButton = "Continue"
9 | private let timeout: TimeInterval = 10
10 |
11 | override func setUp() {
12 | continueAfterFailure = false
13 | let app = XCUIApplication()
14 | app.launchEnvironment = ProcessInfo.processInfo.environment
15 | app.launch()
16 | }
17 |
18 | func testLogin() {
19 | let app = XCUIApplication()
20 | tap(button: loginButton)
21 | let emailInput = app.webViews.textFields.firstMatch
22 | XCTAssertTrue(emailInput.waitForExistence(timeout: timeout))
23 | emailInput.tap()
24 | emailInput.typeText(email)
25 | emailInput.typeText("\n")
26 | let passwordInput = app.webViews.secureTextFields.firstMatch
27 | passwordInput.tap()
28 | passwordInput.typeText(password)
29 | passwordInput.typeText("\n")
30 | XCTAssertTrue(app.buttons[logoutButton].waitForExistence(timeout: timeout))
31 | }
32 |
33 | func testLogout() {
34 | let app = XCUIApplication()
35 | tap(button: loginButton)
36 | let sessionButton = app.webViews.staticTexts[email]
37 | XCTAssertTrue(sessionButton.waitForExistence(timeout: timeout))
38 | sessionButton.tap()
39 | tap(button: logoutButton)
40 | XCTAssertTrue(app.buttons[loginButton].waitForExistence(timeout: timeout))
41 | }
42 | }
43 |
44 | private extension SmokeTests {
45 | func tapAlert() {
46 | let continueButton = XCUIApplication(bundleIdentifier: "com.apple.springboard").buttons[continueButton]
47 | XCTAssertTrue(continueButton.waitForExistence(timeout: timeout))
48 | continueButton.tap()
49 | }
50 |
51 | func tap(button label: String) {
52 | let button = XCUIApplication().buttons[label]
53 | XCTAssertTrue(button.waitForExistence(timeout: timeout))
54 | button.tap()
55 | tapAlert()
56 | }
57 | }
58 |
--------------------------------------------------------------------------------