Look familiar? Recently, we sometimes found ourselves trapped in a loop of fixing bugs instead of creating new features for the iPad app. Software development is hard. To deliver the highest quality software in the industry and continually evolve, we need to pay back the technical debt we incurred by adopting automatic tests.
To write unit tests for the legacy code base, we need to refactor the design objects and architecture to make them testable first. Fortunately, in addition to writing unit tests against classes, we can write tests for UI interaction against the whole app. As long as we have good coverage from the UI surface down to the app, we can then refactor the legacy code inside the app later without worrying too much about breaking it. The UI testing runner launches the target app and uses the accessibility infrastructure to inspect and control the app.
To test our app, we need to control the data returned from the API client object, but as they are two standalone processes, you cannot control in-memory values directly from one process to another. Then replace the API and set the mock data to return:. Despite that you cannot mock the API directly like what you do for unit testsyou can pass environment variables and arguments to the target app when you launch it like this:.
With that in mind, our first approach was to write a mock API client that mocks API calls according to environment variables. Passing environment variables and mocking the API function is easy and works, but there are many drawbacks to this approach:. We looked around to find open source HTTP servers written in Swift, but since Swift is a relatively new programming language and Apple just open sourced it a while ago, the resources for server-side Swift were very limited.
And there are things you cannot do or hard to do, like in-line assertion in the API response handler just right inside the test case. It decouples web applications from the implementation details of the web server and also allows middleware to be wrapped around other web applications.
It should be able to get the provisioned JSON payload, which looks like this:. To avoid writing the handlers for the same endpoints again and again, we provide a DefaultRouter that has decent default handler build-in, like so:. You also need to make it read from the environment variable.
Finally, you can now write test cases with mocked APIs:. You simply overwrite the endpoint, you can assert and whatever you want in the response handler. One good thing about bringing embedded web servers inside UI tests is that you can also mock other services, like PubNubwe use it to allow server to notify the iPad app for certain events. This way, the test cases can push a message to the app whenever they want.
As the iPad app supports badge printingwe also created a protocol for badge printer and created a mock client connecting to an HTTP API endpoint for printer instead of real printer.
This means we can examine the printed document from the iPad. As a language, Swift was introduced mainly for building iOS apps and desktop apps. Currently, there are limited resources available, but we see huge potential in bringing server side technology into the Swift community. The SWSGI gateway interface we defined for Embassy demonstrates how the server side ecosystem can be built on top of it. If you also enjoy building cool stuff and solving hard problems, Envoy is hiring.
Here are the open engineering positions:. Ruby Backend Engineer. Sign in. Engineering Data Science. Embedded web server for iOS UI testing. Fang-Pen Lin Follow.
Envoy Engineering How Envoy does engineering. Thanks to Linmiao Xu.Want to run a simple web server off of an iPad or iPhone? If you have iSH linux shell running in iOS then you can easily start and run a simple web server directly from an iPhone or iPad. By running iSH and starting a web server with python 3 you can then serve either HTML files or a directory listing to the same device via localhost, or to anyone on the same network with the iOS devices IP address.
Adding a Server-Side Component to Your Mobile App
Example screenshot shows the iOS device IP of If you know of any other interesting or geeky solutions for setting up a web server or web sharing natively with an iOS device, share with us in the comments! Enjoy this tip? Subscribe to the OSXDaily newsletter to get more of our great Apple tips, tricks, and important news delivered to your inbox! Enter your email address below:. What do I need to do in order to allow the web server to be access via WAN?
Question 1: How safe is this? MAMP for Mac is similar. WOW, this is very cool. Is there any way to link or access filed stored in icloud, google drive etc from the command line? Name required. Mail will not be published required. All Rights Reserved.
Reproduction without explicit permission is prohibited. Yousef zalkha says:. October 27, at am. JD says:.Sometimes you need to use a web service that someone else has written, and sometimes you need to use one of your own! This tutorial is the second and final part of a two part series on custom web services. If you are curious how to develop the web service yourself, check out the first part of the series for full details! This tutorial assumes you have basic familiarity with programming for iOS.
If you are new to iOS development, you may wish to check out some of the other tutorials on this site first. You also have to make a basic UI for the app so the user can enter in a code to redeem. Are you like this guy? If so, then just download this starter project with the libraries pre-integrated and the UI pre-made and skip the next two sections :].
To add the JSON frameworkfirst download it from its github page. The last step is you need to link your project against a few required frameworks.
Click the plus button in this section, and choose CFNetwork. Then repeat this for SystemConfiguration. As a refresher, the web service takes three parameters:. So click on PromoTestViewController. Then double click the text view and delete all the text inside, and optionally change the background color of the UITextField to clear in the Attributes Inspector. Also, you need to connect the text view to an outlet so you can set it later. Then select the Text View and control-drag a line from the text view down to right above the end keyword, set Connection tou Outlet, the Name to textView, and click Connect, as you can see in the screenshot below.
Finally, open PromoTestViewController. Compile and run your app, tap the text field, enter a code, and tap the return button, and you should see a message in your console output similar to the following:. Otherwise, good progress so far DIYer! As you can see — very simple, following the steps outlined above. Finally, implement the requestFinished and requestFailed callbacks to log out the results:.
This simply checks for the error codes that we expect from our web service, and prints a message for each. Here is where you could grant the user with whatever special content you might want to give them in your app. Compile and run your code, and this time a nice progress indicator should appear while the request is running! One of my favorite things about this system is it allows for unlimited codes.
Which was great as people used a code I gave out on Twitter alone thanks again for checking it out and all the RTs guys, you rule! I also put some codes in some threads on some various iOS forums, our mailing list for Razeware, our Facebook pages, etc. People redeemed the codes most often on Twitter or the Cocos2D forums which makes sense, as my friends such as yourself hang out therethen on the Razeware mailing list which also makes sense, since if people subscribe to that they must be interested in our products.
You can implement this by creating a login system or such, but that was overkill for what I wanted to do. Now that you have first-hand experience creating both a simple web service and an app that communicates with it from scratch, you can take the ideas here and create your own web services that do anything you need for your app! If you have any questions about communicating with a web service from an iPhone app, questions about the promo code system, or advice for others in this matter, please join the forum discussion below!
The raywenderlich.There are use cases, however, that require running server-side applications on iOS. To run a server-side application on iOS means embedding its code in a plain client-side iOS app.
Subscribe to RSS
Until now, developers had to produce two different server-side implementations to support running server-side applications on iOS. However, it is not simple to run Java or Node. A server-side Swift web framework provides the opportunity to prevent this duplication of effort.
I read about some of the use cases presented below while googling about iOS web servers. Some of the scenarios were proposed by my colleagues. Some of the use cases just came to mind. I guess there could be more scenarios for iOS server-side applications. I would be happy to hear your ideas.
This use case is the most obvious one.
Once your server-side code can run on iOS, you can run unit tests for your server-side code in Xcode together with your client-side unit tests. You can put breakpoints in both parts of your application and then step back and forth between the client and the server parts.
In addition, you could create a mockup server for iOS and use the mockup server before the real server is developed. You can also run the mockup server in an Xcode playground. Running a web server on iOS can enable offline mode in a simple way — just run your server side code as part of your iOS app. By using a mobile embedded database, you can have a full-fledged web server inside your iOS app. Your app may opt to fall back on the embedded web server when it is disconnected from the network.
The client-side part could communicate with your local server through a localhost URL. The networking code of the iOS app could remain untouched; only the address of the server will be replaced.
The app can synchronize a local iOS database replica with the remote database automatically, once the device is connected to the Internet. Alternatively, you can synchronize the local data explicitly at some preferred, later point in time. Furthermore, some databases facilitate synchronization between the local and the remote replicas for you.
Naturally, using the network stack for offline mode could have performance overhead, compared to the traditional offline mode implementations. However, the simplicity of the implementation could be a strong factor in favor of a local iOS backend. The local iOS backend can be used for offline demos. You are not sure that your device will have network connectivity at the demonstration site elevator pitch anyone?
Furthermore, your app may encounter firewall issues. When you present at a conference, you cannot know if the wireless network will be reliable and fast enough for your app to function properly. By using a local iOS backend, you can take your server on your device with you, always ready for demonstrations. An additional use case involves the peer-to-peer communication of iOS devices on a local network, over protocols on top of TCP, e.
The caveat here is that currently you cannot run arbitrary iOS application code in the background mode. Once your screen is locked, or the user switches to some other app, your server code will stop.
You will have to ensure that your peer-to-peer apps run in the foreground. You can do it by enabling Guided Access mode on your iOS device. See the next use case for an explanation about Guided Access mode.
Another use case is an ad-hoc client-server topology. Suppose you implement an app for employee collaboration.
The dark mode beta is finally here. Change your preferences any time. Stack Overflow for Teams is a private, secure spot for you and your coworkers to find and share information. It seemed like a web service is running on the iOS device. Just display the devices IP address, open a socket for listening in an app running on the iOS device, and implement the http protocol.
There are several 3rd party libraries that can do most of the heavy lifting for you:. Like answered before the best choice is to use a 3rd party library for this. Learn more. Asked 8 years, 8 months ago. Active 3 years, 1 month ago. Viewed 56k times. Bonjour only used for network discovery.
What solution did you use, and how was your experience? Active Oldest Votes. Sure, but you would have to find or write your dynamic server in Swift or Obj C and the server would have to run inside the same process with the same background permissions as the iOS app.
You have to change a define in an included source file to be able to change it from the default one, which points to NSHomeDirectory. As of now the MongooseDaemon library contains warnings about deprecated methods used within the Objective-C wrapper.
Patrick Hofman k 18 18 gold badges silver badges bronze badges. Patrik Patrik 1, 11 11 silver badges 20 20 bronze badges. MongooseDaemon is also a good choice. Vanguarder Vanguarder 3 3 silver badges 8 8 bronze badges. Seems to be a file server.GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. If nothing happens, download GitHub Desktop and try again. If nothing happens, download Xcode and try again. If nothing happens, download the GitHub extension for Visual Studio and try again.
It was written from scratch with the following goals in mind:. You can also use Carthage by adding this line to your Cartfile 3. For bug reports and enhancement requests you can use issues in this project.
This lets users upload, download, delete files and create directories from a directory inside your iOS app's sandbox using a clean user interface in their web browser. GCDWebServer includes a built-in handler that can recursively serve a directory it also lets you control how the "Cache-Control" header should be set :.
Note that you can have multiple web servers running in the same app as long as they listen on different ports. Then you add one or more "handlers" to the server: each handler gets a chance to handle an incoming web request and provide a response. Handlers are called in a LIFO queue, so the latest added handler overrides any previously added ones. GCDWebServer relies on "handlers" to process incoming web requests and generating responses.
Handlers are implemented with GCD blocks which makes it very easy to provide your own. However, they are executed on arbitrary threads within GCD so special attention must be paid to thread-safety and re-entrancy. Here's an example:. Advanced asynchronous version The handler returns immediately a streamed HTTP response which itself generates its contents asynchronously:. Note that you can even combine both the asynchronous and advanced asynchronous versions to return asynchronously an asynchronous HTTP response!
When doing networking operations in iOS apps, you must handle carefully what happens when iOS puts the app in the background. 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. HTTP connections are often initiated in batches or burstsfor 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. 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. 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.
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:.Monitis Mobile app offers access to the leading web and cloud monitoring solutions that include website monitoring, cloud monitoring, real end-user monitoring, web page monitoring, internal server and network monitoring. With Monitis Mobile you can: - View the current status of all your web applications.
The app could be faster and have more function but it's much better than loading the website in my iPhone. Love monitis! The app is an ugly web app which disregards every iOS UI guidelines. Navigating the different screens is awkward. The whole experience lacks. I never looked forward to using this app but rather dreaded it. The iPad version needs landscape, I never use my iPad in portrait mode. The back animation is backwards. This app feels like a safari webapp not a native app.
Requires iOS 6. Compatible with iPhone, iPad, and iPod touch. App Store Preview. Screenshots iPhone iPad. Description Monitis Mobile app offers access to the leading web and cloud monitoring solutions that include website monitoring, cloud monitoring, real end-user monitoring, web page monitoring, internal server and network monitoring. Jun 28, Version 3. Ratings and Reviews See All. Size Category Utilities. Compatibility Requires iOS 6. Languages English. Price Free.