├── Hello.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ └── jordansinger.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── jordansinger.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── Hello ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── ContentView.swift ├── HelloApp.swift ├── Info.plist ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json └── Views │ ├── CountryRegionView.swift │ ├── LanguageView.swift │ ├── QuickStartView.swift │ ├── WiFiPasswordView.swift │ └── WiFiView.swift └── README.md /Hello.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 86AE265A2556E9A40013EA6E /* HelloApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AE26592556E9A40013EA6E /* HelloApp.swift */; }; 11 | 86AE265C2556E9A40013EA6E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AE265B2556E9A40013EA6E /* ContentView.swift */; }; 12 | 86AE265E2556E9A60013EA6E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 86AE265D2556E9A60013EA6E /* Assets.xcassets */; }; 13 | 86AE26612556E9A60013EA6E /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 86AE26602556E9A60013EA6E /* Preview Assets.xcassets */; }; 14 | 86AE266B2556EB1E0013EA6E /* LanguageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AE266A2556EB1E0013EA6E /* LanguageView.swift */; }; 15 | 86AE266F2556EE6F0013EA6E /* CountryRegionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AE266E2556EE6F0013EA6E /* CountryRegionView.swift */; }; 16 | 86AE26722556F09E0013EA6E /* QuickStartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AE26712556F09E0013EA6E /* QuickStartView.swift */; }; 17 | 86AE26752556F8850013EA6E /* WiFiView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AE26742556F8850013EA6E /* WiFiView.swift */; }; 18 | 86AE26782556F9D30013EA6E /* WiFiPasswordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86AE26772556F9D30013EA6E /* WiFiPasswordView.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXFileReference section */ 22 | 86AE26562556E9A40013EA6E /* Hello.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Hello.app; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | 86AE26592556E9A40013EA6E /* HelloApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelloApp.swift; sourceTree = ""; }; 24 | 86AE265B2556E9A40013EA6E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 25 | 86AE265D2556E9A60013EA6E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 26 | 86AE26602556E9A60013EA6E /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 27 | 86AE26622556E9A60013EA6E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 28 | 86AE266A2556EB1E0013EA6E /* LanguageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageView.swift; sourceTree = ""; }; 29 | 86AE266E2556EE6F0013EA6E /* CountryRegionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountryRegionView.swift; sourceTree = ""; }; 30 | 86AE26712556F09E0013EA6E /* QuickStartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickStartView.swift; sourceTree = ""; }; 31 | 86AE26742556F8850013EA6E /* WiFiView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WiFiView.swift; sourceTree = ""; }; 32 | 86AE26772556F9D30013EA6E /* WiFiPasswordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WiFiPasswordView.swift; sourceTree = ""; }; 33 | /* End PBXFileReference section */ 34 | 35 | /* Begin PBXFrameworksBuildPhase section */ 36 | 86AE26532556E9A40013EA6E /* Frameworks */ = { 37 | isa = PBXFrameworksBuildPhase; 38 | buildActionMask = 2147483647; 39 | files = ( 40 | ); 41 | runOnlyForDeploymentPostprocessing = 0; 42 | }; 43 | /* End PBXFrameworksBuildPhase section */ 44 | 45 | /* Begin PBXGroup section */ 46 | 86AE264D2556E9A40013EA6E = { 47 | isa = PBXGroup; 48 | children = ( 49 | 86AE26582556E9A40013EA6E /* Hello */, 50 | 86AE26572556E9A40013EA6E /* Products */, 51 | ); 52 | sourceTree = ""; 53 | }; 54 | 86AE26572556E9A40013EA6E /* Products */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | 86AE26562556E9A40013EA6E /* Hello.app */, 58 | ); 59 | name = Products; 60 | sourceTree = ""; 61 | }; 62 | 86AE26582556E9A40013EA6E /* Hello */ = { 63 | isa = PBXGroup; 64 | children = ( 65 | 86AE26692556EB110013EA6E /* Views */, 66 | 86AE26592556E9A40013EA6E /* HelloApp.swift */, 67 | 86AE265B2556E9A40013EA6E /* ContentView.swift */, 68 | 86AE265D2556E9A60013EA6E /* Assets.xcassets */, 69 | 86AE26622556E9A60013EA6E /* Info.plist */, 70 | 86AE265F2556E9A60013EA6E /* Preview Content */, 71 | ); 72 | path = Hello; 73 | sourceTree = ""; 74 | }; 75 | 86AE265F2556E9A60013EA6E /* Preview Content */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 86AE26602556E9A60013EA6E /* Preview Assets.xcassets */, 79 | ); 80 | path = "Preview Content"; 81 | sourceTree = ""; 82 | }; 83 | 86AE26692556EB110013EA6E /* Views */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 86AE266A2556EB1E0013EA6E /* LanguageView.swift */, 87 | 86AE266E2556EE6F0013EA6E /* CountryRegionView.swift */, 88 | 86AE26712556F09E0013EA6E /* QuickStartView.swift */, 89 | 86AE26742556F8850013EA6E /* WiFiView.swift */, 90 | 86AE26772556F9D30013EA6E /* WiFiPasswordView.swift */, 91 | ); 92 | path = Views; 93 | sourceTree = ""; 94 | }; 95 | /* End PBXGroup section */ 96 | 97 | /* Begin PBXNativeTarget section */ 98 | 86AE26552556E9A40013EA6E /* Hello */ = { 99 | isa = PBXNativeTarget; 100 | buildConfigurationList = 86AE26652556E9A60013EA6E /* Build configuration list for PBXNativeTarget "Hello" */; 101 | buildPhases = ( 102 | 86AE26522556E9A40013EA6E /* Sources */, 103 | 86AE26532556E9A40013EA6E /* Frameworks */, 104 | 86AE26542556E9A40013EA6E /* Resources */, 105 | ); 106 | buildRules = ( 107 | ); 108 | dependencies = ( 109 | ); 110 | name = Hello; 111 | productName = Hello; 112 | productReference = 86AE26562556E9A40013EA6E /* Hello.app */; 113 | productType = "com.apple.product-type.application"; 114 | }; 115 | /* End PBXNativeTarget section */ 116 | 117 | /* Begin PBXProject section */ 118 | 86AE264E2556E9A40013EA6E /* Project object */ = { 119 | isa = PBXProject; 120 | attributes = { 121 | LastSwiftUpdateCheck = 1210; 122 | LastUpgradeCheck = 1210; 123 | TargetAttributes = { 124 | 86AE26552556E9A40013EA6E = { 125 | CreatedOnToolsVersion = 12.1; 126 | }; 127 | }; 128 | }; 129 | buildConfigurationList = 86AE26512556E9A40013EA6E /* Build configuration list for PBXProject "Hello" */; 130 | compatibilityVersion = "Xcode 9.3"; 131 | developmentRegion = en; 132 | hasScannedForEncodings = 0; 133 | knownRegions = ( 134 | en, 135 | Base, 136 | ); 137 | mainGroup = 86AE264D2556E9A40013EA6E; 138 | productRefGroup = 86AE26572556E9A40013EA6E /* Products */; 139 | projectDirPath = ""; 140 | projectRoot = ""; 141 | targets = ( 142 | 86AE26552556E9A40013EA6E /* Hello */, 143 | ); 144 | }; 145 | /* End PBXProject section */ 146 | 147 | /* Begin PBXResourcesBuildPhase section */ 148 | 86AE26542556E9A40013EA6E /* Resources */ = { 149 | isa = PBXResourcesBuildPhase; 150 | buildActionMask = 2147483647; 151 | files = ( 152 | 86AE26612556E9A60013EA6E /* Preview Assets.xcassets in Resources */, 153 | 86AE265E2556E9A60013EA6E /* Assets.xcassets in Resources */, 154 | ); 155 | runOnlyForDeploymentPostprocessing = 0; 156 | }; 157 | /* End PBXResourcesBuildPhase section */ 158 | 159 | /* Begin PBXSourcesBuildPhase section */ 160 | 86AE26522556E9A40013EA6E /* Sources */ = { 161 | isa = PBXSourcesBuildPhase; 162 | buildActionMask = 2147483647; 163 | files = ( 164 | 86AE26782556F9D30013EA6E /* WiFiPasswordView.swift in Sources */, 165 | 86AE265C2556E9A40013EA6E /* ContentView.swift in Sources */, 166 | 86AE26752556F8850013EA6E /* WiFiView.swift in Sources */, 167 | 86AE266F2556EE6F0013EA6E /* CountryRegionView.swift in Sources */, 168 | 86AE26722556F09E0013EA6E /* QuickStartView.swift in Sources */, 169 | 86AE266B2556EB1E0013EA6E /* LanguageView.swift in Sources */, 170 | 86AE265A2556E9A40013EA6E /* HelloApp.swift in Sources */, 171 | ); 172 | runOnlyForDeploymentPostprocessing = 0; 173 | }; 174 | /* End PBXSourcesBuildPhase section */ 175 | 176 | /* Begin XCBuildConfiguration section */ 177 | 86AE26632556E9A60013EA6E /* Debug */ = { 178 | isa = XCBuildConfiguration; 179 | buildSettings = { 180 | ALWAYS_SEARCH_USER_PATHS = NO; 181 | CLANG_ANALYZER_NONNULL = YES; 182 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 183 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 184 | CLANG_CXX_LIBRARY = "libc++"; 185 | CLANG_ENABLE_MODULES = YES; 186 | CLANG_ENABLE_OBJC_ARC = YES; 187 | CLANG_ENABLE_OBJC_WEAK = YES; 188 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 189 | CLANG_WARN_BOOL_CONVERSION = YES; 190 | CLANG_WARN_COMMA = YES; 191 | CLANG_WARN_CONSTANT_CONVERSION = YES; 192 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 193 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 194 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 195 | CLANG_WARN_EMPTY_BODY = YES; 196 | CLANG_WARN_ENUM_CONVERSION = YES; 197 | CLANG_WARN_INFINITE_RECURSION = YES; 198 | CLANG_WARN_INT_CONVERSION = YES; 199 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 200 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 201 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 202 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 203 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 204 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 205 | CLANG_WARN_STRICT_PROTOTYPES = YES; 206 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 207 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 208 | CLANG_WARN_UNREACHABLE_CODE = YES; 209 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 210 | COPY_PHASE_STRIP = NO; 211 | DEBUG_INFORMATION_FORMAT = dwarf; 212 | ENABLE_STRICT_OBJC_MSGSEND = YES; 213 | ENABLE_TESTABILITY = YES; 214 | GCC_C_LANGUAGE_STANDARD = gnu11; 215 | GCC_DYNAMIC_NO_PIC = NO; 216 | GCC_NO_COMMON_BLOCKS = YES; 217 | GCC_OPTIMIZATION_LEVEL = 0; 218 | GCC_PREPROCESSOR_DEFINITIONS = ( 219 | "DEBUG=1", 220 | "$(inherited)", 221 | ); 222 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 223 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 224 | GCC_WARN_UNDECLARED_SELECTOR = YES; 225 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 226 | GCC_WARN_UNUSED_FUNCTION = YES; 227 | GCC_WARN_UNUSED_VARIABLE = YES; 228 | IPHONEOS_DEPLOYMENT_TARGET = 14.1; 229 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 230 | MTL_FAST_MATH = YES; 231 | ONLY_ACTIVE_ARCH = YES; 232 | SDKROOT = iphoneos; 233 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 234 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 235 | }; 236 | name = Debug; 237 | }; 238 | 86AE26642556E9A60013EA6E /* Release */ = { 239 | isa = XCBuildConfiguration; 240 | buildSettings = { 241 | ALWAYS_SEARCH_USER_PATHS = NO; 242 | CLANG_ANALYZER_NONNULL = YES; 243 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 244 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 245 | CLANG_CXX_LIBRARY = "libc++"; 246 | CLANG_ENABLE_MODULES = YES; 247 | CLANG_ENABLE_OBJC_ARC = YES; 248 | CLANG_ENABLE_OBJC_WEAK = YES; 249 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 250 | CLANG_WARN_BOOL_CONVERSION = YES; 251 | CLANG_WARN_COMMA = YES; 252 | CLANG_WARN_CONSTANT_CONVERSION = YES; 253 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 254 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 255 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 256 | CLANG_WARN_EMPTY_BODY = YES; 257 | CLANG_WARN_ENUM_CONVERSION = YES; 258 | CLANG_WARN_INFINITE_RECURSION = YES; 259 | CLANG_WARN_INT_CONVERSION = YES; 260 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 261 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 262 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 263 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 264 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 265 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 266 | CLANG_WARN_STRICT_PROTOTYPES = YES; 267 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 268 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 269 | CLANG_WARN_UNREACHABLE_CODE = YES; 270 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 271 | COPY_PHASE_STRIP = NO; 272 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 273 | ENABLE_NS_ASSERTIONS = NO; 274 | ENABLE_STRICT_OBJC_MSGSEND = YES; 275 | GCC_C_LANGUAGE_STANDARD = gnu11; 276 | GCC_NO_COMMON_BLOCKS = YES; 277 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 278 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 279 | GCC_WARN_UNDECLARED_SELECTOR = YES; 280 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 281 | GCC_WARN_UNUSED_FUNCTION = YES; 282 | GCC_WARN_UNUSED_VARIABLE = YES; 283 | IPHONEOS_DEPLOYMENT_TARGET = 14.1; 284 | MTL_ENABLE_DEBUG_INFO = NO; 285 | MTL_FAST_MATH = YES; 286 | SDKROOT = iphoneos; 287 | SWIFT_COMPILATION_MODE = wholemodule; 288 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 289 | VALIDATE_PRODUCT = YES; 290 | }; 291 | name = Release; 292 | }; 293 | 86AE26662556E9A60013EA6E /* Debug */ = { 294 | isa = XCBuildConfiguration; 295 | buildSettings = { 296 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 297 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 298 | CODE_SIGN_STYLE = Automatic; 299 | DEVELOPMENT_ASSET_PATHS = "\"Hello/Preview Content\""; 300 | ENABLE_PREVIEWS = YES; 301 | INFOPLIST_FILE = Hello/Info.plist; 302 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 303 | LD_RUNPATH_SEARCH_PATHS = ( 304 | "$(inherited)", 305 | "@executable_path/Frameworks", 306 | ); 307 | PRODUCT_BUNDLE_IDENTIFIER = Demo.Hello; 308 | PRODUCT_NAME = "$(TARGET_NAME)"; 309 | SWIFT_VERSION = 5.0; 310 | TARGETED_DEVICE_FAMILY = "1,2"; 311 | }; 312 | name = Debug; 313 | }; 314 | 86AE26672556E9A60013EA6E /* Release */ = { 315 | isa = XCBuildConfiguration; 316 | buildSettings = { 317 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 318 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 319 | CODE_SIGN_STYLE = Automatic; 320 | DEVELOPMENT_ASSET_PATHS = "\"Hello/Preview Content\""; 321 | ENABLE_PREVIEWS = YES; 322 | INFOPLIST_FILE = Hello/Info.plist; 323 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 324 | LD_RUNPATH_SEARCH_PATHS = ( 325 | "$(inherited)", 326 | "@executable_path/Frameworks", 327 | ); 328 | PRODUCT_BUNDLE_IDENTIFIER = Demo.Hello; 329 | PRODUCT_NAME = "$(TARGET_NAME)"; 330 | SWIFT_VERSION = 5.0; 331 | TARGETED_DEVICE_FAMILY = "1,2"; 332 | }; 333 | name = Release; 334 | }; 335 | /* End XCBuildConfiguration section */ 336 | 337 | /* Begin XCConfigurationList section */ 338 | 86AE26512556E9A40013EA6E /* Build configuration list for PBXProject "Hello" */ = { 339 | isa = XCConfigurationList; 340 | buildConfigurations = ( 341 | 86AE26632556E9A60013EA6E /* Debug */, 342 | 86AE26642556E9A60013EA6E /* Release */, 343 | ); 344 | defaultConfigurationIsVisible = 0; 345 | defaultConfigurationName = Release; 346 | }; 347 | 86AE26652556E9A60013EA6E /* Build configuration list for PBXNativeTarget "Hello" */ = { 348 | isa = XCConfigurationList; 349 | buildConfigurations = ( 350 | 86AE26662556E9A60013EA6E /* Debug */, 351 | 86AE26672556E9A60013EA6E /* Release */, 352 | ); 353 | defaultConfigurationIsVisible = 0; 354 | defaultConfigurationName = Release; 355 | }; 356 | /* End XCConfigurationList section */ 357 | }; 358 | rootObject = 86AE264E2556E9A40013EA6E /* Project object */; 359 | } 360 | -------------------------------------------------------------------------------- /Hello.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Hello.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Hello.xcodeproj/project.xcworkspace/xcuserdata/jordansinger.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordansinger/swiftui-ios-14-onboarding/cae903405da9275a75a0ca1a749066f956582992/Hello.xcodeproj/project.xcworkspace/xcuserdata/jordansinger.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Hello.xcodeproj/xcuserdata/jordansinger.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Hello.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Hello/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 | -------------------------------------------------------------------------------- /Hello/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 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Hello/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Hello/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // Hello 4 | // 5 | // Created by Jordan Singer on 11/7/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | var body: some View { 12 | NavigationView { 13 | VStack { 14 | Spacer() 15 | Text("Hello") 16 | .font(.system(size: 48, weight: .semibold)) 17 | .padding(.bottom) 18 | Spacer() 19 | 20 | NavigationLink(destination: LanguageView()) { 21 | Text("Get Started") 22 | .font(.headline) 23 | } 24 | } 25 | .padding() 26 | } 27 | } 28 | } 29 | 30 | struct ContentView_Previews: PreviewProvider { 31 | static var previews: some View { 32 | ContentView() 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Hello/HelloApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HelloApp.swift 3 | // Hello 4 | // 5 | // Created by Jordan Singer on 11/7/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct HelloApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Hello/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | 28 | UIApplicationSupportsIndirectInputEvents 29 | 30 | UILaunchScreen 31 | 32 | UIRequiredDeviceCapabilities 33 | 34 | armv7 35 | 36 | UISupportedInterfaceOrientations 37 | 38 | UIInterfaceOrientationPortrait 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UISupportedInterfaceOrientations~ipad 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationPortraitUpsideDown 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /Hello/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Hello/Views/CountryRegionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CountryRegionView.swift 3 | // Hello 4 | // 5 | // Created by Jordan Singer on 11/7/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct CountryRegionView: View { 11 | @Environment(\.colorScheme) var colorScheme 12 | var countriesAndRegions = ["Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and/or Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British lndian Ocean Territory", "Brunei Darussalam", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo", "Cook Islands", "Costa Rica", "Croatia (Hrvatska)", "Cuba", "Cyprus", "Czech Republic", "Denmark", "Djibouti", "Dominica", "Dominican Republic", "East Timor", "Ecudaor", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Ethiopia", "Falkland Islands (Malvinas)", "Faroe Islands", "Fiji", "Finland", "France", "France, Metropolitan", "French Guiana", "French Polynesia", "French Southern Territories", "Gabon", "Gambia", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau", "Guyana", "Haiti", "Heard and Mc Donald Islands", "Honduras", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran (Islamic Republic of)", "Iraq", "Ireland", "Israel", "Italy", "Ivory Coast", "Jamaica", "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Korea, Democratic People's Republic of", "Korea, Republic of", "Kuwait", "Kyrgyzstan", "Lao People's Democratic Republic", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libyan Arab Jamahiriya", "Liechtenstein", "Lithuania", "Luxembourg", "Macau", "Macedonia", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia, Federated States of", "Moldova, Republic of", "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia", "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Niue", "Norfork Island", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Pitcairn", "Poland", "Portugal", "Puerto Rico", "Qatar", "Reunion", "Romania", "Russian Federation", "Rwanda", "Saint Kitts and Nevis", "Saint Lucia", "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Georgia South Sandwich Islands", "Spain", "Sri Lanka", "St. Helena", "St. Pierre and Miquelon", "Sudan", "Suriname", "Svalbarn and Jan Mayen Islands", "Swaziland", "Sweden", "Switzerland", "Syrian Arab Republic", "Taiwan", "Tajikistan", "Tanzania, United Republic of", "Thailand", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States minor outlying islands", "Uruguay", "Uzbekistan", "Vanuatu", "Vatican City State", "Venezuela", "Vietnam", "Virigan Islands (British)", "Virgin Islands (U.S.)", "Wallis and Futuna Islands", "Western Sahara", "Yemen", "Yugoslavia", "Zaire", "Zambia", "Zimbabwe"] 13 | 14 | var body: some View { 15 | List { 16 | Section { 17 | VStack(spacing: 24) { 18 | HStack { 19 | Spacer() 20 | Image(systemName: "location.circle") 21 | .font(.system(size: 72)) 22 | .foregroundColor(.blue) 23 | Spacer() 24 | } 25 | 26 | Text("Select Your Country or Region") 27 | .font(.system(size: 32, weight: .bold)) 28 | .multilineTextAlignment(.center) 29 | } 30 | .padding() 31 | } 32 | .listRowInsets(EdgeInsets()) 33 | .listRowBackground( 34 | colorScheme == .light ? 35 | Color(UIColor.secondarySystemBackground) : 36 | Color(UIColor.systemBackground) 37 | ) 38 | 39 | Section { 40 | NavigationLink(destination: QuickStartView()) { 41 | Text("United States") 42 | .font(.headline) 43 | .padding(.vertical, 12) 44 | } 45 | } 46 | 47 | Section { 48 | ForEach(countriesAndRegions, id: \.self) { countryOrRegion in 49 | NavigationLink(destination: QuickStartView()) { 50 | Text(countryOrRegion) 51 | .font(.headline) 52 | .padding(.vertical, 12) 53 | } 54 | } 55 | } 56 | } 57 | .listStyle(InsetGroupedListStyle()) 58 | } 59 | } 60 | 61 | struct CountryRegionView_Previews: PreviewProvider { 62 | static var previews: some View { 63 | CountryRegionView() 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Hello/Views/LanguageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LanguageView.swift 3 | // Hello 4 | // 5 | // Created by Jordan Singer on 11/7/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct LanguageView: View { 11 | @Environment(\.colorScheme) var colorScheme 12 | var languages = [ 13 | "English", 14 | "Español", 15 | "中文(简体)", 16 | "中文(繁體)", 17 | "Français", 18 | "Deutsch", 19 | "हिंदी", 20 | "Magyar", 21 | "Italiano", 22 | "日本語", 23 | "한국어", 24 | "Português", 25 | "Română", 26 | "Slovenski" 27 | ] 28 | 29 | var body: some View { 30 | List { 31 | Section { 32 | HStack { 33 | Spacer() 34 | Image(systemName: "globe") 35 | .font(.system(size: 72)) 36 | .foregroundColor(.blue) 37 | Spacer() 38 | } 39 | .padding(.vertical) 40 | } 41 | .listRowInsets(EdgeInsets()) 42 | .listRowBackground( 43 | colorScheme == .light ? 44 | Color(UIColor.secondarySystemBackground) : 45 | Color(UIColor.systemBackground) 46 | ) 47 | 48 | Section { 49 | ForEach(languages, id: \.self) { language in 50 | NavigationLink(destination: CountryRegionView()) { 51 | Text(language) 52 | .font(.headline) 53 | .padding(.vertical, 12) 54 | } 55 | } 56 | } 57 | } 58 | .listStyle(InsetGroupedListStyle()) 59 | } 60 | } 61 | 62 | struct LanguageView_Previews: PreviewProvider { 63 | static var previews: some View { 64 | LanguageView() 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Hello/Views/QuickStartView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QuickStartView.swift 3 | // Hello 4 | // 5 | // Created by Jordan Singer on 11/7/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct QuickStartView: View { 11 | @Environment(\.colorScheme) var colorScheme 12 | 13 | var body: some View { 14 | ZStack { 15 | colorScheme == .light ? Color(UIColor.secondarySystemBackground) : Color(UIColor.systemBackground) 16 | 17 | VStack(spacing: 0) { 18 | VStack { 19 | Spacer() 20 | HStack { 21 | Spacer() 22 | ZStack { 23 | Text("Hello") 24 | .font(.system(size: 24, weight: .semibold)) 25 | .frame(width: 125, height: 222) 26 | .background(colorScheme == .light ? Color.white : Color(UIColor.secondarySystemBackground)) 27 | .cornerRadius(8) 28 | .offset(x: -48, y: 48) 29 | 30 | VStack(spacing: 10) { 31 | HStack(spacing: 10) { 32 | Image(systemName: "app.fill").foregroundColor(.green) 33 | Image(systemName: "app.fill").foregroundColor(.white) 34 | Image(systemName: "app.fill").foregroundColor(.yellow) 35 | Image(systemName: "app.fill").foregroundColor(.gray) 36 | } 37 | 38 | HStack(spacing: 10) { 39 | Image(systemName: "app.fill").foregroundColor(.blue) 40 | Image(systemName: "app.fill").foregroundColor(.gray) 41 | Image(systemName: "app.fill").foregroundColor(.green) 42 | Image(systemName: "app.fill").foregroundColor(.blue) 43 | } 44 | 45 | HStack(spacing: 10) { 46 | Image(systemName: "app.fill").foregroundColor(.yellow) 47 | Image(systemName: "app.fill").foregroundColor(.white) 48 | Image(systemName: "app.fill").foregroundColor(.red) 49 | Image(systemName: "app.fill").foregroundColor(.purple) 50 | } 51 | 52 | HStack(spacing: 10) { 53 | Image(systemName: "app.fill").foregroundColor(.pink) 54 | Image(systemName: "app.fill").foregroundColor(.blue) 55 | Image(systemName: "app.fill").foregroundColor(.blue) 56 | Image(systemName: "app.fill").foregroundColor(.orange) 57 | } 58 | 59 | HStack(spacing: 10) { 60 | Image(systemName: "app.fill").foregroundColor(.red) 61 | Image(systemName: "app.fill").foregroundColor(.yellow) 62 | Image(systemName: "app.fill").foregroundColor(.green) 63 | Image(systemName: "app.fill").foregroundColor(.gray) 64 | } 65 | 66 | Spacer() 67 | } 68 | .padding() 69 | .font(.system(size: 20)) 70 | .frame(width: 125, height: 222) 71 | .background(Color(UIColor.orange.withAlphaComponent(0.64))) 72 | .background(Color.white) 73 | .cornerRadius(8) 74 | .offset(x: 48, y: 96) 75 | .shadow(color: Color(UIColor.black.withAlphaComponent(0.04)), radius: 8, x: 0, y: 4) 76 | } 77 | Spacer() 78 | } 79 | Spacer() 80 | } 81 | .frame(height: 380) 82 | .clipShape(Rectangle()) 83 | 84 | VStack(spacing: 16) { 85 | Spacer() 86 | Text("Quick Start") 87 | .font(.system(size: 32, weight: .bold)) 88 | .multilineTextAlignment(.center) 89 | 90 | HStack { 91 | Spacer() 92 | Text("Bring your current iPhone or iPad near this iPhone to sign in and set up.\n\nIf your other iPhone or iPad doesn't show options for setting up this iPhone, make sure it's running iOS 11 or later, and has Bluetooth turned on. You can also set up this iPhone manually.") 93 | .fixedSize(horizontal: false, vertical: true) 94 | .font(.callout) 95 | .multilineTextAlignment(.center) 96 | Spacer() 97 | } 98 | 99 | Spacer() 100 | 101 | NavigationLink(destination: WiFiView()) { 102 | Text("Set Up Manually") 103 | .font(.headline) 104 | } 105 | 106 | Spacer() 107 | } 108 | .padding() 109 | .background(colorScheme == .light ? Color.white : Color(UIColor.secondarySystemBackground)) 110 | } 111 | } 112 | .edgesIgnoringSafeArea(.all) 113 | } 114 | } 115 | 116 | struct QuickStartView_Previews: PreviewProvider { 117 | static var previews: some View { 118 | QuickStartView() 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /Hello/Views/WiFiPasswordView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WiFiPasswordView.swift 3 | // Hello 4 | // 5 | // Created by Jordan Singer on 11/7/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct WiFiPasswordView: View { 11 | @Environment(\.presentationMode) var presentationMode 12 | @State var password = "" 13 | 14 | var body: some View { 15 | NavigationView { 16 | Form { 17 | SecureField("Password", text: $password) 18 | } 19 | .navigationBarTitle("Enter Password", displayMode: .inline) 20 | .navigationBarItems(leading: Button(action: { self.presentationMode.wrappedValue.dismiss() }) { 21 | Text("Cancel") 22 | .font(.body) 23 | }, trailing: Button(action: { self.presentationMode.wrappedValue.dismiss() }) { 24 | Text("Join") 25 | }) 26 | } 27 | } 28 | } 29 | 30 | struct WiFiPasswordView_Previews: PreviewProvider { 31 | static var previews: some View { 32 | WiFiPasswordView() 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Hello/Views/WiFiView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WiFiView.swift 3 | // Hello 4 | // 5 | // Created by Jordan Singer on 11/7/20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct WiFiView: View { 11 | @Environment(\.colorScheme) var colorScheme 12 | var networks = ["Secure Wi-Fi Network", "Cafe Wi-Fi", "Stacey's iPhone", "Public Wi-Fi", "Wi-Fi Network"] 13 | @State var showEnterPasswordView = false 14 | 15 | var body: some View { 16 | List { 17 | Section { 18 | VStack(spacing: 24) { 19 | HStack { 20 | Spacer() 21 | Image(systemName: "wifi") 22 | .font(.system(size: 72)) 23 | .foregroundColor(.blue) 24 | Spacer() 25 | } 26 | 27 | Text("Choose a Wi-Fi Network") 28 | .font(.system(size: 32, weight: .bold)) 29 | .multilineTextAlignment(.center) 30 | } 31 | .padding() 32 | } 33 | .listRowInsets(EdgeInsets()) 34 | .listRowBackground( 35 | colorScheme == .light ? 36 | Color(UIColor.secondarySystemBackground) : 37 | Color(UIColor.systemBackground) 38 | ) 39 | 40 | Section { 41 | ForEach(networks, id: \.self) { network in 42 | Button(action: { showEnterPasswordView = true }) { 43 | HStack { 44 | Text(network) 45 | .font(.headline) 46 | 47 | Spacer() 48 | 49 | Image(systemName: "lock.fill") 50 | .font(.caption) 51 | Image(systemName: "wifi") 52 | .font(.caption) 53 | } 54 | .padding(.vertical, 12) 55 | } 56 | .buttonStyle(PlainButtonStyle()) 57 | .sheet(isPresented: $showEnterPasswordView) { 58 | WiFiPasswordView() 59 | } 60 | } 61 | } 62 | } 63 | .listStyle(InsetGroupedListStyle()) 64 | } 65 | } 66 | 67 | struct WiFiView_Previews: PreviewProvider { 68 | static var previews: some View { 69 | WiFiView() 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iOS 14 Onboarding in SwiftUI 2 | ![Onboarding](https://user-images.githubusercontent.com/110813/98446197-dbadc780-20e9-11eb-8e81-04ea98299789.png) 3 | --------------------------------------------------------------------------------