├── .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 | Auth0 Logo 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 | ![Screenshot of the iOS section inside the Auth0 application settings page](https://github.com/auth0/Auth0.swift/assets/5055789/7eb5f6a2-7cc7-4c70-acf3-633fd72dc506) 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 | Auth0 Logo 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 | --------------------------------------------------------------------------------