├── .gitignore ├── AppLaunchSequence.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── AppLaunchSequence ├── AppDelegate.swift ├── AppLaunchSequence.entitlements ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist └── ViewController.swift ├── AppLaunchSequenceTests ├── AppLaunchSequenceTests.swift └── Info.plist ├── README.md ├── apple-app-site-association ├── index.html └── index.php /.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 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 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 | # Package.pins 40 | .build/ 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 | # Carthage 51 | # 52 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 53 | # Carthage/Checkouts 54 | 55 | Carthage/Build 56 | 57 | # fastlane 58 | # 59 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 60 | # screenshots whenever they are needed. 61 | # For more information about the recommended setup visit: 62 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 63 | 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots 67 | fastlane/test_output 68 | -------------------------------------------------------------------------------- /AppLaunchSequence.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D8BB94031F9537BF00D08C92 /* AppLaunchSequence.entitlements in Sources */ = {isa = PBXBuildFile; fileRef = D8BB94021F95374100D08C92 /* AppLaunchSequence.entitlements */; }; 11 | D8F0F3361F8EB755002E42DB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F0F3351F8EB755002E42DB /* AppDelegate.swift */; }; 12 | D8F0F3381F8EB755002E42DB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F0F3371F8EB755002E42DB /* ViewController.swift */; }; 13 | D8F0F33B1F8EB755002E42DB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D8F0F3391F8EB755002E42DB /* Main.storyboard */; }; 14 | D8F0F33D1F8EB755002E42DB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D8F0F33C1F8EB755002E42DB /* Assets.xcassets */; }; 15 | D8F0F3401F8EB755002E42DB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D8F0F33E1F8EB755002E42DB /* LaunchScreen.storyboard */; }; 16 | D8F0F34B1F8EB755002E42DB /* AppLaunchSequenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8F0F34A1F8EB755002E42DB /* AppLaunchSequenceTests.swift */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXContainerItemProxy section */ 20 | D8F0F3471F8EB755002E42DB /* PBXContainerItemProxy */ = { 21 | isa = PBXContainerItemProxy; 22 | containerPortal = D8F0F32A1F8EB755002E42DB /* Project object */; 23 | proxyType = 1; 24 | remoteGlobalIDString = D8F0F3311F8EB755002E42DB; 25 | remoteInfo = AppLaunchSequence; 26 | }; 27 | /* End PBXContainerItemProxy section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | D8BB94021F95374100D08C92 /* AppLaunchSequence.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AppLaunchSequence.entitlements; sourceTree = ""; }; 31 | D8F0F3321F8EB755002E42DB /* AppLaunchSequence.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppLaunchSequence.app; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | D8F0F3351F8EB755002E42DB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33 | D8F0F3371F8EB755002E42DB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 34 | D8F0F33A1F8EB755002E42DB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 35 | D8F0F33C1F8EB755002E42DB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 36 | D8F0F33F1F8EB755002E42DB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 37 | D8F0F3411F8EB755002E42DB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 38 | D8F0F3461F8EB755002E42DB /* AppLaunchSequenceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppLaunchSequenceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | D8F0F34A1F8EB755002E42DB /* AppLaunchSequenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLaunchSequenceTests.swift; sourceTree = ""; }; 40 | D8F0F34C1F8EB755002E42DB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | /* End PBXFileReference section */ 42 | 43 | /* Begin PBXFrameworksBuildPhase section */ 44 | D8F0F32F1F8EB755002E42DB /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | ); 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | D8F0F3431F8EB755002E42DB /* Frameworks */ = { 52 | isa = PBXFrameworksBuildPhase; 53 | buildActionMask = 2147483647; 54 | files = ( 55 | ); 56 | runOnlyForDeploymentPostprocessing = 0; 57 | }; 58 | /* End PBXFrameworksBuildPhase section */ 59 | 60 | /* Begin PBXGroup section */ 61 | D8F0F3291F8EB755002E42DB = { 62 | isa = PBXGroup; 63 | children = ( 64 | D8F0F3341F8EB755002E42DB /* AppLaunchSequence */, 65 | D8F0F3491F8EB755002E42DB /* AppLaunchSequenceTests */, 66 | D8F0F3331F8EB755002E42DB /* Products */, 67 | ); 68 | sourceTree = ""; 69 | }; 70 | D8F0F3331F8EB755002E42DB /* Products */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | D8F0F3321F8EB755002E42DB /* AppLaunchSequence.app */, 74 | D8F0F3461F8EB755002E42DB /* AppLaunchSequenceTests.xctest */, 75 | ); 76 | name = Products; 77 | sourceTree = ""; 78 | }; 79 | D8F0F3341F8EB755002E42DB /* AppLaunchSequence */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | D8BB94021F95374100D08C92 /* AppLaunchSequence.entitlements */, 83 | D8F0F3351F8EB755002E42DB /* AppDelegate.swift */, 84 | D8F0F3371F8EB755002E42DB /* ViewController.swift */, 85 | D8F0F3391F8EB755002E42DB /* Main.storyboard */, 86 | D8F0F33C1F8EB755002E42DB /* Assets.xcassets */, 87 | D8F0F33E1F8EB755002E42DB /* LaunchScreen.storyboard */, 88 | D8F0F3411F8EB755002E42DB /* Info.plist */, 89 | ); 90 | path = AppLaunchSequence; 91 | sourceTree = ""; 92 | }; 93 | D8F0F3491F8EB755002E42DB /* AppLaunchSequenceTests */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | D8F0F34A1F8EB755002E42DB /* AppLaunchSequenceTests.swift */, 97 | D8F0F34C1F8EB755002E42DB /* Info.plist */, 98 | ); 99 | path = AppLaunchSequenceTests; 100 | sourceTree = ""; 101 | }; 102 | /* End PBXGroup section */ 103 | 104 | /* Begin PBXNativeTarget section */ 105 | D8F0F3311F8EB755002E42DB /* AppLaunchSequence */ = { 106 | isa = PBXNativeTarget; 107 | buildConfigurationList = D8F0F34F1F8EB755002E42DB /* Build configuration list for PBXNativeTarget "AppLaunchSequence" */; 108 | buildPhases = ( 109 | D8F0F32E1F8EB755002E42DB /* Sources */, 110 | D8F0F32F1F8EB755002E42DB /* Frameworks */, 111 | D8F0F3301F8EB755002E42DB /* Resources */, 112 | ); 113 | buildRules = ( 114 | ); 115 | dependencies = ( 116 | ); 117 | name = AppLaunchSequence; 118 | productName = AppLaunchSequence; 119 | productReference = D8F0F3321F8EB755002E42DB /* AppLaunchSequence.app */; 120 | productType = "com.apple.product-type.application"; 121 | }; 122 | D8F0F3451F8EB755002E42DB /* AppLaunchSequenceTests */ = { 123 | isa = PBXNativeTarget; 124 | buildConfigurationList = D8F0F3521F8EB755002E42DB /* Build configuration list for PBXNativeTarget "AppLaunchSequenceTests" */; 125 | buildPhases = ( 126 | D8F0F3421F8EB755002E42DB /* Sources */, 127 | D8F0F3431F8EB755002E42DB /* Frameworks */, 128 | D8F0F3441F8EB755002E42DB /* Resources */, 129 | ); 130 | buildRules = ( 131 | ); 132 | dependencies = ( 133 | D8F0F3481F8EB755002E42DB /* PBXTargetDependency */, 134 | ); 135 | name = AppLaunchSequenceTests; 136 | productName = AppLaunchSequenceTests; 137 | productReference = D8F0F3461F8EB755002E42DB /* AppLaunchSequenceTests.xctest */; 138 | productType = "com.apple.product-type.bundle.unit-test"; 139 | }; 140 | /* End PBXNativeTarget section */ 141 | 142 | /* Begin PBXProject section */ 143 | D8F0F32A1F8EB755002E42DB /* Project object */ = { 144 | isa = PBXProject; 145 | attributes = { 146 | LastSwiftUpdateCheck = 0900; 147 | LastUpgradeCheck = 0900; 148 | ORGANIZATIONNAME = "Sean Berry"; 149 | TargetAttributes = { 150 | D8F0F3311F8EB755002E42DB = { 151 | CreatedOnToolsVersion = 9.0; 152 | ProvisioningStyle = Automatic; 153 | SystemCapabilities = { 154 | com.apple.BackgroundModes = { 155 | enabled = 1; 156 | }; 157 | com.apple.Push = { 158 | enabled = 1; 159 | }; 160 | com.apple.SafariKeychain = { 161 | enabled = 1; 162 | }; 163 | }; 164 | }; 165 | D8F0F3451F8EB755002E42DB = { 166 | CreatedOnToolsVersion = 9.0; 167 | ProvisioningStyle = Automatic; 168 | TestTargetID = D8F0F3311F8EB755002E42DB; 169 | }; 170 | }; 171 | }; 172 | buildConfigurationList = D8F0F32D1F8EB755002E42DB /* Build configuration list for PBXProject "AppLaunchSequence" */; 173 | compatibilityVersion = "Xcode 8.0"; 174 | developmentRegion = en; 175 | hasScannedForEncodings = 0; 176 | knownRegions = ( 177 | en, 178 | Base, 179 | ); 180 | mainGroup = D8F0F3291F8EB755002E42DB; 181 | productRefGroup = D8F0F3331F8EB755002E42DB /* Products */; 182 | projectDirPath = ""; 183 | projectRoot = ""; 184 | targets = ( 185 | D8F0F3311F8EB755002E42DB /* AppLaunchSequence */, 186 | D8F0F3451F8EB755002E42DB /* AppLaunchSequenceTests */, 187 | ); 188 | }; 189 | /* End PBXProject section */ 190 | 191 | /* Begin PBXResourcesBuildPhase section */ 192 | D8F0F3301F8EB755002E42DB /* Resources */ = { 193 | isa = PBXResourcesBuildPhase; 194 | buildActionMask = 2147483647; 195 | files = ( 196 | D8F0F3401F8EB755002E42DB /* LaunchScreen.storyboard in Resources */, 197 | D8F0F33D1F8EB755002E42DB /* Assets.xcassets in Resources */, 198 | D8F0F33B1F8EB755002E42DB /* Main.storyboard in Resources */, 199 | ); 200 | runOnlyForDeploymentPostprocessing = 0; 201 | }; 202 | D8F0F3441F8EB755002E42DB /* Resources */ = { 203 | isa = PBXResourcesBuildPhase; 204 | buildActionMask = 2147483647; 205 | files = ( 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | /* End PBXResourcesBuildPhase section */ 210 | 211 | /* Begin PBXSourcesBuildPhase section */ 212 | D8F0F32E1F8EB755002E42DB /* Sources */ = { 213 | isa = PBXSourcesBuildPhase; 214 | buildActionMask = 2147483647; 215 | files = ( 216 | D8BB94031F9537BF00D08C92 /* AppLaunchSequence.entitlements in Sources */, 217 | D8F0F3381F8EB755002E42DB /* ViewController.swift in Sources */, 218 | D8F0F3361F8EB755002E42DB /* AppDelegate.swift in Sources */, 219 | ); 220 | runOnlyForDeploymentPostprocessing = 0; 221 | }; 222 | D8F0F3421F8EB755002E42DB /* Sources */ = { 223 | isa = PBXSourcesBuildPhase; 224 | buildActionMask = 2147483647; 225 | files = ( 226 | D8F0F34B1F8EB755002E42DB /* AppLaunchSequenceTests.swift in Sources */, 227 | ); 228 | runOnlyForDeploymentPostprocessing = 0; 229 | }; 230 | /* End PBXSourcesBuildPhase section */ 231 | 232 | /* Begin PBXTargetDependency section */ 233 | D8F0F3481F8EB755002E42DB /* PBXTargetDependency */ = { 234 | isa = PBXTargetDependency; 235 | target = D8F0F3311F8EB755002E42DB /* AppLaunchSequence */; 236 | targetProxy = D8F0F3471F8EB755002E42DB /* PBXContainerItemProxy */; 237 | }; 238 | /* End PBXTargetDependency section */ 239 | 240 | /* Begin PBXVariantGroup section */ 241 | D8F0F3391F8EB755002E42DB /* Main.storyboard */ = { 242 | isa = PBXVariantGroup; 243 | children = ( 244 | D8F0F33A1F8EB755002E42DB /* Base */, 245 | ); 246 | name = Main.storyboard; 247 | sourceTree = ""; 248 | }; 249 | D8F0F33E1F8EB755002E42DB /* LaunchScreen.storyboard */ = { 250 | isa = PBXVariantGroup; 251 | children = ( 252 | D8F0F33F1F8EB755002E42DB /* Base */, 253 | ); 254 | name = LaunchScreen.storyboard; 255 | sourceTree = ""; 256 | }; 257 | /* End PBXVariantGroup section */ 258 | 259 | /* Begin XCBuildConfiguration section */ 260 | D8F0F34D1F8EB755002E42DB /* Debug */ = { 261 | isa = XCBuildConfiguration; 262 | buildSettings = { 263 | ALWAYS_SEARCH_USER_PATHS = NO; 264 | CLANG_ANALYZER_NONNULL = YES; 265 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 266 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 267 | CLANG_CXX_LIBRARY = "libc++"; 268 | CLANG_ENABLE_MODULES = YES; 269 | CLANG_ENABLE_OBJC_ARC = YES; 270 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 271 | CLANG_WARN_BOOL_CONVERSION = YES; 272 | CLANG_WARN_COMMA = YES; 273 | CLANG_WARN_CONSTANT_CONVERSION = YES; 274 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 275 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 276 | CLANG_WARN_EMPTY_BODY = YES; 277 | CLANG_WARN_ENUM_CONVERSION = YES; 278 | CLANG_WARN_INFINITE_RECURSION = YES; 279 | CLANG_WARN_INT_CONVERSION = YES; 280 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 281 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 282 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 283 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 284 | CLANG_WARN_STRICT_PROTOTYPES = YES; 285 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 286 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 287 | CLANG_WARN_UNREACHABLE_CODE = YES; 288 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 289 | CODE_SIGN_IDENTITY = "iPhone Developer"; 290 | COPY_PHASE_STRIP = NO; 291 | DEBUG_INFORMATION_FORMAT = dwarf; 292 | ENABLE_STRICT_OBJC_MSGSEND = YES; 293 | ENABLE_TESTABILITY = YES; 294 | GCC_C_LANGUAGE_STANDARD = gnu11; 295 | GCC_DYNAMIC_NO_PIC = NO; 296 | GCC_NO_COMMON_BLOCKS = YES; 297 | GCC_OPTIMIZATION_LEVEL = 0; 298 | GCC_PREPROCESSOR_DEFINITIONS = ( 299 | "DEBUG=1", 300 | "$(inherited)", 301 | ); 302 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 303 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 304 | GCC_WARN_UNDECLARED_SELECTOR = YES; 305 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 306 | GCC_WARN_UNUSED_FUNCTION = YES; 307 | GCC_WARN_UNUSED_VARIABLE = YES; 308 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 309 | MTL_ENABLE_DEBUG_INFO = YES; 310 | ONLY_ACTIVE_ARCH = YES; 311 | SDKROOT = iphoneos; 312 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 313 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 314 | }; 315 | name = Debug; 316 | }; 317 | D8F0F34E1F8EB755002E42DB /* Release */ = { 318 | isa = XCBuildConfiguration; 319 | buildSettings = { 320 | ALWAYS_SEARCH_USER_PATHS = NO; 321 | CLANG_ANALYZER_NONNULL = YES; 322 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 323 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 324 | CLANG_CXX_LIBRARY = "libc++"; 325 | CLANG_ENABLE_MODULES = YES; 326 | CLANG_ENABLE_OBJC_ARC = YES; 327 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 328 | CLANG_WARN_BOOL_CONVERSION = YES; 329 | CLANG_WARN_COMMA = YES; 330 | CLANG_WARN_CONSTANT_CONVERSION = YES; 331 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 332 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 333 | CLANG_WARN_EMPTY_BODY = YES; 334 | CLANG_WARN_ENUM_CONVERSION = YES; 335 | CLANG_WARN_INFINITE_RECURSION = YES; 336 | CLANG_WARN_INT_CONVERSION = YES; 337 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 338 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 339 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 340 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 341 | CLANG_WARN_STRICT_PROTOTYPES = YES; 342 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 343 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 344 | CLANG_WARN_UNREACHABLE_CODE = YES; 345 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 346 | CODE_SIGN_IDENTITY = "iPhone Developer"; 347 | COPY_PHASE_STRIP = NO; 348 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 349 | ENABLE_NS_ASSERTIONS = NO; 350 | ENABLE_STRICT_OBJC_MSGSEND = YES; 351 | GCC_C_LANGUAGE_STANDARD = gnu11; 352 | GCC_NO_COMMON_BLOCKS = YES; 353 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 354 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 355 | GCC_WARN_UNDECLARED_SELECTOR = YES; 356 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 357 | GCC_WARN_UNUSED_FUNCTION = YES; 358 | GCC_WARN_UNUSED_VARIABLE = YES; 359 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 360 | MTL_ENABLE_DEBUG_INFO = NO; 361 | SDKROOT = iphoneos; 362 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 363 | VALIDATE_PRODUCT = YES; 364 | }; 365 | name = Release; 366 | }; 367 | D8F0F3501F8EB755002E42DB /* Debug */ = { 368 | isa = XCBuildConfiguration; 369 | buildSettings = { 370 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 371 | CODE_SIGN_ENTITLEMENTS = AppLaunchSequence/AppLaunchSequence.entitlements; 372 | CODE_SIGN_STYLE = Automatic; 373 | DEVELOPMENT_TEAM = VHK5T9DC9A; 374 | INFOPLIST_FILE = AppLaunchSequence/Info.plist; 375 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 376 | PRODUCT_BUNDLE_IDENTIFIER = com.regularberry.AppLaunchSequence; 377 | PRODUCT_NAME = "$(TARGET_NAME)"; 378 | SWIFT_VERSION = 4.0; 379 | TARGETED_DEVICE_FAMILY = "1,2"; 380 | }; 381 | name = Debug; 382 | }; 383 | D8F0F3511F8EB755002E42DB /* Release */ = { 384 | isa = XCBuildConfiguration; 385 | buildSettings = { 386 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 387 | CODE_SIGN_ENTITLEMENTS = AppLaunchSequence/AppLaunchSequence.entitlements; 388 | CODE_SIGN_STYLE = Automatic; 389 | DEVELOPMENT_TEAM = VHK5T9DC9A; 390 | INFOPLIST_FILE = AppLaunchSequence/Info.plist; 391 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 392 | PRODUCT_BUNDLE_IDENTIFIER = com.regularberry.AppLaunchSequence; 393 | PRODUCT_NAME = "$(TARGET_NAME)"; 394 | SWIFT_VERSION = 4.0; 395 | TARGETED_DEVICE_FAMILY = "1,2"; 396 | }; 397 | name = Release; 398 | }; 399 | D8F0F3531F8EB755002E42DB /* Debug */ = { 400 | isa = XCBuildConfiguration; 401 | buildSettings = { 402 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 403 | BUNDLE_LOADER = "$(TEST_HOST)"; 404 | CODE_SIGN_STYLE = Automatic; 405 | INFOPLIST_FILE = AppLaunchSequenceTests/Info.plist; 406 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 407 | PRODUCT_BUNDLE_IDENTIFIER = com.regularberry.com.AppLaunchSequenceTests; 408 | PRODUCT_NAME = "$(TARGET_NAME)"; 409 | SWIFT_VERSION = 4.0; 410 | TARGETED_DEVICE_FAMILY = "1,2"; 411 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AppLaunchSequence.app/AppLaunchSequence"; 412 | }; 413 | name = Debug; 414 | }; 415 | D8F0F3541F8EB755002E42DB /* Release */ = { 416 | isa = XCBuildConfiguration; 417 | buildSettings = { 418 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 419 | BUNDLE_LOADER = "$(TEST_HOST)"; 420 | CODE_SIGN_STYLE = Automatic; 421 | INFOPLIST_FILE = AppLaunchSequenceTests/Info.plist; 422 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 423 | PRODUCT_BUNDLE_IDENTIFIER = com.regularberry.com.AppLaunchSequenceTests; 424 | PRODUCT_NAME = "$(TARGET_NAME)"; 425 | SWIFT_VERSION = 4.0; 426 | TARGETED_DEVICE_FAMILY = "1,2"; 427 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AppLaunchSequence.app/AppLaunchSequence"; 428 | }; 429 | name = Release; 430 | }; 431 | /* End XCBuildConfiguration section */ 432 | 433 | /* Begin XCConfigurationList section */ 434 | D8F0F32D1F8EB755002E42DB /* Build configuration list for PBXProject "AppLaunchSequence" */ = { 435 | isa = XCConfigurationList; 436 | buildConfigurations = ( 437 | D8F0F34D1F8EB755002E42DB /* Debug */, 438 | D8F0F34E1F8EB755002E42DB /* Release */, 439 | ); 440 | defaultConfigurationIsVisible = 0; 441 | defaultConfigurationName = Release; 442 | }; 443 | D8F0F34F1F8EB755002E42DB /* Build configuration list for PBXNativeTarget "AppLaunchSequence" */ = { 444 | isa = XCConfigurationList; 445 | buildConfigurations = ( 446 | D8F0F3501F8EB755002E42DB /* Debug */, 447 | D8F0F3511F8EB755002E42DB /* Release */, 448 | ); 449 | defaultConfigurationIsVisible = 0; 450 | defaultConfigurationName = Release; 451 | }; 452 | D8F0F3521F8EB755002E42DB /* Build configuration list for PBXNativeTarget "AppLaunchSequenceTests" */ = { 453 | isa = XCConfigurationList; 454 | buildConfigurations = ( 455 | D8F0F3531F8EB755002E42DB /* Debug */, 456 | D8F0F3541F8EB755002E42DB /* Release */, 457 | ); 458 | defaultConfigurationIsVisible = 0; 459 | defaultConfigurationName = Release; 460 | }; 461 | /* End XCConfigurationList section */ 462 | }; 463 | rootObject = D8F0F32A1F8EB755002E42DB /* Project object */; 464 | } 465 | -------------------------------------------------------------------------------- /AppLaunchSequence.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /AppLaunchSequence/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // AppLaunchSequence 4 | // 5 | // Created by Sean Berry on 10/11/17. 6 | // Copyright © 2017 Sean Berry. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import UserNotifications 11 | 12 | extension UIApplicationState: CustomStringConvertible { 13 | public var description: String { 14 | switch self { 15 | case .active: 16 | return "Active" 17 | case .background: 18 | return "Background" 19 | case .inactive: 20 | return "Inactive" 21 | } 22 | } 23 | } 24 | 25 | @UIApplicationMain 26 | class AppDelegate: UIResponder, UIApplicationDelegate { 27 | var window: UIWindow? 28 | 29 | var callCount = 1 30 | var consoleOutput: String = "" 31 | 32 | // Help us format a GitHub numbered list 33 | private func callPrint(_ message: String) { 34 | let str = "\(callCount). \(message)" 35 | print(str) 36 | consoleOutput += "\(str)\n" 37 | callCount += 1 38 | } 39 | 40 | // MARK: Initializing the App 41 | 42 | func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 43 | let lo: String = launchOptions?.description ?? "nil" 44 | callPrint("applicationWillFinishLaunchingWithOptions: \(application.applicationState) - LaunchOptions: \(lo)") 45 | return true 46 | } 47 | 48 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 49 | let lo: String = launchOptions?.description ?? "nil" 50 | callPrint("applicationDidFinishLaunchingWithOptions: \(application.applicationState) - LaunchOptions: \(lo)") 51 | return true 52 | } 53 | 54 | // Not supposed to use this 55 | func applicationDidFinishLaunching(_ application: UIApplication) { 56 | callPrint("applicationDidFinishLaunching: \(application.applicationState)") 57 | } 58 | 59 | // MARK: Responding to App State Changes and System Events 60 | 61 | func applicationDidBecomeActive(_ application: UIApplication) { 62 | callPrint("applicationDidBecomeActive: \(application.applicationState)") 63 | } 64 | 65 | func applicationWillResignActive(_ application: UIApplication) { 66 | callPrint("applicationWillResignActive: \(application.applicationState)") 67 | } 68 | 69 | func applicationDidEnterBackground(_ application: UIApplication) { 70 | callPrint("applicationDidEnterBackground: \(application.applicationState)") 71 | } 72 | 73 | func applicationWillEnterForeground(_ application: UIApplication) { 74 | callPrint("applicationWillEnterForeground: \(application.applicationState)") 75 | } 76 | 77 | func applicationWillTerminate(_ application: UIApplication) { 78 | callPrint("applicationWillTerminate: \(application.applicationState)") 79 | } 80 | 81 | func applicationProtectedDataWillBecomeUnavailable(_ application: UIApplication) { 82 | callPrint("applicationProtectedDataWillBecomeUnavailable: \(application.applicationState)") 83 | } 84 | 85 | func applicationProtectedDataDidBecomeAvailable(_ application: UIApplication) { 86 | callPrint("applicationProtectedDataDidBecomeAvailable: \(application.applicationState)") 87 | } 88 | 89 | func applicationDidReceiveMemoryWarning(_ application: UIApplication) { 90 | callPrint("applicationDidReceiveMemoryWarning: \(application.applicationState)") 91 | } 92 | 93 | func applicationSignificantTimeChange(_ application: UIApplication) { 94 | callPrint("applicationSignificantTimeChange: \(application.applicationState)") 95 | } 96 | 97 | // MARK: Managing App State Restoration 98 | 99 | func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool { 100 | callPrint("applicationShouldSaveApplicationState: \(application.applicationState)") 101 | return true 102 | } 103 | 104 | func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool { 105 | callPrint("applicationShouldRestoreApplicationState: \(application.applicationState)") 106 | return true 107 | } 108 | 109 | func application(_ application: UIApplication, viewControllerWithRestorationIdentifierPath identifierComponents: [Any], coder: NSCoder) -> UIViewController? { 110 | callPrint("applicationViewControllerWithRestorationIdentifierPath: \(application.applicationState)") 111 | return nil 112 | } 113 | 114 | func application(_ application: UIApplication, willEncodeRestorableStateWith coder: NSCoder) { 115 | callPrint("applicationWillEncodeRestorableStateWith: \(application.applicationState)") 116 | } 117 | 118 | func application(_ application: UIApplication, didDecodeRestorableStateWith coder: NSCoder) { 119 | callPrint("applicationDidDecodeRestorableStateWith: \(application.applicationState)") 120 | } 121 | 122 | // MARK: Downloading Data in the Background 123 | 124 | func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 125 | callPrint("applicationPerformFetchWithCompletionHandler: \(application.applicationState)") 126 | } 127 | 128 | func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) { 129 | callPrint("applicationHandleEventsForBackgroundURLSession: \(application.applicationState)") 130 | } 131 | 132 | // MARK: Handling Remote Notification Registration 133 | 134 | func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 135 | callPrint("applicationDidRegisterForRemoteNotificationsWithDeviceToken: \(application.applicationState)") 136 | 137 | let tokenParts = deviceToken.map { data -> String in 138 | return String(format: "%02.2hhx", data) 139 | } 140 | 141 | let token = tokenParts.joined() 142 | print("Device Token: \(token)") 143 | } 144 | 145 | func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { 146 | callPrint("applicationDidFailToRegisterForRemoteNotificationsWithError: \(application.applicationState)") 147 | } 148 | 149 | func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 150 | callPrint("applicationDidReceiveRemoteNotification: \(application.applicationState)") 151 | } 152 | 153 | // MARK: Continuing User Activity and Handling Quick Actions 154 | 155 | func application(_ application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool { 156 | callPrint("applicationWillContinueUserActivityWithType: \(application.applicationState)") 157 | return true 158 | } 159 | 160 | func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { 161 | callPrint("applicationContinueUserActivityRestorationHandler: \(application.applicationState)") 162 | return true 163 | } 164 | 165 | func application(_ application: UIApplication, didUpdate userActivity: NSUserActivity) { 166 | callPrint("applicationDidUpdateUserActivity: \(application.applicationState)") 167 | } 168 | 169 | func application(_ application: UIApplication, didFailToContinueUserActivityWithType userActivityType: String, error: Error) { 170 | callPrint("applicationDidFailToContinueUserActivityWithType: \(application.applicationState)") 171 | } 172 | 173 | func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { 174 | callPrint("applicationPerformActionForShortcutItem: \(application.applicationState)") 175 | } 176 | 177 | // MARK: Interacting With WatchKit 178 | 179 | func application(_ application: UIApplication, handleWatchKitExtensionRequest userInfo: [AnyHashable : Any]?, reply: @escaping ([AnyHashable : Any]?) -> Void) { 180 | callPrint("applicationHandleWatchKitExtensionRequest: \(application.applicationState)") 181 | } 182 | 183 | // MARK: Interacting With HealthKit 184 | 185 | func applicationShouldRequestHealthAuthorization(_ application: UIApplication) { 186 | callPrint("applicationShouldRequestHealthAuthorization: \(application.applicationState)") 187 | } 188 | 189 | // MARK: Opening a URL-Specified Resource 190 | 191 | func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 192 | callPrint("applicationOpenURL: \(app.applicationState) URL:\(url) Options:\(options)") 193 | return true 194 | } 195 | 196 | // MARK: Disallowing Specified App Extension Types 197 | 198 | func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplicationExtensionPointIdentifier) -> Bool { 199 | callPrint("applicationShouldAllowExtensionPointIdentifier: \(application.applicationState)") 200 | return true 201 | } 202 | 203 | // MARK: Handling SiriKit Intents 204 | 205 | // func application(_ application: UIApplication, handle: INIntent, completionHandler: (INIntentResponse) -> Void) 206 | 207 | // MARK: Handling CloudKit Invitations 208 | 209 | // func application(_ application: UIApplication, userDidAcceptCloudKitShareWith: CKShareMetadata) 210 | 211 | // MARK: Managing Interface Geometry 212 | 213 | func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 214 | callPrint("applicationSupportedInterfaceOrientationsFor: \(application.applicationState)") 215 | return .all 216 | } 217 | 218 | func application(_ application: UIApplication, willChangeStatusBarOrientation newStatusBarOrientation: UIInterfaceOrientation, duration: TimeInterval) { 219 | callPrint("applicationWillChangeStatusBarOrientation: \(application.applicationState)") 220 | } 221 | 222 | func application(_ application: UIApplication, didChangeStatusBarOrientation oldStatusBarOrientation: UIInterfaceOrientation) { 223 | callPrint("applicationDidChangeStatusBarOrientation: \(application.applicationState)") 224 | } 225 | 226 | func application(_ application: UIApplication, willChangeStatusBarFrame newStatusBarFrame: CGRect) { 227 | callPrint("applicationWillChangeStatusBarFrame: \(application.applicationState)") 228 | } 229 | 230 | func application(_ application: UIApplication, didChangeStatusBarFrame oldStatusBarFrame: CGRect) { 231 | callPrint("applicationDidChangeStatusBarFrame: \(application.applicationState)") 232 | } 233 | } 234 | -------------------------------------------------------------------------------- /AppLaunchSequence/AppLaunchSequence.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.associated-domains 8 | 9 | applinks:universal-link-sequence.herokuapp.com 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /AppLaunchSequence/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | } 88 | ], 89 | "info" : { 90 | "version" : 1, 91 | "author" : "xcode" 92 | } 93 | } -------------------------------------------------------------------------------- /AppLaunchSequence/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /AppLaunchSequence/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /AppLaunchSequence/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 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleURLTypes 20 | 21 | 22 | CFBundleTypeRole 23 | Editor 24 | CFBundleURLName 25 | com.regularberry.appLaunchSeq 26 | CFBundleURLSchemes 27 | 28 | appLaunchSeq 29 | 30 | 31 | 32 | CFBundleVersion 33 | 1 34 | LSRequiresIPhoneOS 35 | 36 | UIBackgroundModes 37 | 38 | fetch 39 | remote-notification 40 | 41 | UILaunchStoryboardName 42 | LaunchScreen 43 | UIMainStoryboardFile 44 | Main 45 | UIRequiredDeviceCapabilities 46 | 47 | armv7 48 | 49 | UISupportedInterfaceOrientations 50 | 51 | UIInterfaceOrientationPortrait 52 | UIInterfaceOrientationLandscapeLeft 53 | UIInterfaceOrientationLandscapeRight 54 | 55 | UISupportedInterfaceOrientations~ipad 56 | 57 | UIInterfaceOrientationPortrait 58 | UIInterfaceOrientationPortraitUpsideDown 59 | UIInterfaceOrientationLandscapeLeft 60 | UIInterfaceOrientationLandscapeRight 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /AppLaunchSequence/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // AppLaunchSequence 4 | // 5 | // Created by Sean Berry on 10/11/17. 6 | // Copyright © 2017 Sean Berry. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import UserNotifications 11 | 12 | class ViewController: UIViewController { 13 | @IBOutlet weak var textView: UITextView! 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | // Do any additional setup after loading the view, typically from a nib. 18 | } 19 | 20 | @IBAction func updateTextView(){ 21 | self.textView.text = (UIApplication.shared.delegate as? AppDelegate)!.consoleOutput 22 | askForNotificationPermission() 23 | } 24 | 25 | func askForNotificationPermission() { 26 | UIApplication.shared.registerForRemoteNotifications() 27 | let center = UNUserNotificationCenter.current() 28 | center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /AppLaunchSequenceTests/AppLaunchSequenceTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppLaunchSequenceTests.swift 3 | // AppLaunchSequenceTests 4 | // 5 | // Created by Sean Berry on 10/11/17. 6 | // Copyright © 2017 Sean Berry. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import AppLaunchSequence 11 | 12 | class AppLaunchSequenceTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /AppLaunchSequenceTests/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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # About 2 | This reference will tell you the order in which UIApplicationDelegate methods are called based on the action performed and the current state of the app. 3 | 4 | # Definitions 5 | **Not Loaded** is defined as the app not being in memory at all. 6 | 7 | **Backgrounded** is defined as being in the background (not yet purged from memory). 8 | 9 | This data was gathered using iOS 11.0.3 10 | 11 | # Actions 12 | * [Launching the app](#launching-the-app---from-not-loaded) 13 | * [Backgrounding the app](#backgrounding-the-app---from-active) 14 | * [Open Universal Link](#universal-link---from-not-loaded) 15 | * [Open Deep Link](#deep-link---from-not-loaded) 16 | * [Open Push Notification](#push-notification---from-not-loaded) 17 | * [System Alert Displayed](#system-alert-displayed) 18 | * [Background Fetch](#background-fetch---from-not-loaded) 19 | 20 | ## Launching the app - from *Not Loaded* 21 | 1. applicationWillChangeStatusBarFrame: Inactive 22 | 2. applicationDidChangeStatusBarFrame: Inactive 23 | 3. applicationSupportedInterfaceOrientationsFor: Inactive 24 | 4. applicationSupportedInterfaceOrientationsFor: Inactive 25 | 5. applicationSupportedInterfaceOrientationsFor: Inactive 26 | 6. applicationSupportedInterfaceOrientationsFor: Inactive 27 | 7. applicationWillFinishLaunchingWithOptions: Inactive - LaunchOptions: nil 28 | 8. applicationDidFinishLaunchingWithOptions: Inactive - LaunchOptions: nil 29 | 9. applicationSupportedInterfaceOrientationsFor: Inactive 30 | 10. applicationSupportedInterfaceOrientationsFor: Inactive 31 | 11. applicationSupportedInterfaceOrientationsFor: Inactive 32 | 12. applicationDidBecomeActive: Active 33 | 34 | ## Launching the app - from *Backgrounded* 35 | 1. applicationWillEnterForeground: Background 36 | 2. applicationDidBecomeActive: Active 37 | 38 | ## Backgrounding the app - from *Active* 39 | 1. applicationWillResignActive: Active 40 | 2. applicationDidEnterBackground: Background 41 | 3. applicationShouldSaveApplicationState: Background 42 | 4. applicationWillEncodeRestorableStateWith: Background 43 | 5. applicationSupportedInterfaceOrientationsFor: Background 44 | 45 | ## Universal Link - from *Not Loaded* 46 | 1. applicationWillChangeStatusBarFrame: Inactive 47 | 2. applicationDidChangeStatusBarFrame: Inactive 48 | 3. applicationSupportedInterfaceOrientationsFor: Inactive 49 | 4. applicationSupportedInterfaceOrientationsFor: Inactive 50 | 5. applicationSupportedInterfaceOrientationsFor: Inactive 51 | 6. applicationSupportedInterfaceOrientationsFor: Inactive 52 | 7. applicationWillFinishLaunchingWithOptions: Inactive - LaunchOptions: { 53 | UIApplicationLaunchOptionsUserActivityIdentifierKey = "748F80DF-639A-4013-A8E6-F174E99DEE03"; 54 | UIApplicationLaunchOptionsUserActivityKey = ""; 55 | UIApplicationLaunchOptionsUserActivityTypeKey = NSUserActivityTypeBrowsingWeb; 56 | } 57 | 8. applicationShouldRestoreApplicationState: Inactive 58 | 9. applicationDidDecodeRestorableStateWith: Inactive 59 | 10. applicationDidFinishLaunchingWithOptions: Inactive - LaunchOptions: { 60 | UIApplicationLaunchOptionsUserActivityIdentifierKey = "748F80DF-639A-4013-A8E6-F174E99DEE03"; 61 | UIApplicationLaunchOptionsUserActivityKey = ""; 62 | UIApplicationLaunchOptionsUserActivityTypeKey = NSUserActivityTypeBrowsingWeb; 63 | } 64 | 11. applicationSupportedInterfaceOrientationsFor: Inactive 65 | 12. applicationSupportedInterfaceOrientationsFor: Inactive 66 | 13. applicationSupportedInterfaceOrientationsFor: Inactive 67 | 14. applicationWillContinueUserActivityWithType: Inactive 68 | 15. applicationContinueUserActivityRestorationHandler: Inactive 69 | 16. applicationDidBecomeActive: Active 70 | 71 | ## Universal Link - from *Backgrounded* 72 | 1. applicationWillEnterForeground: Background 73 | 2. applicationWillContinueUserActivityWithType: Inactive 74 | 3. applicationContinueUserActivityRestorationHandler: Inactive 75 | 4. applicationDidBecomeActive: Active 76 | 77 | ## Deep Link - from *Not Loaded* 78 | 1. applicationWillChangeStatusBarFrame: Inactive 79 | 2. applicationDidChangeStatusBarFrame: Inactive 80 | 3. applicationSupportedInterfaceOrientationsFor: Inactive 81 | 4. applicationSupportedInterfaceOrientationsFor: Inactive 82 | 5. applicationSupportedInterfaceOrientationsFor: Inactive 83 | 6. applicationSupportedInterfaceOrientationsFor: Inactive 84 | 7. applicationWillFinishLaunchingWithOptions: Inactive - LaunchOptions: { 85 | UIApplicationLaunchOptionsURLKey: appLaunchSeq://whatup 86 | } 87 | 8. applicationDidFinishLaunchingWithOptions: Inactive - LaunchOptions: { 88 | UIApplicationLaunchOptionsURLKey: appLaunchSeq://whatup 89 | } 90 | 9. applicationSupportedInterfaceOrientationsFor: Inactive 91 | 10. applicationSupportedInterfaceOrientationsFor: Inactive 92 | 11. applicationSupportedInterfaceOrientationsFor: Inactive 93 | 12. applicationOpenURL: Inactive URL:appLaunchSeq://whatup 94 | 13. applicationDidBecomeActive: Active 95 | 96 | ## Deep Link - from *Backgrounded* 97 | 1. applicationWillEnterForeground: Background 98 | 2. applicationOpenURL: Inactive URL:appLaunchSeq://whatup 99 | 3. applicationDidBecomeActive: Active 100 | 101 | ## Push Notification - from *Not Loaded* 102 | 1. applicationWillChangeStatusBarFrame: Inactive 103 | 2. applicationDidChangeStatusBarFrame: Inactive 104 | 3. applicationSupportedInterfaceOrientationsFor: Inactive 105 | 4. applicationSupportedInterfaceOrientationsFor: Inactive 106 | 5. applicationSupportedInterfaceOrientationsFor: Inactive 107 | 6. applicationSupportedInterfaceOrientationsFor: Inactive 108 | 7. applicationWillFinishLaunchingWithOptions: Inactive - LaunchOptions: [__C.UIApplicationLaunchOptionsKey(_rawValue: UIApplicationLaunchOptionsRemoteNotificationKey): { 109 | aps = { 110 | alert = "Hi Sean!"; 111 | badge = 1; 112 | sound = default; 113 | }; 114 | }] 115 | 8. applicationShouldRestoreApplicationState: Inactive 116 | 9. applicationDidDecodeRestorableStateWith: Inactive 117 | 10. applicationDidFinishLaunchingWithOptions: Inactive - LaunchOptions: [__C.UIApplicationLaunchOptionsKey(_rawValue: UIApplicationLaunchOptionsRemoteNotificationKey): {\ 118 | aps = { 119 | alert = "Hi Sean!"; 120 | badge = 1; 121 | sound = default; 122 | }; 123 | }] 124 | 11. applicationSupportedInterfaceOrientationsFor: Inactive 125 | 12. applicationSupportedInterfaceOrientationsFor: Inactive 126 | 13. applicationSupportedInterfaceOrientationsFor: Inactive 127 | 14. applicationDidReceiveRemoteNotification: Inactive 128 | 15. applicationDidBecomeActive: Active 129 | 130 | ## Push Notification - from *Backgrounded* 131 | 1. applicationWillEnterForeground: Background 132 | 2. applicationDidReceiveRemoteNotification: Inactive 133 | 3. applicationDidBecomeActive: Active 134 | 135 | ## System Alert Displayed 136 | (e.g. when asking for notification privileges) 137 | 1. applicationWillResignActive: Active 138 | 2. applicationDidBecomeActive: Active 139 | 140 | ## Background Fetch - from *Not Loaded* 141 | 1. applicationWillChangeStatusBarFrame: Background 142 | 2. applicationDidChangeStatusBarFrame: Background 143 | 3. applicationSupportedInterfaceOrientationsFor: Background 144 | 4. applicationSupportedInterfaceOrientationsFor: Background 145 | 5. applicationSupportedInterfaceOrientationsFor: Background 146 | 6. applicationSupportedInterfaceOrientationsFor: Background 147 | 7. applicationWillFinishLaunchingWithOptions: Background - LaunchOptions: nil 148 | 8. applicationDidFinishLaunchingWithOptions: Background - LaunchOptions: nil 149 | 9. applicationSupportedInterfaceOrientationsFor: Background 150 | 10. applicationSupportedInterfaceOrientationsFor: Background 151 | 11. applicationSupportedInterfaceOrientationsFor: Background 152 | 12. applicationPerformFetchWithCompletionHandler: Background 153 | 154 | 155 | -------------------------------------------------------------------------------- /apple-app-site-association: -------------------------------------------------------------------------------- 1 | { 2 | "applinks": { 3 | "apps": [], 4 | "details": [ 5 | { 6 | "appID": "VHK5T9DC9A.com.regularberry.AppLaunchSequence", 7 | "paths": ["*"] 8 | } 9 | ] 10 | } 11 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | hi -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------