├── WJLocalNetWorkManager.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── coderjun.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── WJLocalNetWorkManager ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── SceneDelegate.h ├── SceneDelegate.m ├── ViewController.h ├── ViewController.m ├── WJLocalNetWorkManager.h ├── WJLocalNetWorkManager.m └── main.m ├── WJLocalNetWorkManagerTests └── WJLocalNetWorkManagerTests.m └── WJLocalNetWorkManagerUITests ├── WJLocalNetWorkManagerUITests.m └── WJLocalNetWorkManagerUITestsLaunchTests.m /WJLocalNetWorkManager.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 55; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A3BA6E10278BF09700DD59BD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E0F278BF09700DD59BD /* AppDelegate.m */; }; 11 | A3BA6E13278BF09700DD59BD /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E12278BF09700DD59BD /* SceneDelegate.m */; }; 12 | A3BA6E16278BF09700DD59BD /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E15278BF09700DD59BD /* ViewController.m */; }; 13 | A3BA6E19278BF09700DD59BD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A3BA6E17278BF09700DD59BD /* Main.storyboard */; }; 14 | A3BA6E1B278BF09800DD59BD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A3BA6E1A278BF09800DD59BD /* Assets.xcassets */; }; 15 | A3BA6E1E278BF09800DD59BD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A3BA6E1C278BF09800DD59BD /* LaunchScreen.storyboard */; }; 16 | A3BA6E21278BF09800DD59BD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E20278BF09800DD59BD /* main.m */; }; 17 | A3BA6E2B278BF09800DD59BD /* WJLocalNetWorkManagerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E2A278BF09800DD59BD /* WJLocalNetWorkManagerTests.m */; }; 18 | A3BA6E35278BF09800DD59BD /* WJLocalNetWorkManagerUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E34278BF09800DD59BD /* WJLocalNetWorkManagerUITests.m */; }; 19 | A3BA6E37278BF09800DD59BD /* WJLocalNetWorkManagerUITestsLaunchTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E36278BF09800DD59BD /* WJLocalNetWorkManagerUITestsLaunchTests.m */; }; 20 | A3BA6E45278BF0AC00DD59BD /* WJLocalNetWorkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BA6E44278BF0AC00DD59BD /* WJLocalNetWorkManager.m */; }; 21 | A3BA6E48278BF0C200DD59BD /* Network.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3BA6E47278BF0C200DD59BD /* Network.framework */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | A3BA6E27278BF09800DD59BD /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = A3BA6E03278BF09700DD59BD /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = A3BA6E0A278BF09700DD59BD; 30 | remoteInfo = WJLocalNetWorkManager; 31 | }; 32 | A3BA6E31278BF09800DD59BD /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = A3BA6E03278BF09700DD59BD /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = A3BA6E0A278BF09700DD59BD; 37 | remoteInfo = WJLocalNetWorkManager; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | A3BA6E0B278BF09700DD59BD /* WJLocalNetWorkManager.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WJLocalNetWorkManager.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | A3BA6E0E278BF09700DD59BD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 44 | A3BA6E0F278BF09700DD59BD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 45 | A3BA6E11278BF09700DD59BD /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = ""; }; 46 | A3BA6E12278BF09700DD59BD /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = ""; }; 47 | A3BA6E14278BF09700DD59BD /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 48 | A3BA6E15278BF09700DD59BD /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 49 | A3BA6E18278BF09700DD59BD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 50 | A3BA6E1A278BF09800DD59BD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 51 | A3BA6E1D278BF09800DD59BD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 52 | A3BA6E1F278BF09800DD59BD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | A3BA6E20278BF09800DD59BD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 54 | A3BA6E26278BF09800DD59BD /* WJLocalNetWorkManagerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WJLocalNetWorkManagerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | A3BA6E2A278BF09800DD59BD /* WJLocalNetWorkManagerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WJLocalNetWorkManagerTests.m; sourceTree = ""; }; 56 | A3BA6E30278BF09800DD59BD /* WJLocalNetWorkManagerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WJLocalNetWorkManagerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | A3BA6E34278BF09800DD59BD /* WJLocalNetWorkManagerUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WJLocalNetWorkManagerUITests.m; sourceTree = ""; }; 58 | A3BA6E36278BF09800DD59BD /* WJLocalNetWorkManagerUITestsLaunchTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WJLocalNetWorkManagerUITestsLaunchTests.m; sourceTree = ""; }; 59 | A3BA6E43278BF0AC00DD59BD /* WJLocalNetWorkManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WJLocalNetWorkManager.h; sourceTree = ""; }; 60 | A3BA6E44278BF0AC00DD59BD /* WJLocalNetWorkManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WJLocalNetWorkManager.m; sourceTree = ""; }; 61 | A3BA6E47278BF0C200DD59BD /* Network.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Network.framework; path = System/Library/Frameworks/Network.framework; sourceTree = SDKROOT; }; 62 | /* End PBXFileReference section */ 63 | 64 | /* Begin PBXFrameworksBuildPhase section */ 65 | A3BA6E08278BF09700DD59BD /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | A3BA6E48278BF0C200DD59BD /* Network.framework in Frameworks */, 70 | ); 71 | runOnlyForDeploymentPostprocessing = 0; 72 | }; 73 | A3BA6E23278BF09800DD59BD /* Frameworks */ = { 74 | isa = PBXFrameworksBuildPhase; 75 | buildActionMask = 2147483647; 76 | files = ( 77 | ); 78 | runOnlyForDeploymentPostprocessing = 0; 79 | }; 80 | A3BA6E2D278BF09800DD59BD /* Frameworks */ = { 81 | isa = PBXFrameworksBuildPhase; 82 | buildActionMask = 2147483647; 83 | files = ( 84 | ); 85 | runOnlyForDeploymentPostprocessing = 0; 86 | }; 87 | /* End PBXFrameworksBuildPhase section */ 88 | 89 | /* Begin PBXGroup section */ 90 | A3BA6E02278BF09700DD59BD = { 91 | isa = PBXGroup; 92 | children = ( 93 | A3BA6E0D278BF09700DD59BD /* WJLocalNetWorkManager */, 94 | A3BA6E29278BF09800DD59BD /* WJLocalNetWorkManagerTests */, 95 | A3BA6E33278BF09800DD59BD /* WJLocalNetWorkManagerUITests */, 96 | A3BA6E0C278BF09700DD59BD /* Products */, 97 | A3BA6E46278BF0C200DD59BD /* Frameworks */, 98 | ); 99 | sourceTree = ""; 100 | }; 101 | A3BA6E0C278BF09700DD59BD /* Products */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | A3BA6E0B278BF09700DD59BD /* WJLocalNetWorkManager.app */, 105 | A3BA6E26278BF09800DD59BD /* WJLocalNetWorkManagerTests.xctest */, 106 | A3BA6E30278BF09800DD59BD /* WJLocalNetWorkManagerUITests.xctest */, 107 | ); 108 | name = Products; 109 | sourceTree = ""; 110 | }; 111 | A3BA6E0D278BF09700DD59BD /* WJLocalNetWorkManager */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | A3BA6E43278BF0AC00DD59BD /* WJLocalNetWorkManager.h */, 115 | A3BA6E44278BF0AC00DD59BD /* WJLocalNetWorkManager.m */, 116 | A3BA6E0E278BF09700DD59BD /* AppDelegate.h */, 117 | A3BA6E0F278BF09700DD59BD /* AppDelegate.m */, 118 | A3BA6E11278BF09700DD59BD /* SceneDelegate.h */, 119 | A3BA6E12278BF09700DD59BD /* SceneDelegate.m */, 120 | A3BA6E14278BF09700DD59BD /* ViewController.h */, 121 | A3BA6E15278BF09700DD59BD /* ViewController.m */, 122 | A3BA6E17278BF09700DD59BD /* Main.storyboard */, 123 | A3BA6E1A278BF09800DD59BD /* Assets.xcassets */, 124 | A3BA6E1C278BF09800DD59BD /* LaunchScreen.storyboard */, 125 | A3BA6E1F278BF09800DD59BD /* Info.plist */, 126 | A3BA6E20278BF09800DD59BD /* main.m */, 127 | ); 128 | path = WJLocalNetWorkManager; 129 | sourceTree = ""; 130 | }; 131 | A3BA6E29278BF09800DD59BD /* WJLocalNetWorkManagerTests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | A3BA6E2A278BF09800DD59BD /* WJLocalNetWorkManagerTests.m */, 135 | ); 136 | path = WJLocalNetWorkManagerTests; 137 | sourceTree = ""; 138 | }; 139 | A3BA6E33278BF09800DD59BD /* WJLocalNetWorkManagerUITests */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | A3BA6E34278BF09800DD59BD /* WJLocalNetWorkManagerUITests.m */, 143 | A3BA6E36278BF09800DD59BD /* WJLocalNetWorkManagerUITestsLaunchTests.m */, 144 | ); 145 | path = WJLocalNetWorkManagerUITests; 146 | sourceTree = ""; 147 | }; 148 | A3BA6E46278BF0C200DD59BD /* Frameworks */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | A3BA6E47278BF0C200DD59BD /* Network.framework */, 152 | ); 153 | name = Frameworks; 154 | sourceTree = ""; 155 | }; 156 | /* End PBXGroup section */ 157 | 158 | /* Begin PBXNativeTarget section */ 159 | A3BA6E0A278BF09700DD59BD /* WJLocalNetWorkManager */ = { 160 | isa = PBXNativeTarget; 161 | buildConfigurationList = A3BA6E3A278BF09800DD59BD /* Build configuration list for PBXNativeTarget "WJLocalNetWorkManager" */; 162 | buildPhases = ( 163 | A3BA6E07278BF09700DD59BD /* Sources */, 164 | A3BA6E08278BF09700DD59BD /* Frameworks */, 165 | A3BA6E09278BF09700DD59BD /* Resources */, 166 | ); 167 | buildRules = ( 168 | ); 169 | dependencies = ( 170 | ); 171 | name = WJLocalNetWorkManager; 172 | productName = WJLocalNetWorkManager; 173 | productReference = A3BA6E0B278BF09700DD59BD /* WJLocalNetWorkManager.app */; 174 | productType = "com.apple.product-type.application"; 175 | }; 176 | A3BA6E25278BF09800DD59BD /* WJLocalNetWorkManagerTests */ = { 177 | isa = PBXNativeTarget; 178 | buildConfigurationList = A3BA6E3D278BF09800DD59BD /* Build configuration list for PBXNativeTarget "WJLocalNetWorkManagerTests" */; 179 | buildPhases = ( 180 | A3BA6E22278BF09800DD59BD /* Sources */, 181 | A3BA6E23278BF09800DD59BD /* Frameworks */, 182 | A3BA6E24278BF09800DD59BD /* Resources */, 183 | ); 184 | buildRules = ( 185 | ); 186 | dependencies = ( 187 | A3BA6E28278BF09800DD59BD /* PBXTargetDependency */, 188 | ); 189 | name = WJLocalNetWorkManagerTests; 190 | productName = WJLocalNetWorkManagerTests; 191 | productReference = A3BA6E26278BF09800DD59BD /* WJLocalNetWorkManagerTests.xctest */; 192 | productType = "com.apple.product-type.bundle.unit-test"; 193 | }; 194 | A3BA6E2F278BF09800DD59BD /* WJLocalNetWorkManagerUITests */ = { 195 | isa = PBXNativeTarget; 196 | buildConfigurationList = A3BA6E40278BF09800DD59BD /* Build configuration list for PBXNativeTarget "WJLocalNetWorkManagerUITests" */; 197 | buildPhases = ( 198 | A3BA6E2C278BF09800DD59BD /* Sources */, 199 | A3BA6E2D278BF09800DD59BD /* Frameworks */, 200 | A3BA6E2E278BF09800DD59BD /* Resources */, 201 | ); 202 | buildRules = ( 203 | ); 204 | dependencies = ( 205 | A3BA6E32278BF09800DD59BD /* PBXTargetDependency */, 206 | ); 207 | name = WJLocalNetWorkManagerUITests; 208 | productName = WJLocalNetWorkManagerUITests; 209 | productReference = A3BA6E30278BF09800DD59BD /* WJLocalNetWorkManagerUITests.xctest */; 210 | productType = "com.apple.product-type.bundle.ui-testing"; 211 | }; 212 | /* End PBXNativeTarget section */ 213 | 214 | /* Begin PBXProject section */ 215 | A3BA6E03278BF09700DD59BD /* Project object */ = { 216 | isa = PBXProject; 217 | attributes = { 218 | BuildIndependentTargetsInParallel = 1; 219 | LastUpgradeCheck = 1320; 220 | TargetAttributes = { 221 | A3BA6E0A278BF09700DD59BD = { 222 | CreatedOnToolsVersion = 13.2.1; 223 | }; 224 | A3BA6E25278BF09800DD59BD = { 225 | CreatedOnToolsVersion = 13.2.1; 226 | TestTargetID = A3BA6E0A278BF09700DD59BD; 227 | }; 228 | A3BA6E2F278BF09800DD59BD = { 229 | CreatedOnToolsVersion = 13.2.1; 230 | TestTargetID = A3BA6E0A278BF09700DD59BD; 231 | }; 232 | }; 233 | }; 234 | buildConfigurationList = A3BA6E06278BF09700DD59BD /* Build configuration list for PBXProject "WJLocalNetWorkManager" */; 235 | compatibilityVersion = "Xcode 13.0"; 236 | developmentRegion = en; 237 | hasScannedForEncodings = 0; 238 | knownRegions = ( 239 | en, 240 | Base, 241 | ); 242 | mainGroup = A3BA6E02278BF09700DD59BD; 243 | productRefGroup = A3BA6E0C278BF09700DD59BD /* Products */; 244 | projectDirPath = ""; 245 | projectRoot = ""; 246 | targets = ( 247 | A3BA6E0A278BF09700DD59BD /* WJLocalNetWorkManager */, 248 | A3BA6E25278BF09800DD59BD /* WJLocalNetWorkManagerTests */, 249 | A3BA6E2F278BF09800DD59BD /* WJLocalNetWorkManagerUITests */, 250 | ); 251 | }; 252 | /* End PBXProject section */ 253 | 254 | /* Begin PBXResourcesBuildPhase section */ 255 | A3BA6E09278BF09700DD59BD /* Resources */ = { 256 | isa = PBXResourcesBuildPhase; 257 | buildActionMask = 2147483647; 258 | files = ( 259 | A3BA6E1E278BF09800DD59BD /* LaunchScreen.storyboard in Resources */, 260 | A3BA6E1B278BF09800DD59BD /* Assets.xcassets in Resources */, 261 | A3BA6E19278BF09700DD59BD /* Main.storyboard in Resources */, 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | A3BA6E24278BF09800DD59BD /* Resources */ = { 266 | isa = PBXResourcesBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | }; 272 | A3BA6E2E278BF09800DD59BD /* Resources */ = { 273 | isa = PBXResourcesBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | /* End PBXResourcesBuildPhase section */ 280 | 281 | /* Begin PBXSourcesBuildPhase section */ 282 | A3BA6E07278BF09700DD59BD /* Sources */ = { 283 | isa = PBXSourcesBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | A3BA6E16278BF09700DD59BD /* ViewController.m in Sources */, 287 | A3BA6E10278BF09700DD59BD /* AppDelegate.m in Sources */, 288 | A3BA6E45278BF0AC00DD59BD /* WJLocalNetWorkManager.m in Sources */, 289 | A3BA6E21278BF09800DD59BD /* main.m in Sources */, 290 | A3BA6E13278BF09700DD59BD /* SceneDelegate.m in Sources */, 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | A3BA6E22278BF09800DD59BD /* Sources */ = { 295 | isa = PBXSourcesBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | A3BA6E2B278BF09800DD59BD /* WJLocalNetWorkManagerTests.m in Sources */, 299 | ); 300 | runOnlyForDeploymentPostprocessing = 0; 301 | }; 302 | A3BA6E2C278BF09800DD59BD /* Sources */ = { 303 | isa = PBXSourcesBuildPhase; 304 | buildActionMask = 2147483647; 305 | files = ( 306 | A3BA6E37278BF09800DD59BD /* WJLocalNetWorkManagerUITestsLaunchTests.m in Sources */, 307 | A3BA6E35278BF09800DD59BD /* WJLocalNetWorkManagerUITests.m in Sources */, 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | }; 311 | /* End PBXSourcesBuildPhase section */ 312 | 313 | /* Begin PBXTargetDependency section */ 314 | A3BA6E28278BF09800DD59BD /* PBXTargetDependency */ = { 315 | isa = PBXTargetDependency; 316 | target = A3BA6E0A278BF09700DD59BD /* WJLocalNetWorkManager */; 317 | targetProxy = A3BA6E27278BF09800DD59BD /* PBXContainerItemProxy */; 318 | }; 319 | A3BA6E32278BF09800DD59BD /* PBXTargetDependency */ = { 320 | isa = PBXTargetDependency; 321 | target = A3BA6E0A278BF09700DD59BD /* WJLocalNetWorkManager */; 322 | targetProxy = A3BA6E31278BF09800DD59BD /* PBXContainerItemProxy */; 323 | }; 324 | /* End PBXTargetDependency section */ 325 | 326 | /* Begin PBXVariantGroup section */ 327 | A3BA6E17278BF09700DD59BD /* Main.storyboard */ = { 328 | isa = PBXVariantGroup; 329 | children = ( 330 | A3BA6E18278BF09700DD59BD /* Base */, 331 | ); 332 | name = Main.storyboard; 333 | sourceTree = ""; 334 | }; 335 | A3BA6E1C278BF09800DD59BD /* LaunchScreen.storyboard */ = { 336 | isa = PBXVariantGroup; 337 | children = ( 338 | A3BA6E1D278BF09800DD59BD /* Base */, 339 | ); 340 | name = LaunchScreen.storyboard; 341 | sourceTree = ""; 342 | }; 343 | /* End PBXVariantGroup section */ 344 | 345 | /* Begin XCBuildConfiguration section */ 346 | A3BA6E38278BF09800DD59BD /* Debug */ = { 347 | isa = XCBuildConfiguration; 348 | buildSettings = { 349 | ALWAYS_SEARCH_USER_PATHS = NO; 350 | CLANG_ANALYZER_NONNULL = YES; 351 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 352 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 353 | CLANG_CXX_LIBRARY = "libc++"; 354 | CLANG_ENABLE_MODULES = YES; 355 | CLANG_ENABLE_OBJC_ARC = YES; 356 | CLANG_ENABLE_OBJC_WEAK = YES; 357 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 358 | CLANG_WARN_BOOL_CONVERSION = YES; 359 | CLANG_WARN_COMMA = YES; 360 | CLANG_WARN_CONSTANT_CONVERSION = YES; 361 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 362 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 363 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 364 | CLANG_WARN_EMPTY_BODY = YES; 365 | CLANG_WARN_ENUM_CONVERSION = YES; 366 | CLANG_WARN_INFINITE_RECURSION = YES; 367 | CLANG_WARN_INT_CONVERSION = YES; 368 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 369 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 370 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 371 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 372 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 373 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 374 | CLANG_WARN_STRICT_PROTOTYPES = YES; 375 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 376 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 377 | CLANG_WARN_UNREACHABLE_CODE = YES; 378 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 379 | COPY_PHASE_STRIP = NO; 380 | DEBUG_INFORMATION_FORMAT = dwarf; 381 | ENABLE_STRICT_OBJC_MSGSEND = YES; 382 | ENABLE_TESTABILITY = YES; 383 | GCC_C_LANGUAGE_STANDARD = gnu11; 384 | GCC_DYNAMIC_NO_PIC = NO; 385 | GCC_NO_COMMON_BLOCKS = YES; 386 | GCC_OPTIMIZATION_LEVEL = 0; 387 | GCC_PREPROCESSOR_DEFINITIONS = ( 388 | "DEBUG=1", 389 | "$(inherited)", 390 | ); 391 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 392 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 393 | GCC_WARN_UNDECLARED_SELECTOR = YES; 394 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 395 | GCC_WARN_UNUSED_FUNCTION = YES; 396 | GCC_WARN_UNUSED_VARIABLE = YES; 397 | IPHONEOS_DEPLOYMENT_TARGET = 15.2; 398 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 399 | MTL_FAST_MATH = YES; 400 | ONLY_ACTIVE_ARCH = YES; 401 | SDKROOT = iphoneos; 402 | }; 403 | name = Debug; 404 | }; 405 | A3BA6E39278BF09800DD59BD /* Release */ = { 406 | isa = XCBuildConfiguration; 407 | buildSettings = { 408 | ALWAYS_SEARCH_USER_PATHS = NO; 409 | CLANG_ANALYZER_NONNULL = YES; 410 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 411 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 412 | CLANG_CXX_LIBRARY = "libc++"; 413 | CLANG_ENABLE_MODULES = YES; 414 | CLANG_ENABLE_OBJC_ARC = YES; 415 | CLANG_ENABLE_OBJC_WEAK = YES; 416 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 417 | CLANG_WARN_BOOL_CONVERSION = YES; 418 | CLANG_WARN_COMMA = YES; 419 | CLANG_WARN_CONSTANT_CONVERSION = YES; 420 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 421 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 422 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 423 | CLANG_WARN_EMPTY_BODY = YES; 424 | CLANG_WARN_ENUM_CONVERSION = YES; 425 | CLANG_WARN_INFINITE_RECURSION = YES; 426 | CLANG_WARN_INT_CONVERSION = YES; 427 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 428 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 429 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 430 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 431 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 432 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 433 | CLANG_WARN_STRICT_PROTOTYPES = YES; 434 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 435 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 436 | CLANG_WARN_UNREACHABLE_CODE = YES; 437 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 438 | COPY_PHASE_STRIP = NO; 439 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 440 | ENABLE_NS_ASSERTIONS = NO; 441 | ENABLE_STRICT_OBJC_MSGSEND = YES; 442 | GCC_C_LANGUAGE_STANDARD = gnu11; 443 | GCC_NO_COMMON_BLOCKS = YES; 444 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 445 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 446 | GCC_WARN_UNDECLARED_SELECTOR = YES; 447 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 448 | GCC_WARN_UNUSED_FUNCTION = YES; 449 | GCC_WARN_UNUSED_VARIABLE = YES; 450 | IPHONEOS_DEPLOYMENT_TARGET = 15.2; 451 | MTL_ENABLE_DEBUG_INFO = NO; 452 | MTL_FAST_MATH = YES; 453 | SDKROOT = iphoneos; 454 | VALIDATE_PRODUCT = YES; 455 | }; 456 | name = Release; 457 | }; 458 | A3BA6E3B278BF09800DD59BD /* Debug */ = { 459 | isa = XCBuildConfiguration; 460 | buildSettings = { 461 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 462 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 463 | CODE_SIGN_STYLE = Automatic; 464 | CURRENT_PROJECT_VERSION = 1; 465 | DEVELOPMENT_TEAM = 292V2CN6SF; 466 | GENERATE_INFOPLIST_FILE = YES; 467 | INFOPLIST_FILE = WJLocalNetWorkManager/Info.plist; 468 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 469 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 470 | INFOPLIST_KEY_UIMainStoryboardFile = Main; 471 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 472 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 473 | LD_RUNPATH_SEARCH_PATHS = ( 474 | "$(inherited)", 475 | "@executable_path/Frameworks", 476 | ); 477 | MARKETING_VERSION = 1.0; 478 | PRODUCT_BUNDLE_IDENTIFIER = com.aomei.WJLocalNetWorkManager; 479 | PRODUCT_NAME = "$(TARGET_NAME)"; 480 | SWIFT_EMIT_LOC_STRINGS = YES; 481 | TARGETED_DEVICE_FAMILY = 1; 482 | }; 483 | name = Debug; 484 | }; 485 | A3BA6E3C278BF09800DD59BD /* Release */ = { 486 | isa = XCBuildConfiguration; 487 | buildSettings = { 488 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 489 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 490 | CODE_SIGN_STYLE = Automatic; 491 | CURRENT_PROJECT_VERSION = 1; 492 | DEVELOPMENT_TEAM = 292V2CN6SF; 493 | GENERATE_INFOPLIST_FILE = YES; 494 | INFOPLIST_FILE = WJLocalNetWorkManager/Info.plist; 495 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 496 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 497 | INFOPLIST_KEY_UIMainStoryboardFile = Main; 498 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 499 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 500 | LD_RUNPATH_SEARCH_PATHS = ( 501 | "$(inherited)", 502 | "@executable_path/Frameworks", 503 | ); 504 | MARKETING_VERSION = 1.0; 505 | PRODUCT_BUNDLE_IDENTIFIER = com.aomei.WJLocalNetWorkManager; 506 | PRODUCT_NAME = "$(TARGET_NAME)"; 507 | SWIFT_EMIT_LOC_STRINGS = YES; 508 | TARGETED_DEVICE_FAMILY = 1; 509 | }; 510 | name = Release; 511 | }; 512 | A3BA6E3E278BF09800DD59BD /* Debug */ = { 513 | isa = XCBuildConfiguration; 514 | buildSettings = { 515 | BUNDLE_LOADER = "$(TEST_HOST)"; 516 | CODE_SIGN_STYLE = Automatic; 517 | CURRENT_PROJECT_VERSION = 1; 518 | DEVELOPMENT_TEAM = 292V2CN6SF; 519 | GENERATE_INFOPLIST_FILE = YES; 520 | IPHONEOS_DEPLOYMENT_TARGET = 15.2; 521 | MARKETING_VERSION = 1.0; 522 | PRODUCT_BUNDLE_IDENTIFIER = com.aomei.WJLocalNetWorkManagerTests; 523 | PRODUCT_NAME = "$(TARGET_NAME)"; 524 | SWIFT_EMIT_LOC_STRINGS = NO; 525 | TARGETED_DEVICE_FAMILY = "1,2"; 526 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WJLocalNetWorkManager.app/WJLocalNetWorkManager"; 527 | }; 528 | name = Debug; 529 | }; 530 | A3BA6E3F278BF09800DD59BD /* Release */ = { 531 | isa = XCBuildConfiguration; 532 | buildSettings = { 533 | BUNDLE_LOADER = "$(TEST_HOST)"; 534 | CODE_SIGN_STYLE = Automatic; 535 | CURRENT_PROJECT_VERSION = 1; 536 | DEVELOPMENT_TEAM = 292V2CN6SF; 537 | GENERATE_INFOPLIST_FILE = YES; 538 | IPHONEOS_DEPLOYMENT_TARGET = 15.2; 539 | MARKETING_VERSION = 1.0; 540 | PRODUCT_BUNDLE_IDENTIFIER = com.aomei.WJLocalNetWorkManagerTests; 541 | PRODUCT_NAME = "$(TARGET_NAME)"; 542 | SWIFT_EMIT_LOC_STRINGS = NO; 543 | TARGETED_DEVICE_FAMILY = "1,2"; 544 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WJLocalNetWorkManager.app/WJLocalNetWorkManager"; 545 | }; 546 | name = Release; 547 | }; 548 | A3BA6E41278BF09800DD59BD /* Debug */ = { 549 | isa = XCBuildConfiguration; 550 | buildSettings = { 551 | CODE_SIGN_STYLE = Automatic; 552 | CURRENT_PROJECT_VERSION = 1; 553 | DEVELOPMENT_TEAM = 292V2CN6SF; 554 | GENERATE_INFOPLIST_FILE = YES; 555 | MARKETING_VERSION = 1.0; 556 | PRODUCT_BUNDLE_IDENTIFIER = com.aomei.WJLocalNetWorkManagerUITests; 557 | PRODUCT_NAME = "$(TARGET_NAME)"; 558 | SWIFT_EMIT_LOC_STRINGS = NO; 559 | TARGETED_DEVICE_FAMILY = "1,2"; 560 | TEST_TARGET_NAME = WJLocalNetWorkManager; 561 | }; 562 | name = Debug; 563 | }; 564 | A3BA6E42278BF09800DD59BD /* Release */ = { 565 | isa = XCBuildConfiguration; 566 | buildSettings = { 567 | CODE_SIGN_STYLE = Automatic; 568 | CURRENT_PROJECT_VERSION = 1; 569 | DEVELOPMENT_TEAM = 292V2CN6SF; 570 | GENERATE_INFOPLIST_FILE = YES; 571 | MARKETING_VERSION = 1.0; 572 | PRODUCT_BUNDLE_IDENTIFIER = com.aomei.WJLocalNetWorkManagerUITests; 573 | PRODUCT_NAME = "$(TARGET_NAME)"; 574 | SWIFT_EMIT_LOC_STRINGS = NO; 575 | TARGETED_DEVICE_FAMILY = "1,2"; 576 | TEST_TARGET_NAME = WJLocalNetWorkManager; 577 | }; 578 | name = Release; 579 | }; 580 | /* End XCBuildConfiguration section */ 581 | 582 | /* Begin XCConfigurationList section */ 583 | A3BA6E06278BF09700DD59BD /* Build configuration list for PBXProject "WJLocalNetWorkManager" */ = { 584 | isa = XCConfigurationList; 585 | buildConfigurations = ( 586 | A3BA6E38278BF09800DD59BD /* Debug */, 587 | A3BA6E39278BF09800DD59BD /* Release */, 588 | ); 589 | defaultConfigurationIsVisible = 0; 590 | defaultConfigurationName = Release; 591 | }; 592 | A3BA6E3A278BF09800DD59BD /* Build configuration list for PBXNativeTarget "WJLocalNetWorkManager" */ = { 593 | isa = XCConfigurationList; 594 | buildConfigurations = ( 595 | A3BA6E3B278BF09800DD59BD /* Debug */, 596 | A3BA6E3C278BF09800DD59BD /* Release */, 597 | ); 598 | defaultConfigurationIsVisible = 0; 599 | defaultConfigurationName = Release; 600 | }; 601 | A3BA6E3D278BF09800DD59BD /* Build configuration list for PBXNativeTarget "WJLocalNetWorkManagerTests" */ = { 602 | isa = XCConfigurationList; 603 | buildConfigurations = ( 604 | A3BA6E3E278BF09800DD59BD /* Debug */, 605 | A3BA6E3F278BF09800DD59BD /* Release */, 606 | ); 607 | defaultConfigurationIsVisible = 0; 608 | defaultConfigurationName = Release; 609 | }; 610 | A3BA6E40278BF09800DD59BD /* Build configuration list for PBXNativeTarget "WJLocalNetWorkManagerUITests" */ = { 611 | isa = XCConfigurationList; 612 | buildConfigurations = ( 613 | A3BA6E41278BF09800DD59BD /* Debug */, 614 | A3BA6E42278BF09800DD59BD /* Release */, 615 | ); 616 | defaultConfigurationIsVisible = 0; 617 | defaultConfigurationName = Release; 618 | }; 619 | /* End XCConfigurationList section */ 620 | }; 621 | rootObject = A3BA6E03278BF09700DD59BD /* Project object */; 622 | } 623 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager.xcodeproj/xcuserdata/coderjun.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | WJLocalNetWorkManager.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | 10 | @interface AppDelegate : UIResponder 11 | 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import "AppDelegate.h" 9 | 10 | @interface AppDelegate () 11 | 12 | @end 13 | 14 | @implementation AppDelegate 15 | 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 18 | // Override point for customization after application launch. 19 | return YES; 20 | } 21 | 22 | 23 | #pragma mark - UISceneSession lifecycle 24 | 25 | 26 | - (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options { 27 | // Called when a new scene session is being created. 28 | // Use this method to select a configuration to create the new scene with. 29 | return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role]; 30 | } 31 | 32 | 33 | - (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions { 34 | // Called when the user discards a scene session. 35 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 36 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 37 | } 38 | 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/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 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/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 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/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 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/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 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSBonjourServices 6 | 7 | _test._tcp 8 | 9 | CFBundleIdentifier 10 | 11 | UIApplicationSceneManifest 12 | 13 | UIApplicationSupportsMultipleScenes 14 | 15 | UISceneConfigurations 16 | 17 | UIWindowSceneSessionRoleApplication 18 | 19 | 20 | UISceneConfigurationName 21 | Default Configuration 22 | UISceneDelegateClassName 23 | SceneDelegate 24 | UISceneStoryboardFile 25 | Main 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/SceneDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.h 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | 10 | @interface SceneDelegate : UIResponder 11 | 12 | @property (strong, nonatomic) UIWindow * window; 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/SceneDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.m 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import "SceneDelegate.h" 9 | 10 | @interface SceneDelegate () 11 | 12 | @end 13 | 14 | @implementation SceneDelegate 15 | 16 | 17 | - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions { 18 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 21 | } 22 | 23 | 24 | - (void)sceneDidDisconnect:(UIScene *)scene { 25 | // Called as the scene is being released by the system. 26 | // This occurs shortly after the scene enters the background, or when its session is discarded. 27 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 28 | // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). 29 | } 30 | 31 | 32 | - (void)sceneDidBecomeActive:(UIScene *)scene { 33 | // Called when the scene has moved from an inactive state to an active state. 34 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 35 | } 36 | 37 | 38 | - (void)sceneWillResignActive:(UIScene *)scene { 39 | // Called when the scene will move from an active state to an inactive state. 40 | // This may occur due to temporary interruptions (ex. an incoming phone call). 41 | } 42 | 43 | 44 | - (void)sceneWillEnterForeground:(UIScene *)scene { 45 | // Called as the scene transitions from the background to the foreground. 46 | // Use this method to undo the changes made on entering the background. 47 | } 48 | 49 | 50 | - (void)sceneDidEnterBackground:(UIScene *)scene { 51 | // Called as the scene transitions from the foreground to the background. 52 | // Use this method to save data, release shared resources, and store enough scene-specific state information 53 | // to restore the scene back to its current state. 54 | } 55 | 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | 10 | @interface ViewController : UIViewController 11 | 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import "ViewController.h" 9 | 10 | @interface ViewController () 11 | 12 | @end 13 | 14 | @implementation ViewController 15 | 16 | - (void)viewDidLoad { 17 | [super viewDidLoad]; 18 | // Do any additional setup after loading the view. 19 | } 20 | 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/WJLocalNetWorkManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // WJLocalNetWorkManager.h 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface WJLocalNetWorkManager : NSObject 13 | + (void) requestLocalNetworkAuthorization:(void(^)(BOOL isAuth)) complete; 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/WJLocalNetWorkManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // WJLocalNetWorkManager.m 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import "WJLocalNetWorkManager.h" 9 | #import 10 | #define BonjourName @"your bonjourName" 11 | static void(^result)(BOOL isAuth); 12 | 13 | @implementation WJLocalNetWorkManager 14 | #pragma mark 判断本地网络服务是否授权 15 | + (void) requestLocalNetworkAuthorization:(void(^)(BOOL isAuth)) complete { 16 | result = complete; 17 | if(@available(iOS 14, *)) { 18 | //IOS14需要进行本地网络授权 19 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 20 | const char* serviceName = BonjourName.UTF8String; 21 | DNSServiceRef serviceRef = nil; 22 | DNSServiceBrowse( &serviceRef, 0, 0, serviceName, nil, browseReply, nil); 23 | DNSServiceProcessResult(serviceRef); 24 | DNSServiceRefDeallocate(serviceRef); 25 | 26 | }); 27 | } 28 | else { 29 | //IOS14以下默认返回yes,因为IOS14以下设备默认开启本地网络权限 30 | complete(YES); 31 | } 32 | } 33 | 34 | ///函数回调授权结果 35 | static void browseReply( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context ) 36 | { 37 | //主线程返回获取结果 38 | dispatch_async(dispatch_get_main_queue(), ^{ 39 | if (result) { 40 | if (errorCode == kDNSServiceErr_PolicyDenied) { 41 | result(NO); 42 | } 43 | else { 44 | result(YES); 45 | } 46 | } 47 | }); 48 | 49 | 50 | } 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /WJLocalNetWorkManager/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // WJLocalNetWorkManager 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | #import "AppDelegate.h" 10 | 11 | int main(int argc, char * argv[]) { 12 | NSString * appDelegateClassName; 13 | @autoreleasepool { 14 | // Setup code that might create autoreleased objects goes here. 15 | appDelegateClassName = NSStringFromClass([AppDelegate class]); 16 | } 17 | return UIApplicationMain(argc, argv, nil, appDelegateClassName); 18 | } 19 | -------------------------------------------------------------------------------- /WJLocalNetWorkManagerTests/WJLocalNetWorkManagerTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // WJLocalNetWorkManagerTests.m 3 | // WJLocalNetWorkManagerTests 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | 10 | @interface WJLocalNetWorkManagerTests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation WJLocalNetWorkManagerTests 15 | 16 | - (void)setUp { 17 | // Put setup code here. This method is called before the invocation of each test method in the class. 18 | } 19 | 20 | - (void)tearDown { 21 | // Put teardown code here. This method is called after the invocation of each test method in the class. 22 | } 23 | 24 | - (void)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 | - (void)testPerformanceExample { 30 | // This is an example of a performance test case. 31 | [self measureBlock:^{ 32 | // Put the code you want to measure the time of here. 33 | }]; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /WJLocalNetWorkManagerUITests/WJLocalNetWorkManagerUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // WJLocalNetWorkManagerUITests.m 3 | // WJLocalNetWorkManagerUITests 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | 10 | @interface WJLocalNetWorkManagerUITests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation WJLocalNetWorkManagerUITests 15 | 16 | - (void)setUp { 17 | // Put setup code here. This method is called before the invocation of each test method in the class. 18 | 19 | // In UI tests it is usually best to stop immediately when a failure occurs. 20 | self.continueAfterFailure = NO; 21 | 22 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 23 | } 24 | 25 | - (void)tearDown { 26 | // Put teardown code here. This method is called after the invocation of each test method in the class. 27 | } 28 | 29 | - (void)testExample { 30 | // UI tests must launch the application that they test. 31 | XCUIApplication *app = [[XCUIApplication alloc] init]; 32 | [app launch]; 33 | 34 | // Use recording to get started writing UI tests. 35 | // Use XCTAssert and related functions to verify your tests produce the correct results. 36 | } 37 | 38 | - (void)testLaunchPerformance { 39 | if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *)) { 40 | // This measures how long it takes to launch your application. 41 | [self measureWithMetrics:@[[[XCTApplicationLaunchMetric alloc] init]] block:^{ 42 | [[[XCUIApplication alloc] init] launch]; 43 | }]; 44 | } 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /WJLocalNetWorkManagerUITests/WJLocalNetWorkManagerUITestsLaunchTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // WJLocalNetWorkManagerUITestsLaunchTests.m 3 | // WJLocalNetWorkManagerUITests 4 | // 5 | // Created by coderjun on 2022/1/10. 6 | // 7 | 8 | #import 9 | 10 | @interface WJLocalNetWorkManagerUITestsLaunchTests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation WJLocalNetWorkManagerUITestsLaunchTests 15 | 16 | + (BOOL)runsForEachTargetApplicationUIConfiguration { 17 | return YES; 18 | } 19 | 20 | - (void)setUp { 21 | self.continueAfterFailure = NO; 22 | } 23 | 24 | - (void)testLaunch { 25 | XCUIApplication *app = [[XCUIApplication alloc] init]; 26 | [app launch]; 27 | 28 | // Insert steps here to perform after app launch but before taking a screenshot, 29 | // such as logging into a test account or navigating somewhere in the app 30 | 31 | XCTAttachment *attachment = [XCTAttachment attachmentWithScreenshot:XCUIScreen.mainScreen.screenshot]; 32 | attachment.name = @"Launch Screen"; 33 | attachment.lifetime = XCTAttachmentLifetimeKeepAlways; 34 | [self addAttachment:attachment]; 35 | } 36 | 37 | @end 38 | --------------------------------------------------------------------------------