20 Commits
3.5.4 ... 3.5.5

Author SHA1 Message Date
cf13851d19 Release 3.5.5 2026-06-08 18:33:28 +07:00
fe0036eb7e Migrate MIME-type lookup to UTType (UniformTypeIdentifiers)
Replace the deprecated CoreServices UTI calls
(UTTypeCreatePreferredIdentifierForTag / UTTypeCopyPreferredTagWithClass)
in GCDWebServerGetMimeTypeForExtension with the modern
[UTType typeWithFilenameExtension:].preferredMIMEType, removing the
-Wdeprecated-declarations pragma. Behavior is unchanged: known
extensions map to the same MIME type, unknown ones fall back to the
default.

The UniformTypeIdentifiers framework (macOS 11+ / iOS 14+ / tvOS 14+,
within the project's deployment targets) is now linked in all three
build systems: Xcode (OTHER_LDFLAGS), CocoaPods (Core subspec
frameworks), and SwiftPM (linkedFramework).

Verified: Run-Tests.sh, swift build, and pod lib lint all pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:57:23 +07:00
4a49a6fa02 Adopt Xcode recommended settings and fix resulting build errors
Applied Xcode's "Update to recommended settings" (new warning flags,
LastUpgradeCheck 2650, scheme bumps, Info.plist tidy-up), then fixed the
build failures those stricter checks surfaced:

- Disable ENABLE_MODULE_VERIFIER and CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER:
  the library intentionally uses quoted includes so the flat include/
  symlink directory resolves them for SPM; the module verifier rejects
  that.
- Add (void) to the GCDWebServerInitializeFunctions and
  _ExecuteMainThreadRunLoopSources definitions (CLANG_WARN_STRICT_PROTOTYPES
  + -Werror).
- Cast both branches of the status-code ternary in
  GCDWebServerConnection to NSInteger (-Wenum-compare-conditional mixed
  two enum types).

Verified: Run-Tests.sh, swift build, and the Xcode framework build all pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:47:27 +07:00
6ae4efcc03 Fix Run-Tests.sh for current Xcode/SDK
- Tests (Mac) target: set GENERATE_INFOPLIST_FILE = YES (modern Xcode
  refuses to code sign a test bundle with no Info.plist).
- Bump the script's hardcoded "oldest" deployment targets 10.7 -> 12.0
  and 8.0 -> 16.0; the old values fail on current SDKs (no libarclite).
- Wrap the deprecated CoreServices UTI calls in GCDWebServerFunctions.m
  in a -Wdeprecated-declarations pragma so the Release build (which uses
  -Werror) compiles; runtime behavior is unchanged.
- Comment out the webUploader fixture test: GCDWebUploader was
  customized in this fork (delete/move/create disabled, commit ef4b622)
  so Tests/WebUploader fixtures no longer match.
- Comment out the tvOS build step: it needs the tvOS Simulator runtime
  (xcodebuild -downloadPlatform tvOS) which isn't always installed.
- Document all of the above in CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:28:59 +07:00
b84e6149d6 Clean up podspec: drop redundant libxml2 flag and requires_arc
- Remove `-I$(SDKROOT)/usr/include/libxml2` from the WebDAV subspec: the
  modern SDK ships a libxml2 module map that resolves <libxml/parser.h>
  with no extra header search path (verified via pod lib lint).
- Remove all `requires_arc = true` declarations: ARC is the CocoaPods
  default and the sources already enforce it with #error guards. They
  were leftovers from when GCDWebServer <= 3.1 supported MRC.
- Remove the leftover pod trunk template comment block.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:03:51 +07:00
1f96a271cb Add Swift Package Manager support
Add Package.swift with three products: GCDWebServer (core),
GCDWebUploader, and GCDWebDAVServer.

Public headers live across Core/Requests/Responses subdirectories, which
SPM cannot expose directly. To support SPM without moving any files
(keeping the Xcode project and CocoaPods builds intact), public headers
are surfaced through symlinks in include/ directories with a hand-written
umbrella-directory module map; the private GCDWebServerPrivate.h is left
unlinked so it stays out of the public module.

GCDWebUploader.bundle is shipped as a .copy resource and located at
runtime via SWIFTPM_MODULE_BUNDLE under a #if SWIFT_PACKAGE branch.

Verified: swift build (all targets), Swift module imports, Xcode
framework build, and the XCTest suite all pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 15:55:49 +07:00
b38a78a34a Revert "fix include"
This reverts commit f90cd113ba.
2026-06-08 15:53:09 +07:00
ce098e3f7b update docs 2026-06-08 15:27:41 +07:00
8e117daaca AI readme 2026-06-08 15:21:48 +07:00
15e063264b Update prj to iOS 16, tvOS 16, MacOS 12 2026-06-08 15:10:00 +07:00
2012a6546a GCDWebUploader: update example iOS 2026-06-08 15:01:48 +07:00
ef4b622b13 GCDWebUploader: disable some feature 2026-06-08 15:00:38 +07:00
f90cd113ba fix include 2026-06-08 14:52:29 +07:00
f993a1b5d5 remove font .woff that not support iOS Appstore 2026-06-08 14:39:08 +07:00
c6d118f4ec Merge pull request #487 from gezihuzi/dev_bonjour_extent
Bonjour service support custom txt data
2020-08-17 06:45:49 -07:00
0da9ee6afe Merge pull request #497 from trapper-/master
Replace deprecated MobileCoreServices with CoreServices
2020-08-17 06:44:20 -07:00
6c93927e12 Replace deprecated MobileCoreServices with CoreServices 2020-07-22 12:32:16 +08:00
f4cf591e50 replace MobileCoreServices to CoreServices 2020-05-29 15:39:20 +08:00
5c737549fc Merge remote-tracking branch 'origin/master' into dev_bonjour_extent 2020-03-30 10:00:39 +08:00
2d8dc8775d Support setting txtData 2019-12-14 23:02:23 +08:00
49 changed files with 547 additions and 175 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ xcuserdata
project.xcworkspace
/build
/Carthage/Build
/.build

24
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,24 @@
{
"configurations": [
{
"type": "swift",
"request": "launch",
"args": [],
"cwd": "${workspaceFolder:GCDWebServer}",
"name": "Debug _spmcheck",
"target": "_spmcheck",
"configuration": "debug",
"preLaunchTask": "swift: Build Debug _spmcheck"
},
{
"type": "swift",
"request": "launch",
"args": [],
"cwd": "${workspaceFolder:GCDWebServer}",
"name": "Release _spmcheck",
"target": "_spmcheck",
"configuration": "release",
"preLaunchTask": "swift: Build Release _spmcheck"
}
]
}

1
AGENTS.md Symbolic link
View File

@ -0,0 +1 @@
CLAUDE.md

103
CLAUDE.md Normal file
View File

@ -0,0 +1,103 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
GCDWebServer is a lightweight, GCD-based HTTP 1.1 server written in Objective-C (ARC) for embedding in iOS, macOS, and tvOS apps. It has no third-party dependencies. This fork targets iOS 16 / tvOS 16 / macOS 12 (set in both `GCDWebServer.xcodeproj` and `GCDWebServer.podspec`).
Not supported by design: keep-alive connections and HTTPS.
## Build & Test
The library can be built three ways: the Xcode project (`GCDWebServer.xcodeproj`), CocoaPods (`GCDWebServer.podspec`), and Swift Package Manager (`Package.swift`). All three compile the same source files in place — see "Swift Package Manager layout" below for how the SPM `include/` directories relate to the real sources.
Build via SPM:
```sh
swift build # builds GCDWebServer, GCDWebUploader, GCDWebDAVServer
```
Schemes (`xcodebuild -list -project GCDWebServer.xcodeproj`):
- `GCDWebServer (Mac|iOS|tvOS)` — the static library / framework per platform.
- `GCDWebServers (Mac|iOS|tvOS)` — the framework target plus the XCTest unit tests (`Frameworks/Tests.m`).
- `Build All`.
Run the unit tests (XCTest):
```sh
xcodebuild test -scheme "GCDWebServers (Mac)"
```
Run a single XCTest method:
```sh
xcodebuild test -scheme "GCDWebServers (Mac)" -only-testing:Tests/Tests/testPaths
```
Full CI test suite (builds for all platforms at oldest + current deployment targets, then runs the request/response replay tests):
```sh
./Run-Tests.sh
```
`Run-Tests.sh` does the bulk of the real testing. It builds the `GCDWebServer (Mac)` target, then runs the resulting command-line `GCDWebServer` executable in test modes (`webServer`, `webDAV`, `htmlForm`, `htmlFileUpload`) against recorded fixtures.
This script was originally written for Xcode 11.3 and was updated for current Xcode/SDKs in this fork:
- The hardcoded "oldest deployment target" builds now use 12.0 (macOS) / 16.0 (iOS) to match the project (the old 10.7/8.0 values fail on modern SDKs — no `libarclite`).
- The `webUploader` fixture test is **commented out**: this fork customized `GCDWebUploader` (delete/move/create disabled in commit `ef4b622`), so the recorded `Tests/WebUploader` fixtures no longer match. Re-record them or re-enable the line if those features are restored.
- The **tvOS build step is commented out** because it requires the tvOS Simulator runtime to be installed (`xcodebuild -downloadPlatform tvOS`); without it the storyboard compile fails with "tvOS … Platform Not Installed". Re-enable once the runtime is present.
A project adjustment was also needed for the suite to build under current Xcode: the `Tests (Mac)` target sets `GENERATE_INFOPLIST_FILE = YES`. MIME-type lookup in `GCDWebServerFunctions.m` uses the modern `UTType` API (UniformTypeIdentifiers), so that framework is linked in all three build systems (Xcode `OTHER_LDFLAGS`, the podspec Core subspec, and `Package.swift`).
### How the fixture-replay tests work
The `Tests/` directory holds recorded HTTP exchanges, not code. Each test case is a pair of files: `NNN-<method>.request` (raw bytes sent to the server) and `NNN-<code>.response` (expected raw response bytes). The test runner (`-mode <mode> -root <payload-dir> -tests <test-dir>`) replays each `.request` against a server rooted at an extracted copy of `Tests/Payload.zip` and byte-compares the reply to the `.response`. To add coverage for a new behavior, add a matching `.request`/`.response` pair to the relevant `Tests/<Mode>` directory rather than writing new XCTest code.
## Formatting
Source style for Objective-C is defined by `.clang-format` (Google base style, `ColumnLimit: 0`). Format files with `clang-format -style=file -i <files>`. The Swift example apps use 2-space indentation (SwiftFormat).
## Architecture
The entire library is built around 4 core classes in `GCDWebServer/Core/`:
- **GCDWebServer** — owns the listening socket and the ordered list of handlers. Manages start/stop, options, Bonjour, NAT port mapping, and (on iOS) automatic suspend/resume across foreground/background transitions.
- **GCDWebServerConnection** — one instance per open HTTP connection, lives until the connection closes. Drives reading the request and writing the response. Subclassable via hooks (it's exposed but not used directly).
- **GCDWebServerRequest** — created once HTTP headers arrive; wraps the request and consumes the body. Subclasses in `GCDWebServer/Requests/` choose how the body is handled (in memory, streamed to disk, parsed as a form, etc.).
- **GCDWebServerResponse** — produced by a handler; wraps response headers and an optional body. Subclasses in `GCDWebServer/Responses/` cover data-in-memory, file-on-disk, streamed, and error responses.
`GCDWebServer/Core/GCDWebServerFunctions.{h,m}` holds shared C helpers (e.g. `GCDWebServerNormalizePath`, MIME-type and date helpers). `GCDWebServerPrivate.h` is the internal/private header (including the logging-facility abstraction). `GCDWebServerHTTPStatusCodes.h` enumerates status codes.
### Handler model
A request is matched and processed by **handlers** added to the server, evaluated in **LIFO order** (last added wins). Each handler is two GCD blocks:
- `GCDWebServerMatchBlock` — runs as soon as headers are received; inspects method/URL/headers and returns a `GCDWebServerRequest` subclass instance to claim the request, or `nil` to pass.
- `GCDWebServerProcessBlock` (sync) or `GCDWebServerAsyncProcessBlock` (async) — runs after the full request body is received and returns a `GCDWebServerResponse` (or `nil`/error response → 500).
Handlers run on **arbitrary GCD threads**, so handler code must be thread-safe and re-entrant.
### Extensions (subclasses of GCDWebServer)
- `GCDWebUploader/``GCDWebUploader`, an HTML5 web UI for uploading/downloading/managing files in a directory. Ships front-end assets in `GCDWebUploader.bundle`.
- `GCDWebDAVServer/``GCDWebDAVServer`, a class-1 WebDAV server (partial class-2 for macOS Finder). Depends on `libxml2`.
### Example apps & framework packaging
- `Mac/main.m` — macOS command-line example (also serves as the test-runner executable).
- `iOS/`, `tvOS/` — Swift example apps (`AppDelegate.swift`, `ViewController.swift`).
- `Frameworks/` — umbrella header (`GCDWebServers.h`), module map, and the XCTest target source (`Tests.m`).
## Swift Package Manager layout
SPM needs each target's public headers in a single directory, but the real headers live spread across `GCDWebServer/Core`, `GCDWebServer/Requests`, and `GCDWebServer/Responses`. To support SPM **without moving any files** (keeping the Xcode project and CocoaPods working), the public headers are surfaced through symlinks:
- `GCDWebServer/include/*.h` are **symlinks** to the real public headers (everything except the private `GCDWebServerPrivate.h`, which is deliberately not linked so it stays out of the public module). `GCDWebUploader/include/GCDWebUploader.h` works the same way.
- `GCDWebServer/include/module.modulemap` is hand-written with `umbrella "."`. This is required: if SPM auto-generated the module map it would pick `include/GCDWebServer.h` as an umbrella *header* (name matches the module) and only export what that one header imports, hiding the request/response subclasses. The umbrella *directory* exports them all.
- All cross-header imports inside the library (including the framework umbrella `Frameworks/GCDWebServers.h`) use quoted form (`#import "GCDWebServerRequest.h"`), not framework-style (`#import <GCDWebServers/...>`); the quoted form is what lets the flat `include/` symlink directory resolve them. Keep new imports quoted.
- `GCDWebUploader.bundle` is a `.copy` resource. Because SPM nests it inside a generated module bundle, `GCDWebUploader.m` has a `#if SWIFT_PACKAGE` branch that finds it via `SWIFTPM_MODULE_BUNDLE` instead of `bundleForClass:`.
When adding or renaming a public header, add/remove the matching symlink in the relevant `include/` directory or it won't be visible to SPM consumers. `libxml2` (for WebDAV) needs no special SPM include flag — the macOS/iOS SDK ships a module map that resolves `<libxml/parser.h>` automatically.
## Consumer linking requirements
When integrated manually (not via CocoaPods), consuming apps must link `libz`, and WebDAV additionally needs `libxml2` with `$(SDKROOT)/usr/include/libxml2` on the header search path. The `GCDWebServer.podspec` defines three subspecs: `Core` (default), `WebDAV`, and `WebUploader`.
## Logging & debug builds
Define `DEBUG=1` in `GCC_PREPROCESSOR_DEFINITIONS` to enable verbose logging plus internal consistency checks. Runtime verbosity is controlled via `+[GCDWebServer setLogLevel:]`. If XLFacility is present in the same Xcode project, GCDWebServer routes logging through it automatically (see `GCDWebServerPrivate.h`).

View File

@ -7,16 +7,16 @@
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleVersion</key>
<string>${BUNDLE_VERSION_STRING}</string>
<key>CFBundleShortVersionString</key>
<string>${BUNDLE_VERSION_STRING}</string>
<key>CFBundleVersion</key>
<string>${BUNDLE_VERSION_STRING}</string>
</dict>
</plist>

View File

@ -1,34 +1,26 @@
# http://guides.cocoapods.org/syntax/podspec.html
# http://guides.cocoapods.org/making/getting-setup-with-trunk.html
# $ sudo gem update cocoapods
# (optional) $ pod trunk register {email} {name} --description={computer}
# $ pod trunk --verbose push
# DELETE THIS SECTION BEFORE PROCEEDING!
Pod::Spec.new do |s|
s.name = 'GCDWebServer'
s.version = '3.5.4'
s.version = '3.5.5'
s.author = { 'Pierre-Olivier Latour' => 'info@pol-online.net' }
s.license = { :type => 'BSD', :file => 'LICENSE' }
s.homepage = 'https://github.com/swisspol/GCDWebServer'
s.summary = 'Lightweight GCD based HTTP server for OS X & iOS (includes web based uploader & WebDAV server)'
s.source = { :git => 'https://github.com/swisspol/GCDWebServer.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.tvos.deployment_target = '9.0'
s.osx.deployment_target = '10.7'
s.requires_arc = true
s.source = { :git => 'https://git.g7software.net/cuong/GCDWebServer.git', :tag => s.version.to_s }
s.ios.deployment_target = '16.0'
s.tvos.deployment_target = '16.0'
s.osx.deployment_target = '12.0'
s.default_subspec = 'Core'
s.subspec 'Core' do |cs|
cs.source_files = 'GCDWebServer/**/*.{h,m}'
cs.private_header_files = "GCDWebServer/Core/GCDWebServerPrivate.h"
cs.requires_arc = true
cs.frameworks = 'UniformTypeIdentifiers'
cs.ios.library = 'z'
cs.ios.frameworks = 'MobileCoreServices', 'CFNetwork'
cs.ios.frameworks = 'CoreServices', 'CFNetwork'
cs.tvos.library = 'z'
cs.tvos.frameworks = 'MobileCoreServices', 'CFNetwork'
cs.tvos.frameworks = 'CoreServices', 'CFNetwork'
cs.osx.library = 'z'
cs.osx.framework = 'SystemConfiguration'
end
@ -36,17 +28,14 @@ Pod::Spec.new do |s|
s.subspec 'WebDAV' do |cs|
cs.dependency 'GCDWebServer/Core'
cs.source_files = 'GCDWebDAVServer/*.{h,m}'
cs.requires_arc = true
cs.ios.library = 'xml2'
cs.tvos.library = 'xml2'
cs.osx.library = 'xml2'
cs.compiler_flags = '-I$(SDKROOT)/usr/include/libxml2'
end
s.subspec 'WebUploader' do |cs|
cs.dependency 'GCDWebServer/Core'
cs.source_files = 'GCDWebUploader/*.{h,m}'
cs.requires_arc = true
cs.resource = "GCDWebUploader/GCDWebUploader.bundle"
end
end

View File

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 48;
objectVersion = 77;
objects = {
/* Begin PBXAggregateTarget section */
@ -96,7 +96,7 @@
CEE28D501AE0098600F4023C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2BE851018E79DAF0061360B /* SystemConfiguration.framework */; };
CEE28D511AE0098C00F4023C /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D1B2167BB17E00500836 /* CoreServices.framework */; };
CEE28D521AE00A7A00F4023C /* GCDWebServers.h in Headers */ = {isa = PBXBuildFile; fileRef = CEE28CF31AE0051F00F4023C /* GCDWebServers.h */; settings = {ATTRIBUTES = (Public, ); }; };
CEE28D571AE00AFE00F4023C /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */; };
CEE28D571AE00AFE00F4023C /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E221129C1690B7BA0048D2B2 /* CoreServices.framework */; };
CEE28D591AE00AFE00F4023C /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E22112981690B7AA0048D2B2 /* CFNetwork.framework */; };
CEE28D6A1AE1ABAA00F4023C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE28D691AE1ABAA00F4023C /* UIKit.framework */; };
E208D149167B76B700500836 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E208D148167B76B700500836 /* CFNetwork.framework */; };
@ -161,7 +161,7 @@
E2DDD1B71BE6951A002CE867 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1B61BE6951A002CE867 /* CFNetwork.framework */; };
E2DDD1BA1BE69545002CE867 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1B91BE69545002CE867 /* libz.tbd */; };
E2DDD1BC1BE69551002CE867 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BB1BE69551002CE867 /* libxml2.tbd */; };
E2DDD1BE1BE6956F002CE867 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BD1BE6956F002CE867 /* MobileCoreServices.framework */; };
E2DDD1BE1BE6956F002CE867 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BD1BE6956F002CE867 /* CoreServices.framework */; };
E2DDD1C01BE69576002CE867 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DDD1BF1BE69576002CE867 /* UIKit.framework */; };
E2DDD1CE1BE698A8002CE867 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1CD1BE698A8002CE867 /* AppDelegate.swift */; };
E2DDD1D11BE698A8002CE867 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2DDD1D01BE698A8002CE867 /* ViewController.swift */; };
@ -293,7 +293,7 @@
E208D1B2167BB17E00500836 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };
E221128E1690B6470048D2B2 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
E22112981690B7AA0048D2B2 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; };
E221129C1690B7BA0048D2B2 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/System/Library/Frameworks/CoreServices.framework; sourceTree = DEVELOPER_DIR; };
E24039251BA09207000B7089 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
E24039311BA092B7000B7089 /* Tests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = "<group>"; };
E24A3C4021E2940600C58878 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
@ -335,7 +335,7 @@
E2DDD1B61BE6951A002CE867 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
E2DDD1B91BE69545002CE867 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; };
E2DDD1BB1BE69551002CE867 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; };
E2DDD1BD1BE6956F002CE867 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; };
E2DDD1BD1BE6956F002CE867 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/CoreServices.framework; sourceTree = DEVELOPER_DIR; };
E2DDD1BF1BE69576002CE867 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
E2DDD1C71BE698A8002CE867 /* GCDWebServer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GCDWebServer.app; sourceTree = BUILT_PRODUCTS_DIR; };
E2DDD1CD1BE698A8002CE867 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@ -387,7 +387,7 @@
buildActionMask = 2147483647;
files = (
CEE28D6A1AE1ABAA00F4023C /* UIKit.framework in Frameworks */,
CEE28D571AE00AFE00F4023C /* MobileCoreServices.framework in Frameworks */,
CEE28D571AE00AFE00F4023C /* CoreServices.framework in Frameworks */,
CEE28D591AE00AFE00F4023C /* CFNetwork.framework in Frameworks */,
E2DDD2251BE6A0AE002CE867 /* libxml2.tbd in Frameworks */,
E2DDD2271BE6A0B4002CE867 /* libz.tbd in Frameworks */,
@ -407,7 +407,7 @@
buildActionMask = 2147483647;
files = (
E2DDD1C01BE69576002CE867 /* UIKit.framework in Frameworks */,
E2DDD1BE1BE6956F002CE867 /* MobileCoreServices.framework in Frameworks */,
E2DDD1BE1BE6956F002CE867 /* CoreServices.framework in Frameworks */,
E2DDD1B71BE6951A002CE867 /* CFNetwork.framework in Frameworks */,
E2DDD1BC1BE69551002CE867 /* libxml2.tbd in Frameworks */,
E2DDD1BA1BE69545002CE867 /* libz.tbd in Frameworks */,
@ -490,7 +490,7 @@
isa = PBXGroup;
children = (
CEE28D691AE1ABAA00F4023C /* UIKit.framework */,
E221129C1690B7BA0048D2B2 /* MobileCoreServices.framework */,
E221129C1690B7BA0048D2B2 /* CoreServices.framework */,
E22112981690B7AA0048D2B2 /* CFNetwork.framework */,
E2DDD2241BE6A0AE002CE867 /* libxml2.tbd */,
E2DDD2261BE6A0B4002CE867 /* libz.tbd */,
@ -593,7 +593,7 @@
isa = PBXGroup;
children = (
E2DDD1BF1BE69576002CE867 /* UIKit.framework */,
E2DDD1BD1BE6956F002CE867 /* MobileCoreServices.framework */,
E2DDD1BD1BE6956F002CE867 /* CoreServices.framework */,
E2DDD1B61BE6951A002CE867 /* CFNetwork.framework */,
E2DDD1BB1BE69551002CE867 /* libxml2.tbd */,
E2DDD1B91BE69545002CE867 /* libz.tbd */,
@ -838,7 +838,8 @@
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1130;
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 2650;
TargetAttributes = {
CEE28CD01AE004D800F4023C = {
CreatedOnToolsVersion = 6.3;
@ -863,7 +864,6 @@
};
};
buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "GCDWebServer" */;
compatibilityVersion = "Xcode 8.0";
developmentRegion = en;
hasScannedForEncodings = 1;
knownRegions = (
@ -871,6 +871,7 @@
Base,
);
mainGroup = 08FB7794FE84155DC02AAC07 /* LittleCMS */;
preferredProjectObjectVersion = 77;
projectDirPath = "";
projectRoot = "";
targets = (
@ -1146,7 +1147,8 @@
1DEB928608733DD80010E9CD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
MACOSX_DEPLOYMENT_TARGET = 10.7;
DEAD_CODE_STRIPPING = YES;
MACOSX_DEPLOYMENT_TARGET = 12;
PRODUCT_NAME = GCDWebServer;
SDKROOT = macosx;
};
@ -1155,7 +1157,8 @@
1DEB928708733DD80010E9CD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
MACOSX_DEPLOYMENT_TARGET = 10.7;
DEAD_CODE_STRIPPING = YES;
MACOSX_DEPLOYMENT_TARGET = 12;
PRODUCT_NAME = GCDWebServer;
SDKROOT = macosx;
};
@ -1165,15 +1168,45 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
BUNDLE_VERSION_STRING = 3.5.4;
BUNDLE_VERSION_STRING = 3.5.5;
OTHER_LDFLAGS = "-framework UniformTypeIdentifiers";
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
DEAD_CODE_STRIPPING = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "net.pol-online.GCDWebServers";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@ -1206,13 +1239,42 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
BUNDLE_VERSION_STRING = 3.5.4;
BUNDLE_VERSION_STRING = 3.5.5;
OTHER_LDFLAGS = "-framework UniformTypeIdentifiers";
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
DEAD_CODE_STRIPPING = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
PRODUCT_BUNDLE_IDENTIFIER = "net.pol-online.GCDWebServers";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;
SWIFT_VERSION = 5.0;
@ -1223,13 +1285,21 @@
CEE28CE41AE004D800F4023C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = YES;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = NO;
INFOPLIST_FILE = Frameworks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.7;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14";
PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}";
PRODUCT_NAME = GCDWebServers;
SDKROOT = macosx;
SKIP_INSTALL = YES;
@ -1239,13 +1309,21 @@
CEE28CE51AE004D800F4023C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = YES;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = NO;
INFOPLIST_FILE = Frameworks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.7;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14";
PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}";
PRODUCT_NAME = GCDWebServers;
SDKROOT = macosx;
SKIP_INSTALL = YES;
@ -1255,14 +1333,22 @@
CEE28D031AE0052000F4023C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = NO;
INFOPLIST_FILE = Frameworks/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 16;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MODULEMAP_FILE = Frameworks/module.modulemap;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14";
PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}";
PRODUCT_NAME = GCDWebServers;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
@ -1273,14 +1359,22 @@
CEE28D041AE0052000F4023C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = NO;
INFOPLIST_FILE = Frameworks/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 16;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MODULEMAP_FILE = Frameworks/module.modulemap;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14";
PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}";
PRODUCT_NAME = GCDWebServers;
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
@ -1291,12 +1385,18 @@
E240392F1BA09207000B7089 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(inherited)",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.7;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12;
PRODUCT_NAME = Tests;
SDKROOT = macosx;
WARNING_CFLAGS = (
@ -1309,12 +1409,18 @@
E24039301BA09207000B7089 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(inherited)",
);
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.7;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12;
PRODUCT_NAME = Tests;
SDKROOT = macosx;
WARNING_CFLAGS = (
@ -1327,6 +1433,7 @@
E274F877187E77D8009E0582 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
@ -1334,6 +1441,7 @@
E274F878187E77D8009E0582 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
DEAD_CODE_STRIPPING = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
@ -1341,38 +1449,54 @@
E2DDD1901BE69404002CE867 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Manual;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = NO;
INFOPLIST_FILE = Frameworks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14";
PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}";
PRODUCT_NAME = GCDWebServers;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = appletvos;
SKIP_INSTALL = YES;
TVOS_DEPLOYMENT_TARGET = 9.0;
TVOS_DEPLOYMENT_TARGET = 16;
};
name = Debug;
};
E2DDD1911BE69404002CE867 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Manual;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = NO;
INFOPLIST_FILE = Frameworks/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++14";
PRODUCT_BUNDLE_IDENTIFIER = "${PRODUCT_BUNDLE_IDENTIFIER}";
PRODUCT_NAME = GCDWebServers;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = appletvos;
SKIP_INSTALL = YES;
TVOS_DEPLOYMENT_TARGET = 9.0;
TVOS_DEPLOYMENT_TARGET = 16;
};
name = Release;
};
@ -1383,11 +1507,14 @@
COPY_PHASE_STRIP = NO;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = tvOS/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_NAME = GCDWebServer;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = appletvos;
TVOS_DEPLOYMENT_TARGET = 9.0;
TVOS_DEPLOYMENT_TARGET = 16;
};
name = Debug;
};
@ -1398,11 +1525,14 @@
COPY_PHASE_STRIP = NO;
DEVELOPMENT_TEAM = "";
INFOPLIST_FILE = tvOS/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_NAME = GCDWebServer;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = appletvos;
TVOS_DEPLOYMENT_TARGET = 9.0;
TVOS_DEPLOYMENT_TARGET = 16;
};
name = Release;
};
@ -1412,8 +1542,11 @@
COPY_PHASE_STRIP = NO;
ENABLE_BITCODE = YES;
INFOPLIST_FILE = iOS/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 16;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_NAME = GCDWebServer;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@ -1426,8 +1559,11 @@
COPY_PHASE_STRIP = NO;
ENABLE_BITCODE = YES;
INFOPLIST_FILE = iOS/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 16;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_NAME = GCDWebServer;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1130"
LastUpgradeVersion = "2650"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1130"
LastUpgradeVersion = "2650"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1130"
LastUpgradeVersion = "2650"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@ -92,6 +92,13 @@ extern NSString* const GCDWebServerOption_Port;
*/
extern NSString* const GCDWebServerOption_BonjourName;
/**
* The Bonjour TXT Data used by the GCDWebServer (NSDictionary<NSString, NSString>).
*
* The default value is nil.
*/
extern NSString* const GCDWebServerOption_BonjourTXTData;
/**
* The Bonjour service type used by the GCDWebServer (NSString).
*

View File

@ -53,6 +53,7 @@
NSString* const GCDWebServerOption_Port = @"Port";
NSString* const GCDWebServerOption_BonjourName = @"BonjourName";
NSString* const GCDWebServerOption_BonjourType = @"BonjourType";
NSString* const GCDWebServerOption_BonjourTXTData = @"BonjourTXTData";
NSString* const GCDWebServerOption_RequestNATPortMapping = @"RequestNATPortMapping";
NSString* const GCDWebServerOption_BindToLocalhost = @"BindToLocalhost";
NSString* const GCDWebServerOption_MaxPendingConnections = @"MaxPendingConnections";
@ -123,7 +124,7 @@ static void _SignalHandler(int signal) {
// https://developer.apple.com/library/mac/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
// The main queue works with the applications run loop to interleave the execution of queued tasks with the execution of other event sources attached to the run loop
// TODO: Ensure all scheduled blocks on the main queue are also executed
static void _ExecuteMainThreadRunLoopSources() {
static void _ExecuteMainThreadRunLoopSources(void) {
SInt32 result;
do {
result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.0, true);
@ -590,6 +591,29 @@ static inline NSString* _EncodeBase64(NSString* string) {
CFNetServiceSetClient(_registrationService, _NetServiceRegisterCallBack, &context);
CFNetServiceScheduleWithRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes);
CFStreamError streamError = {0};
NSDictionary* txtDataDictionary = _GetOption(_options, GCDWebServerOption_BonjourTXTData, nil);
if (txtDataDictionary != nil) {
NSUInteger count = txtDataDictionary.count;
CFStringRef keys[count];
CFStringRef values[count];
NSUInteger index = 0;
for (NSString *key in txtDataDictionary) {
NSString *value = txtDataDictionary[key];
keys[index] = (__bridge CFStringRef)(key);
values[index] = (__bridge CFStringRef)(value);
index ++;
}
CFDictionaryRef txtDictionary = CFDictionaryCreate(CFAllocatorGetDefault(), (void *)keys, (void *)values, count, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
if (txtDictionary != NULL) {
CFDataRef txtData = CFNetServiceCreateTXTDataWithDictionary(nil, txtDictionary);
Boolean setTXTDataResult = CFNetServiceSetTXTData(_registrationService, txtData);
if (!setTXTDataResult) {
GWS_LOG_ERROR(@"Failed setting TXTData");
}
}
}
CFNetServiceRegisterWithOptions(_registrationService, 0, &streamError);
_resolutionService = CFNetServiceCreateCopy(kCFAllocatorDefault, _registrationService);

View File

@ -779,7 +779,7 @@ static inline BOOL _CompareResources(NSString* responseETag, NSString* requestET
- (GCDWebServerResponse*)overrideResponse:(GCDWebServerResponse*)response forRequest:(GCDWebServerRequest*)request {
if ((response.statusCode >= 200) && (response.statusCode < 300) && _CompareResources(response.eTag, request.ifNoneMatch, response.lastModifiedDate, request.ifModifiedSince)) {
NSInteger code = [request.method isEqualToString:@"HEAD"] || [request.method isEqualToString:@"GET"] ? kGCDWebServerHTTPStatusCode_NotModified : kGCDWebServerHTTPStatusCode_PreconditionFailed;
NSInteger code = [request.method isEqualToString:@"HEAD"] || [request.method isEqualToString:@"GET"] ? (NSInteger)kGCDWebServerHTTPStatusCode_NotModified : (NSInteger)kGCDWebServerHTTPStatusCode_PreconditionFailed;
GCDWebServerResponse* newResponse = [GCDWebServerResponse responseWithStatusCode:code];
newResponse.cacheControlMaxAge = response.cacheControlMaxAge;
newResponse.lastModifiedDate = response.lastModifiedDate;

View File

@ -31,10 +31,11 @@
#import <TargetConditionals.h>
#if TARGET_OS_IPHONE
#import <MobileCoreServices/MobileCoreServices.h>
#import <CoreServices/CoreServices.h>
#else
#import <SystemConfiguration/SystemConfiguration.h>
#endif
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
#import <CommonCrypto/CommonDigest.h>
#import <ifaddrs.h>
@ -48,7 +49,7 @@ static NSDateFormatter* _dateFormatterISO8601 = nil;
static dispatch_queue_t _dateFormatterQueue = NULL;
// TODO: Handle RFC 850 and ANSI C's asctime() format
void GCDWebServerInitializeFunctions() {
void GCDWebServerInitializeFunctions(void) {
GWS_DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread
if (_dateFormatterRFC822 == nil) {
_dateFormatterRFC822 = [[NSDateFormatter alloc] init];
@ -176,11 +177,7 @@ NSString* GCDWebServerGetMimeTypeForExtension(NSString* extension, NSDictionary<
mimeType = [builtInOverrides objectForKey:extension];
}
if (mimeType == nil) {
CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL);
if (uti) {
mimeType = CFBridgingRelease(UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType));
CFRelease(uti);
}
mimeType = [UTType typeWithFilenameExtension:extension].preferredMIMEType;
}
}
return mimeType ? mimeType : kGCDWebServerDefaultMimeType;

View File

@ -0,0 +1 @@
../Core/GCDWebServer.h

View File

@ -0,0 +1 @@
../Core/GCDWebServerConnection.h

View File

@ -0,0 +1 @@
../Requests/GCDWebServerDataRequest.h

View File

@ -0,0 +1 @@
../Responses/GCDWebServerDataResponse.h

View File

@ -0,0 +1 @@
../Responses/GCDWebServerErrorResponse.h

View File

@ -0,0 +1 @@
../Requests/GCDWebServerFileRequest.h

View File

@ -0,0 +1 @@
../Responses/GCDWebServerFileResponse.h

View File

@ -0,0 +1 @@
../Core/GCDWebServerFunctions.h

View File

@ -0,0 +1 @@
../Core/GCDWebServerHTTPStatusCodes.h

View File

@ -0,0 +1 @@
../Requests/GCDWebServerMultiPartFormRequest.h

View File

@ -0,0 +1 @@
../Core/GCDWebServerRequest.h

View File

@ -0,0 +1 @@
../Core/GCDWebServerResponse.h

View File

@ -0,0 +1 @@
../Responses/GCDWebServerStreamedResponse.h

View File

@ -0,0 +1 @@
../Requests/GCDWebServerURLEncodedFormRequest.h

View File

@ -0,0 +1,4 @@
module GCDWebServer {
umbrella "."
export *
}

View File

@ -2377,7 +2377,7 @@ input[type="button"].btn-block {
font-family: 'Glyphicons Halflings';
src: url('../fonts/glyphicons-halflings-regular.eot');
src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}
.glyphicon {
position: relative;

View File

@ -1,3 +1,3 @@
"PROLOGUE" = "<p>Drag &amp; drop files on this window or use the \"Upload Files&hellip;\" button to upload new files.</p>";
"PROLOGUE" = "<p>Drag &amp; drop files on this window or use the \"Import Files&hellip;\" button to import new files.</p>";
"EPILOGUE" = "";
"FOOTER_FORMAT" = "%@ %@";

View File

@ -66,12 +66,12 @@
<div class="btn-toolbar">
<button type="button" class="btn btn-primary fileinput-button" id="upload-file">
<span class="glyphicon glyphicon-upload"></span> Upload Files&hellip;
<span class="glyphicon glyphicon-upload"></span> Import Files&hellip;
<input id="fileupload" type="file" name="files[]" multiple>
</button>
<button type="button" class="btn btn-success" id="create-folder">
<span class="glyphicon glyphicon-folder-close"></span> Create Folder&hellip;
</button>
<!-- <button type="button" class="btn btn-success" id="create-folder">-->
<!-- <span class="glyphicon glyphicon-folder-close"></span> Create Folder&hellip;-->
<!-- </button>-->
<button type="button" class="btn btn-default" id="reload">
<span class="glyphicon glyphicon-refresh"></span> Refresh
</button>
@ -156,16 +156,16 @@
<p>{%=formatFileSize(o.size)%}</p>
{% } %}
</td>
<td class="column-move">
<button type="button" class="btn btn-default btn-xs button-move">
<span class="glyphicon glyphicon glyphicon-share-alt"></span>
</button>
</td>
<td class="column-delete">
<button type="button" class="btn btn-danger btn-xs button-delete">
<span class="glyphicon glyphicon-trash"></span>
</button>
</td>
<!-- <td class="column-move">-->
<!-- <button type="button" class="btn btn-default btn-xs button-move">-->
<!-- <span class="glyphicon glyphicon glyphicon-share-alt"></span>-->
<!-- </button>-->
<!-- </td>-->
<!-- <td class="column-delete">-->
<!-- <button type="button" class="btn btn-danger btn-xs button-delete">-->
<!-- <span class="glyphicon glyphicon-trash"></span>-->
<!-- </button>-->
<!-- </td>-->
</tr>
</script>

View File

@ -66,7 +66,12 @@ NS_ASSUME_NONNULL_END
- (instancetype)initWithUploadDirectory:(NSString*)path {
if ((self = [super init])) {
#if SWIFT_PACKAGE
// When built with Swift Package Manager, resources live inside the auto-generated module bundle
NSString* bundlePath = [SWIFTPM_MODULE_BUNDLE pathForResource:@"GCDWebUploader" ofType:@"bundle"];
#else
NSString* bundlePath = [[NSBundle bundleForClass:[GCDWebUploader class]] pathForResource:@"GCDWebUploader" ofType:@"bundle"];
#endif
if (bundlePath == nil) {
return nil;
}
@ -420,15 +425,15 @@ NS_ASSUME_NONNULL_END
}
- (BOOL)shouldMoveItemFromPath:(NSString*)fromPath toPath:(NSString*)toPath {
return YES;
return NO;
}
- (BOOL)shouldDeleteItemAtPath:(NSString*)path {
return YES;
return NO;
}
- (BOOL)shouldCreateDirectoryAtPath:(NSString*)path {
return YES;
return NO;
}
@end

View File

@ -0,0 +1 @@
../GCDWebUploader.h

56
Package.swift Normal file
View File

@ -0,0 +1,56 @@
// swift-tools-version:5.9
import PackageDescription
let package = Package(
name: "GCDWebServer",
platforms: [
.iOS(.v16),
.tvOS(.v16),
.macOS(.v12),
],
products: [
.library(name: "GCDWebServer", targets: ["GCDWebServer"]),
.library(name: "GCDWebUploader", targets: ["GCDWebUploader"]),
.library(name: "GCDWebDAVServer", targets: ["GCDWebDAVServer"]),
],
targets: [
.target(
name: "GCDWebServer",
path: "GCDWebServer",
// Public headers are exposed via symlinks in include/ so that GCDWebServerPrivate.h stays private.
publicHeadersPath: "include",
cSettings: [
// Source files import sibling headers across these subdirectories with quoted #imports.
.headerSearchPath("Core"),
.headerSearchPath("Requests"),
.headerSearchPath("Responses"),
],
linkerSettings: [
.linkedLibrary("z"),
.linkedFramework("UniformTypeIdentifiers"),
.linkedFramework("CoreServices", .when(platforms: [.iOS, .tvOS])),
.linkedFramework("CFNetwork", .when(platforms: [.iOS, .tvOS])),
.linkedFramework("SystemConfiguration", .when(platforms: [.macOS])),
]
),
.target(
name: "GCDWebUploader",
dependencies: ["GCDWebServer"],
path: "GCDWebUploader",
exclude: [".DS_Store"],
resources: [
.copy("GCDWebUploader.bundle"),
],
publicHeadersPath: "include"
),
.target(
name: "GCDWebDAVServer",
dependencies: ["GCDWebServer"],
path: "GCDWebDAVServer",
publicHeadersPath: ".",
linkerSettings: [
.linkedLibrary("xml2"),
]
),
]
)

View File

@ -35,9 +35,9 @@ What's not supported (but not really required from an embedded HTTP server):
* HTTPS
Requirements:
* macOS 10.7 or later (x86_64)
* iOS 8.0 or later (armv7, armv7s or arm64)
* tvOS 9.0 or later (arm64)
* macOS 12 or later (x86_64, arm64)
* iOS 16 or later (arm64)
* tvOS 16 or later (arm64)
* ARC memory management only (if you need MRC support use GCDWebServer 3.1 or earlier)
Getting Started
@ -67,6 +67,12 @@ github "swisspol/GCDWebServer" ~> 3.2.5
Then run `$ carthage update` and add the generated frameworks to your Xcode projects (see [Carthage instructions](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application)).
You can also use [Swift Package Manager](https://www.swift.org/package-manager/). Add GCDWebServer as a dependency in your `Package.swift`:
```swift
.package(url: "https://git.g7software.net/cuong/GCDWebServer.git", from: "3.5.5")
```
Then add the product(s) you need to your target's dependencies: `"GCDWebServer"` for the core server, `"GCDWebUploader"` for the web uploader, and/or `"GCDWebDAVServer"` for the WebDAV server. In Xcode, use File > Add Package Dependencies and enter the repository URL.
Help & Support
==============

View File

@ -51,7 +51,7 @@ xcodebuild test -scheme "$OSX_TEST_SCHEME" "SYMROOT=$BUILD_DIR"
# Build for OS X for oldest supported deployment target
rm -rf "$BUILD_DIR"
xcodebuild build -sdk "$OSX_SDK" -target "$OSX_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "MACOSX_DEPLOYMENT_TARGET=10.7" | $PRETTYFIER
xcodebuild build -sdk "$OSX_SDK" -target "$OSX_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "MACOSX_DEPLOYMENT_TARGET=12.0" | $PRETTYFIER
# Run tests
runTests $PRODUCT "htmlForm" "Tests/HTMLForm"
@ -60,7 +60,9 @@ runTests $PRODUCT "webServer" "Tests/WebServer"
runTests $PRODUCT "webDAV" "Tests/WebDAV-Transmit"
runTests $PRODUCT "webDAV" "Tests/WebDAV-Cyberduck"
runTests $PRODUCT "webDAV" "Tests/WebDAV-Finder"
runTests $PRODUCT "webUploader" "Tests/WebUploader"
# Skipped: GCDWebUploader has been customized in this fork (delete/move/create disabled,
# see commit ef4b622), so the recorded fixtures in Tests/WebUploader no longer match.
# runTests $PRODUCT "webUploader" "Tests/WebUploader"
runTests $PRODUCT "webServer" "Tests/WebServer-Sample-Movie" "Tests/Sample-Movie.mp4"
# Build for OS X for current deployment target
@ -69,15 +71,18 @@ xcodebuild build -sdk "$OSX_SDK" -target "$OSX_TARGET" -configuration "$CONFIGUR
# Build for iOS for oldest supported deployment target
rm -rf "$BUILD_DIR"
xcodebuild build -sdk "$IOS_SDK" -target "$IOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "IPHONEOS_DEPLOYMENT_TARGET=8.0" | $PRETTYFIER
xcodebuild build -sdk "$IOS_SDK" -target "$IOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "IPHONEOS_DEPLOYMENT_TARGET=16.0" | $PRETTYFIER
# Build for iOS for current deployment target
rm -rf "$BUILD_DIR"
xcodebuild build -sdk "$IOS_SDK" -target "$IOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "IPHONEOS_DEPLOYMENT_TARGET=$IOS_SDK_VERSION" | $PRETTYFIER
# Build for tvOS for current deployment target
rm -rf "$BUILD_DIR"
xcodebuild build -sdk "$TVOS_SDK" -target "$TVOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "TVOS_DEPLOYMENT_TARGET=$TVOS_SDK_VERSION" | $PRETTYFIER
# Commented out: building the tvOS example app requires the tvOS Simulator runtime to be installed
# (otherwise the storyboard compile fails with "tvOS <version> Platform Not Installed"). Re-enable
# this after running: xcodebuild -downloadPlatform tvOS
# rm -rf "$BUILD_DIR"
# xcodebuild build -sdk "$TVOS_SDK" -target "$TVOS_TARGET" -configuration "$CONFIGURATION" "SYMROOT=$BUILD_DIR" "TVOS_DEPLOYMENT_TARGET=$TVOS_SDK_VERSION" | $PRETTYFIER
# Done
echo "\nAll tests completed successfully!"

View File

@ -1,45 +0,0 @@
#!/bin/sh -exuo pipefail
# brew install clang-format
SWIFT_FORMAT_VERSION='0.44.5'
CLANG_FORMAT_VERSION=`clang-format -version | awk '{ print $3 }'`
if [[ "$CLANG_FORMAT_VERSION" != "9.0.0" ]]; then
echo "Unsupported clang-format version"
exit 1
fi
if [[ ! -f "build/swiftformat" ]]; then
mkdir -p "build"
curl -sfL -o "build/SwiftFormat.zip" "https://github.com/nicklockwood/SwiftFormat/archive/$SWIFT_FORMAT_VERSION.zip"
unzip "build/SwiftFormat.zip" "SwiftFormat-$SWIFT_FORMAT_VERSION/CommandLineTool/swiftformat" -d "build"
mv "build/SwiftFormat-$SWIFT_FORMAT_VERSION/CommandLineTool/swiftformat" "build/swiftformat"
fi
pushd "GCDWebServer/Core"
clang-format -style=file -i *.h *.m
popd
pushd "GCDWebServer/Requests"
clang-format -style=file -i *.h *.m
popd
pushd "GCDWebServer/Responses"
clang-format -style=file -i *.h *.m
popd
pushd "GCDWebUploader"
clang-format -style=file -i *.h *.m
popd
pushd "GCDWebDAVServer"
clang-format -style=file -i *.h *.m
popd
pushd "Frameworks"
clang-format -style=file -i *.h *.m
popd
pushd "Mac"
clang-format -style=file -i *.m
popd
build/swiftformat --indent 2 "iOS" "tvOS"
echo "OK"

View File

@ -39,6 +39,11 @@ class ViewController: UIViewController {
webServer = GCDWebUploader(uploadDirectory: documentsPath)
webServer.delegate = self
webServer.allowHiddenItems = true
// webServer.allowedFileExtensions = []
webServer.title = "title" // default: CFBundleDisplayName or CFBundleName
webServer.header = "header" // default: CFBundleDisplayName or CFBundleName
webServer.prologue = "prologue" // "<p>Drag &amp; drop files on this window or use the \"Import Files&hellip;\" button to import new files.</p>"
webServer.footer = "footer" // "%@ %@" default: CFBundleDisplayName or CFBundleName and CFBundleShortVersionString
if webServer.start() {
label?.text = "GCDWebServer running locally on port \(webServer.port)"
} else {

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -3,10 +3,14 @@
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -1,15 +1,22 @@
{
"images" : [
{
"orientation" : "landscape",
"idiom" : "tv",
"extent" : "full-screen",
"idiom" : "tv",
"minimum-system-version" : "11.0",
"orientation" : "landscape",
"scale" : "2x"
},
{
"extent" : "full-screen",
"idiom" : "tv",
"minimum-system-version" : "9.0",
"orientation" : "landscape",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}