Hello World
"]; + + }]; + + // Use convenience method that runs server on port 8080 + // until SIGINT (Ctrl-C in Terminal) or SIGTERM is received + [webServer runWithPort:8080 bonjourName:nil]; + NSLog(@"Visit %@ in your web browser", webServer.serverURL); + + } + return 0; +} +``` + +**iOS version:** +```objectivec +#import "GCDWebServer.h" +#import "GCDWebServerDataResponse.h" + +@interface AppDelegate : NSObjectHello World
"]; + + }]; + + // Start server on port 8080 + [_webServer startWithPort:8080 bonjourName:nil]; + NSLog(@"Visit %@ in your web browser", _webServer.serverURL); + + return YES; +} + +@end +``` + +**OS X Swift version (command line tool):** + +***webServer.swift*** +```swift +import Foundation +import GCDWebServer + +func initWebServer() { + + let webServer = GCDWebServer() + + webServer.addDefaultHandlerForMethod("GET", requestClass: GCDWebServerRequest.self, processBlock: {request in + return GCDWebServerDataResponse(HTML:"Hello World
") + + }) + + webServer.runWithPort(8080, bonjourName: "GCD Web Server") + + print("Visit \(webServer.serverURL) in your web browser") +} +``` + +***WebServer-Bridging-Header.h*** +```objectivec +#importHello World
"]; + return response; + +}]; +``` + +**(Asynchronous version)** The handler returns immediately and calls back GCDWebServer later with the generated HTTP response: +```objectivec +[webServer addDefaultHandlerForMethod:@"GET" + requestClass:[GCDWebServerRequest class] + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + + // Do some async operation like network access or file I/O (simulated here using dispatch_after()) + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithHTML:@"Hello World
"]; + completionBlock(response); + }); + +}]; +``` + +**(Advanced asynchronous version)** The handler returns immediately a streamed HTTP response which itself generates its contents asynchronously: +```objectivec +[webServer addDefaultHandlerForMethod:@"GET" + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { + + NSMutableArray* contents = [NSMutableArray arrayWithObjects:@"\n", @"Hello World!\n", @"
\n", nil]; // Fake data source we are reading from + GCDWebServerStreamedResponse* response = [GCDWebServerStreamedResponse responseWithContentType:@"text/html" asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { + + // Simulate a delay reading from the fake data source + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + NSString* string = contents.firstObject; + if (string) { + [contents removeObjectAtIndex:0]; + completionBlock([string dataUsingEncoding:NSUTF8StringEncoding], nil); // Generate the 2nd part of the stream data + } else { + completionBlock([NSData data], nil); // Must pass an empty NSData to signal the end of the stream + } + }); + + }]; + return response; + +}]; +``` + +*Note that you can even combine both the asynchronous and advanced asynchronous versions to return asynchronously an asynchronous HTTP response!* + +GCDWebServer & Background Mode for iOS Apps +=========================================== + +When doing networking operations in iOS apps, you must handle carefully [what happens when iOS puts the app in the background](https://developer.apple.com/library/ios/technotes/tn2277/_index.html). Typically you must stop any network servers while the app is in the background and restart them when the app comes back to the foreground. This can become quite complex considering servers might have ongoing connections when they need to be stopped. + +Fortunately, GCDWebServer does all of this automatically for you: +- GCDWebServer begins a [background task](https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html) whenever the first HTTP connection is opened and ends it only when the last one is closed. This prevents iOS from suspending the app after it goes in the background, which would immediately kill HTTP connections to the client. + - While the app is in the background, as long as new HTTP connections keep being initiated, the background task will continue to exist and iOS will not suspend the app (unless under sudden and unexpected memory pressure). + - If the app is still in the background when the last HTTP connection is closed, GCDWebServer will suspend itself and stop accepting new connections as if you had called ```-stop``` (this behavior can be disabled with the ```GCDWebServerOption_AutomaticallySuspendInBackground``` option). +- If the app goes in the background while no HTTP connections are opened, GCDWebServer will immediately suspend itself and stop accepting new connections as if you had called ```-stop``` (this behavior can be disabled with the ```GCDWebServerOption_AutomaticallySuspendInBackground``` option). +- If the app comes back to the foreground and GCDWebServer had been suspended, it will automatically resume itself and start accepting again new HTTP connections as if you had called ```-start```. + +HTTP connections are often initiated in batches (or bursts), for instance when loading a web page with multiple resources. This makes it difficult to accurately detect when the *very last* HTTP connection has been closed: it's possible 2 consecutive HTTP connections part of the same batch would be separated by a small delay instead of overlapping. It would be bad for the client if GCDWebServer suspended itself right in between. The ```GCDWebServerOption_ConnectedStateCoalescingInterval``` option solves this problem elegantly by forcing GCDWebServer to wait some extra delay before performing any action after the last HTTP connection has been closed, just in case a new HTTP connection is initiated within this delay. + +Logging in GCDWebServer +======================= + +Both for debugging and informational purpose, GCDWebServer logs messages extensively whenever something happens. Furthermore, when building GCDWebServer in "Debug" mode versus "Release" mode, it logs even more information but also performs a number of internal consistency checks. To enable this behavior, define the preprocessor constant ```DEBUG=1``` when compiling GCDWebServer. In Xcode target settings, this can be done by adding ```DEBUG=1``` to the build setting ```GCC_PREPROCESSOR_DEFINITIONS``` when building in "Debug" configuration. Finally, you can also control the logging verbosity at run time by calling ```+[GCDWebServer setLogLevel:]```. + +By default, all messages logged by GCDWebServer are sent to its built-in logging facility, which simply outputs to ```stderr``` (assuming a terminal type device is connected). In order to better integrate with the rest of your app or because of the amount of information logged, you might want to use another logging facility. + +GCDWebServer has automatic support for [XLFacility](https://github.com/swisspol/XLFacility) (by the same author as GCDWebServer and also open-source): if it is in the same Xcode project, GCDWebServer should use it automatically instead of the built-in logging facility (see [GCDWebServerPrivate.h](GCDWebServer/Core/GCDWebServerPrivate.h) for the implementation details). + +It's also possible to use a custom logging facility - see [GCDWebServer.h](GCDWebServer/Core/GCDWebServer.h) for more information. + +Advanced Example 1: Implementing HTTP Redirects +=============================================== + +Here's an example handler that redirects "/" to "/index.html" using the convenience method on ```GCDWebServerResponse``` (it sets the HTTP status code and "Location" header automatically): + +```objectivec +[self addHandlerForMethod:@"GET" + path:@"/" + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { + + return [GCDWebServerResponse responseWithRedirect:[NSURL URLWithString:@"index.html" relativeToURL:request.URL] + permanent:NO]; + +}]; +``` + +Advanced Example 2: Implementing Forms +====================================== + +To implement an HTTP form, you need a pair of handlers: +* The GET handler does not expect any body in the HTTP request and therefore uses the ```GCDWebServerRequest``` class. The handler generates a response containing a simple HTML form. +* The POST handler expects the form values to be in the body of the HTTP request and percent-encoded. Fortunately, GCDWebServer provides the request class ```GCDWebServerURLEncodedFormRequest``` which can automatically parse such bodies. The handler simply echoes back the value from the user submitted form. + +```objectivec +[webServer addHandlerForMethod:@"GET" + path:@"/" + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { + + NSString* html = @" \ + \ + \ + \ + "; + return [GCDWebServerDataResponse responseWithHTML:html]; + +}]; + +[webServer addHandlerForMethod:@"POST" + path:@"/" + requestClass:[GCDWebServerURLEncodedFormRequest class] + processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { + + NSString* value = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"value"]; + NSString* html = [NSString stringWithFormat:@"%@
", value]; + return [GCDWebServerDataResponse responseWithHTML:html]; + +}]; +``` + +Advanced Example 3: Serving a Dynamic Website +============================================= + +GCDWebServer provides an extension to the ```GCDWebServerDataResponse``` class that can return HTML content generated from a template and a set of variables (using the format ```%variable%```). It is a very basic template system and is really intended as a starting point to building more advanced template systems by subclassing ```GCDWebServerResponse```. + +Assuming you have a website directory in your app containing HTML template files along with the corresponding CSS, scripts and images, it's pretty easy to turn it into a dynamic website: + +```objectivec +// Get the path to the website directory +NSString* websitePath = [[NSBundle mainBundle] pathForResource:@"Website" ofType:nil]; + +// Add a default handler to serve static files (i.e. anything other than HTML files) +[self addGETHandlerForBasePath:@"/" directoryPath:websitePath indexFilename:nil cacheAge:3600 allowRangeRequests:YES]; + +// Add an override handler for all requests to "*.html" URLs to do the special HTML templatization +[self addHandlerForMethod:@"GET" + pathRegex:@"/.*\.html" + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { + + NSDictionary* variables = [NSDictionary dictionaryWithObjectsAndKeys:@"value", @"variable", nil]; + return [GCDWebServerDataResponse responseWithHTMLTemplate:[websitePath stringByAppendingPathComponent:request.path] + variables:variables]; + +}]; + +// Add an override handler to redirect "/" URL to "/index.html" +[self addHandlerForMethod:@"GET" + path:@"/" + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { + + return [GCDWebServerResponse responseWithRedirect:[NSURL URLWithString:@"index.html" relativeToURL:request.URL] + permanent:NO]; + +]; + +``` + +Final Example: File Downloads and Uploads From iOS App +====================================================== + +GCDWebServer was originally written for the [ComicFlow](http://itunes.apple.com/us/app/comicflow/id409290355?mt=8) comic reader app for iPad. It allow users to connect to their iPad with their web browser over WiFi and then upload, download and organize comic files inside the app. + +ComicFlow is [entirely open-source](https://github.com/swisspol/ComicFlow) and you can see how it uses GCDWebServer in the [WebServer.h](https://github.com/swisspol/ComicFlow/blob/master/Classes/WebServer.h) and [WebServer.m](https://github.com/swisspol/ComicFlow/blob/master/Classes/WebServer.m) files. diff --git a/ios/Plugin/Pods/Manifest.lock b/ios/Plugin/Pods/Manifest.lock new file mode 100644 index 0000000..487d066 --- /dev/null +++ b/ios/Plugin/Pods/Manifest.lock @@ -0,0 +1,20 @@ +PODS: + - Capacitor (0.0.8): + - CapacitorCordova (= 0.0.8) + - GCDWebServer (~> 3.0) + - CapacitorCordova (0.0.8) + - GCDWebServer (3.4.2): + - GCDWebServer/Core (= 3.4.2) + - GCDWebServer/Core (3.4.2) + +DEPENDENCIES: + - Capacitor + +SPEC CHECKSUMS: + Capacitor: 36a275e2fd85b69a2cb9633e8920ecf5c5aab88d + CapacitorCordova: cf26a9b075eb1f339118c920a975e4ff9e403193 + GCDWebServer: 8d67ee9f634b4bb91eb4b8aee440318a5fc6debd + +PODFILE CHECKSUM: 57e6d463d83fe9e2081ca17be52456b12c5e148c + +COCOAPODS: 1.4.0 diff --git a/ios/Plugin/Pods/Pods.xcodeproj/project.pbxproj b/ios/Plugin/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6fcec1f --- /dev/null +++ b/ios/Plugin/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1463 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 043E6E9889071AAC35E5E72CCC26838E /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = AE78DEC8F31FAC6412386627F406AB18 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09EB1BF1776A906E5F882FC2EC132C92 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EF743E3EFC44782809FD45EBBB3C5D7B /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09FE3A3409FC54A7DAE6C25E1879DDB7 /* Pods-Plugin-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D42DDF74C6DC607FBF6095BF3900279 /* Pods-Plugin-dummy.m */; }; + 0B5081DF930592B7F7C438C068ED482E /* CAPPluginCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9610DF35490929B49416B3952981F2DF /* CAPPluginCall.swift */; }; + 0C73050F432F69AE6F8CDD5733282C00 /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = F9210BC97271D8E0DD8E23122AB217AF /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0DC0A2F86F02A337CD17736BA5DB8319 /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 238A87C710B2E382669EF89E7BD90B4A /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0F288F27D3A53E980FEBA303603ADF9D /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = B45C7E23315CD2925B568D70EE4EEA6D /* Network.swift */; }; + 10F0E288C848B9198AF9F458E6C83954 /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B34240BC52510E60D907544050EF81 /* Device.swift */; }; + 15E0EE338DA0037C05F6AAA61C83274D /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E6F9161A8CCA1441E8469B038FE571F /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1BC48A6CF72447C92CC2FEA464C26EE7 /* Diagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B5420B7A889DCE3FC1FABEC7D9645CF /* Diagnostics.swift */; }; + 1BF0170BA802C0ED323E504461BACCF0 /* DevMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C2825426A14B887A7F7FDB3F5DCF76 /* DevMode.swift */; }; + 1DA33F4C5137B8CA2DD3AE44EC1F0631 /* CAPPluginMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 19BCB1A1FD335D990F01037601CAC061 /* CAPPluginMethod.m */; }; + 1DDA06F0C75E5A21ACCBFF1F36BDC87F /* CAPPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = DA84790577AF703CD2A0751AB24A0D24 /* CAPPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 20403F4DE5E6B41098E276FDF2E91E8F /* CapacitorCordova-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 49DB4966E0F97B7B96357A69D700F9B9 /* CapacitorCordova-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21F21A4F2FCB403EF0DE3FAB3F49AFF8 /* Clipboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD4BB483303ED0597AF56A057FEDD5 /* Clipboard.swift */; }; + 275DBDE456DF7FDAFA2E252F5D136E9E /* Share.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09AE8D94243526194A70A6301C888049 /* Share.swift */; }; + 2B507CF8B7556050B28441172CA1DA75 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 99EE9AE4B273D740BFFB44DE08B20B29 /* GCDWebServer-dummy.m */; }; + 2C2DC089098BC4886AAF7850A1F7B77B /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = F6448305DFF5F42C21664CC58AD8BDA2 /* CDVPlugin.m */; }; + 2C835A9222C22DD76B2500FCE816E469 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7824BB651B215467415382C9FD7D74 /* Foundation.framework */; }; + 2F3DBAEA8252E28C952DA191C848FF4D /* JSExport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA9896FC5B5AAAEA746F2E7ED6E9C40 /* JSExport.swift */; }; + 2F3EFB912B078E5BEBD5C6F956D9CAA2 /* JS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588BBEECAEE7F33F243247203FBB61CF /* JS.swift */; }; + 2F893645A50B732A9A36933230D56CA2 /* Pods-PluginTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62492EEBA85C43145E6425D5017914C1 /* Pods-PluginTests-dummy.m */; }; + 39C0034EA5999011D40A4CD49BE3DE4B /* Pods-PluginTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 327F5533726B8C7DAA70FB982C097983 /* Pods-PluginTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3A069564DCC9253515B21EE9628C07E5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7824BB651B215467415382C9FD7D74 /* Foundation.framework */; }; + 3BEB4AB2C590B15F4E8FD6A39244DCEA /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 82931A51A703F596E4D0DEEEDAB480DE /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D65F0D0A48C244A07E13BFF1839CFD6 /* CAPPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 36749BB2DE670E26DAB219959D328A39 /* CAPPlugin.m */; }; + 3FFD4DFDB81169A3CB7069C5D2E5FCF5 /* Keyboard.m in Sources */ = {isa = PBXBuildFile; fileRef = 12189FB9C617CDB5D9C31761440281F6 /* Keyboard.m */; }; + 4058FB98EED742291A20F1FE76551465 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AA878A1E75B490410375B1B5287808C /* Toast.swift */; }; + 44395BD8EB08535F9A73096B004906A3 /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 04049DDC3199BED1378FF9A3792F1503 /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 44565DD3D720CA7A3345A545F177C67B /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1FDD8808DEE290ECBCA2118240BF2A /* CDVPluginResult.m */; }; + 46920A032FED74A322E909D4D01F07CF /* Capacitor.h in Headers */ = {isa = PBXBuildFile; fileRef = E5053102A6830FCD2DE509CE4AEE23F2 /* Capacitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 49841AD16EB4501EB30C9A41002FF939 /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = EE85B786E92578FD3AB175811675C60E /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51303982C97E58544753A8EB2EE9C474 /* DefaultPlugins.m in Sources */ = {isa = PBXBuildFile; fileRef = 97D3D80F7055D878F5DB641702305946 /* DefaultPlugins.m */; }; + 529ED6BDD27B4EB3B874042C436F1973 /* Pods-Plugin-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CAFDD613F87959EF5EA9D8441E437C53 /* Pods-Plugin-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53225541FE1EFAC3B95DA67C0C6EAFBE /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40919191DFA7768380316D30CDCE8676 /* MobileCoreServices.framework */; }; + 560734159E292543F01623E8EF30F6FC /* CAPPluginMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 42D45A2531ADA3CECEAC0D240D5F91F0 /* CAPPluginMethod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 57F6D06F5F2D74F654190A8813F811F0 /* CAPPluginCall.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE4BD3F889D0E13502A278849A7C797 /* CAPPluginCall.m */; }; + 5A06C00862B8DBE9C1C9200013BD88A8 /* CAPNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76049AD5317753BC253577A9F7CEAC64 /* CAPNotifications.swift */; }; + 5F0C483D1D41FDBBFD344CA5A2EDCAC7 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2A98410DC8078BEA40A0B8E978A2AB2 /* App.swift */; }; + 60A3229749A6FA08ADB00363BB8EB9BF /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20A3E93DE3EEE832C44E9D4781175DA2 /* UIColor.swift */; }; + 616B13BF360B016934F0BF0AEB27AA76 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27A2B496D8EF37BCD5B0AA6CCF40534E /* WebKit.framework */; }; + 6338DE8191573141F7FFD7B864E6F3B8 /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EE85AA0BE3B16D2640143DD9F189D32 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 68DA69B4293D2F46B37A19D4E3995308 /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = BBB6E9ABF35760779A4FB444BF92A1C6 /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69691E6439A017FBA8A514F8B9D309D4 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E6FD2397BDC6E76D6C81299E796BEB1 /* CFNetwork.framework */; }; + 6BAB40AA93ADB79B575494EDBA8F0BE3 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = D5A38E9892C04A876C0164E71474A36C /* GCDWebServerFileResponse.m */; }; + 6BBD2C94FA0A8FCF85C644F3DCFC6B80 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = D9A050690A26CF7F3C24B4E759787DB5 /* CDVInvokedUrlCommand.m */; }; + 6C40FC1FBE78F4640335C07F540B96C9 /* CAPPluginCall.h in Headers */ = {isa = PBXBuildFile; fileRef = BBA548A0D2272B6F0B39A9DDF30DD3AE /* CAPPluginCall.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6CA2DD4AE85905D9E45A50955FC047B5 /* DocLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B18D6F6DB61087D1C8006A06F7211E /* DocLinks.swift */; }; + 6CAAE99014BD7E6F44D9860D44FCF9C8 /* CAPFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 609D6981E5053956F296DE8393B76191 /* CAPFile.swift */; }; + 6CB900534DF395C6601A1F8B8174DE7C /* PushNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 211167FC38351DBDC84E0BFE1DF84E0A /* PushNotifications.swift */; }; + 6D17D5CAC54227E1DAE04F3BE7DD20B8 /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = B0DB5BC19FEC623F1CBE34C0199ECEDF /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E21D9576D486B45EA11E4FF703780A8 /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = A79C4821C18E2A369BA6455D8603438E /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E7F25F09B84381BBA36271087ED4BED /* Keyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = 35C6C5571A00AD3E7AADB4BD297CFB43 /* Keyboard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E854AC59BE60B56AC936036E06B44E0 /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = B4CB6A2A62642506A01015CE92E3130D /* CDVCommandDelegateImpl.m */; }; + 6F135094028F0A6E46F57BFDE9B42266 /* Camera.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74F69335AFC1D5B550C3431AB716524B /* Camera.swift */; }; + 6F4D1476A9ADCB6392F88A1B7859AD8E /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C3BD6C463BE375744D2A29BA6DDB76D /* GCDWebServerStreamedResponse.m */; }; + 6FC75817C8971D747DC663F012C893E0 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = CA990B810AF10F64B436AD0B84D41796 /* GCDWebServerFileRequest.m */; }; + 708AD5084381D27FF7982E2E36128925 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 108E16699B2DEF9AE07F4AEF5869B5F5 /* GCDWebServerDataRequest.m */; }; + 748D0E506BCB9164402093890274DED6 /* CapacitorCordova-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CDAE721290D5B06658B72653632BA75 /* CapacitorCordova-dummy.m */; }; + 76EAC3CBDD4A45CF9081E75E67F0593D /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D378C9779249975BC5502F824BB89D6 /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 77FF3D25D6B1FA613EF83AA41178B2C7 /* Modals.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4351079B6819DF4A70FA313A2F10851 /* Modals.swift */; }; + 78938767D0EA7F0B7F053570738E834C /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 04342480E00183EB8B7DF0F04924BD14 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7AF590661E39B6828A3192E4C61B4B65 /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = E3B22768445D10142B0DDA3F75AC0812 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7B3F12E3B58ED7028EE4B29BD83F8D3A /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 275047C91568D2AF1897AF07F7D77565 /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED4D5453E24ED78A3472B1C3CD97872 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B4952B06145AE4353FFC75980CAA95C6 /* GCDWebServerConnection.m */; }; + 7F999640850C5FDBDE12791E39D4D884 /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A98051B2698EA6C7EAB9472FF42403D /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 81BA50EF46280A6C468244D6CC6DC1C6 /* CapacitorCordova.h in Headers */ = {isa = PBXBuildFile; fileRef = 8070C34BD15568D6408180CA44ECB25D /* CapacitorCordova.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 87098BA586B1F09D72F014493C050550 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 7108676AEBBFAE3FBCE594D7CC6C117C /* GCDWebServerErrorResponse.m */; }; + 8D7549946638DE6F6BDAE007BB0DB955 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E05D8A2AB0E460046F834FADD254ED /* Reachability.swift */; }; + 8D7B7C6B41A3F6B9A1E1BA5134FAB428 /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CB2B21928DA7C37D4754B267DF0EA3D /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E19C32F6247A29B39590464B1572B20 /* Accessibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7711B8DC62351443F0F43D18776B1B2 /* Accessibility.swift */; }; + 8E2AC03CCB7B0B15CCECD4D469A86FC9 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E3587CEB5BF4FAF5826471F7BC556A /* GCDWebServerResponse.m */; }; + 8EB4782A89D9AFD7D43D6B4F20736F57 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = AF3336C40A175E543EEA23581AAFE2E3 /* GCDWebServer.m */; }; + 9082666CACBC16B3CC555BD6FF7CFC81 /* Filesystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E3DAB02A329213574DBE627B18A699 /* Filesystem.swift */; }; + 9426B26DA4DBFB33D748A0F243AB04DC /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = A8EEC7D6E5AD006BE212D95EF5C9BD38 /* CDVCommandDelegateImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 960DDC45908F39283323BD09994A9434 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = A29E4BDC8AE640DD7FDF3490470F4C69 /* GCDWebServerDataResponse.m */; }; + 96DE6C36300A1B5B48040A32409FDBDB /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = AC0C427DC9FE1666F936B93F02AF95A4 /* GCDWebServerMultiPartFormRequest.m */; }; + 987EB65A3AF1FF11F07D2AB1253039AA /* CAPBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3799B8DA50F2C533A3260E4C4AA910BD /* CAPBridge.swift */; }; + 9C14F4B190D99DCAA09E4CC70468C34C /* Browser.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA4457CB1931C8A064CA7B4FCC374057 /* Browser.swift */; }; + 9CF024FDB0468F5C2DDF06EA5E3F3A2B /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E47F2F9A3113BDA943C95B07AB7ED996 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A50D54AA115920DAD039EAE4FEFDF868 /* CAPBridgedPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 55A450907DD961C2FF87FCC172220EC5 /* CAPBridgedPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A8430ADDE070336A355BC1C96068738A /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = D8603AA4EB45CA3564F764F2A9A0FC33 /* GCDWebServerURLEncodedFormRequest.m */; }; + AF75C7CE199061BEE9387CA3AF930412 /* Photos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D976BA285F7072CF018E099A9D7A08F /* Photos.swift */; }; + AFFCCFB13C9B3F76E8B677BC5B33E0F5 /* Cordova.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FFA934BBE4F908F8AAD2BB97C6AF57EE /* Cordova.framework */; }; + B1C30C80711C37521C41AA46B9AEFE81 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7824BB651B215467415382C9FD7D74 /* Foundation.framework */; }; + B6C9E6799DAB16CF49183936BC21A4B0 /* CAPBridgeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1069FC7E2B0FA3AE12A99F00918214 /* CAPBridgeViewController.swift */; }; + BF4690A69C1B90064044C2B2B29D25A7 /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 887CDCB2893FCBC4C7FF0F38E6DCD1DE /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1E54E25CB130740EFA7C711B06EFB73 /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = A59F65DEE3B97CADB06AFD91E58A6FFF /* GCDWebServerFunctions.m */; }; + C3BA481ED5EDC3F1B9D45B1A54875BB1 /* GCDWebServer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFD774900038CE0528FF325FD921FA45 /* GCDWebServer.framework */; }; + C51CC67DE4D57F92667322D20468E197 /* CAPBridgedPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = C74EB5177B24EC3318FED2296261B214 /* CAPBridgedPlugin.m */; }; + C72B67F6F8C7538BA359A751236F6EAB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7824BB651B215467415382C9FD7D74 /* Foundation.framework */; }; + CCF6EAC8B78069231C94691365FA4F57 /* Haptics.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44FB442BE53E458D9F5841840A6FDE4 /* Haptics.swift */; }; + CD065EB5F8347DB027A249C99D7117C4 /* Geolocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 762E64B1BD1544A9DB3C4C1AE8CC42D9 /* Geolocation.swift */; }; + D3B2C6EAD0A87BCE0478E985A21125CD /* Capacitor-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E6867ACA691CA87AA35DCA16A20B3D2C /* Capacitor-dummy.m */; }; + D90ECA4AAA4A402BCD1C517F37D0915A /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = E924A2F0AEFB4D1081CC0CBD1EBEB6C1 /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DB1E729BF4D02B3E687CF18686DD2FD6 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = C9F2F7377CE8409EC28F618B4CEEB6AE /* GCDWebServerRequest.m */; }; + DB995C36E84724AF729FA6B62DA1F6C1 /* GCDWebServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = F4B5F4EB0D2EFF225ACF6A25DCD3B715 /* GCDWebServerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + DBA11829B9248732CD4542D884C55CA4 /* Console.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B6217A8910534212456385840DBA64 /* Console.swift */; }; + DBB67EB853BB43E3D122CA5465AB0DE6 /* LocalNotifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9970A99A443305EE5D03F344F836A1B1 /* LocalNotifications.swift */; }; + E07AA4482FBEF3CAFA1DC211593AAF26 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7824BB651B215467415382C9FD7D74 /* Foundation.framework */; }; + E943E0AF33B124F40CFDC464F2249C11 /* SplashScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D7F8BEAB3EA5DBC78ECBD446E30493A /* SplashScreen.swift */; }; + EFC9A030D2F6AD974C166A6D2A6C4DCD /* DefaultPlugins.h in Headers */ = {isa = PBXBuildFile; fileRef = EC4B73DF383A3AD5A7988D295F98D834 /* DefaultPlugins.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FAA7816DF46AF9C96F037CC794177B7E /* Capacitor-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 15C99E7A03943AC5BEE1EAF3E0F1BB1A /* Capacitor-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FC0A97AF36AF3E76BE2698C867FA0C89 /* StatusBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 792ECE5D4A3610A91BA4A130981FF308 /* StatusBar.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 09A6C757E3A045EB962DED1B709C7895 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = F2C6209A9A06614635020AABB22C60A2; + remoteInfo = CapacitorCordova; + }; + 19E99F21FE7682C87EC8433510CB98F1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0D6BF964562CED21242461655F87C79A; + remoteInfo = GCDWebServer; + }; + 37107F2799C1A363FCE4F115333D56F0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = ECB48E98E0984198BBC4F65095530F94; + remoteInfo = Capacitor; + }; + 3D4C7DB4A3B64685AD2AA89117BC60F6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = F2C6209A9A06614635020AABB22C60A2; + remoteInfo = CapacitorCordova; + }; + 4E1AA4BC1611389AC010AB84C698F9F2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = F2C6209A9A06614635020AABB22C60A2; + remoteInfo = CapacitorCordova; + }; + 7A10114D4601FFC9F0865ECA596CAADD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = ECB48E98E0984198BBC4F65095530F94; + remoteInfo = Capacitor; + }; + CB1E80C9C57203C2F44F2A00B3DC250B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0D6BF964562CED21242461655F87C79A; + remoteInfo = GCDWebServer; + }; + EF86EF2C55C8C2D75C8377A435F99F5C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0D6BF964562CED21242461655F87C79A; + remoteInfo = GCDWebServer; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 04049DDC3199BED1378FF9A3792F1503 /* GCDWebServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServer.h; path = GCDWebServer/Core/GCDWebServer.h; sourceTree = "