A little and powerful iOS framework for intercepting HTTP/HTTPS Traffic.

Overview

Atlantis: Debug iOS with ease

A little and powerful iOS framework for intercepting HTTP/HTTPS Traffic from your app. No more messing around with proxy, certificate config.

Version Carthage compatible Platform Twitter Join the chat at https://gitter.im/Proxyman-app/community License

Features

  • Automatically intercept all HTTP/HTTPS Traffic with ease
  • Capture WS/WSS Traffic from URLSessionWebSocketTask
  • No need to config HTTP Proxy, Install or Trust any Certificate
  • Support iOS Physical Devices and Simulators
  • Review traffic log from macOS Proxyman app (Github)
  • Categorize the log by project and devices.
  • Only for Traffic Inspector, not for Debugging Tools
  • Ready for Production

Atlantis: Debug iOS with ease

How to use

  1. Install Atlantis by CocoaPod or SPM, then starting Atlantis

By default, Bonjour service will try to connect all Proxyman app in the same network:

  • If you have only ONE MacOS machine that has Proxyman. Let use the simple version:
import Atlantis

// Add to the end of `application(_:didFinishLaunchingWithOptions:)` in AppDelegate.swift or SceneDelegate.swift
Atlantis.start()
  • If there are many Proxyman apps from colleague's Mac Machines, and you would Atlantis connects to your macOS machine. Let use Atlantis.start(hostName:) version
import Atlantis

// Add to the end of `application(_:didFinishLaunchingWithOptions:)` in AppDelegate.swift or SceneDelegate.swift
Atlantis.start(hostName: "_your_host_name")

You can get the hostName from Proxyman -> Certificate menu -> Install for iOS -> Atlantis -> How to Start Atlantis -> and copy the HostName

Proxyman screenshot

  • If your project uses Objective-C
#import "Atlantis-Swift.h"

// Add to the end of `application(_:didFinishLaunchingWithOptions:)` in AppDelegate
[Atlantis startWithHostName:nil];
  1. Make sure your iOS devices/simulator and macOS Proxyman are in the same Wifi Network or connect your iOS Devices to Mac by a USB cable
  2. Open macOS Proxyman (or download the lasted here) (Github)(2.11.0+)
  3. Open your iOS app and Inspect traffic logs from Proxyman app
  4. Enjoy debugging ❤️

Requirement

  • macOS Proxyman app 2.11.0+
  • iOS 11.0+ / macOS 10.12+ / Mac Catalyst 11.0+
  • Xcode 11+
  • Swift 5.0+

Required Configuration for iOS 14+

From iOS 14, it's required to add NSLocalNetworkUsageDescription and NSBonjourServices to your info.plist

  • Open Info.plist file and adding the following keys and values:
<key>NSLocalNetworkUsageDescriptionkey>
<string>Atlantis would use Bonjour Service to discover Proxyman app from your local network.string>
<key>NSBonjourServiceskey>
<array>
    <string>_Proxyman._tcpstring>
array>

Install

CocoaPod

  • Add the following line to your Podfile
pod 'atlantis-proxyman'

Swift Packages Manager

  • Add https://github.com/ProxymanApp/atlantis to your project by: Open Xcode -> File Menu -> Swift Packages -> Add Package Dependency...

Carthage

  1. Add to your Cartfile
github "ProxymanApp/atlantis"
  1. Run carthage update
  2. Drag Atlantis.framework from your project
  3. Create a Carthage Script as the Carthage guideline

For Carthage with Xcode 12, please check out the workaround: https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md

WS/WSS Traffic

From Atlantis 1.9.0+, Atlantis is capable of capturing all WS/WSS Traffic, which is made by URLSessionWebSocketTask, and send to Proxyman app. You don't need to config anything, it works out of the box.

Advanced Usage

By default, if your iOS app uses Apple's Networking classes (e.g URLSession or NSURLConnection) or using popular Networking libraries (e.g Alamofire and AFNetworking) to make an HTTP Request, Atlantis will work OUT OF THE BOX.

However, if your app doesn't use any one of them, Atlantis is not able to automatically capture the network traffic.

To resolve it, Atlantis offers certain functions to help you manually* add your Request and Response that will present on the Proxyman app as usual.

1. My app uses C++ Network library and doesn't use URLSession, NSURLSession or any iOS Networking library

You can construct the Request and Response for Atlantis from the following func

    /// Handy func to manually add Atlantis' Request & Response, then sending to Proxyman for inspecting
    /// It's useful if your Request & Response are not URLRequest and URLResponse
    /// - Parameters:
    ///   - request: Atlantis' request model
    ///   - response: Atlantis' response model
    ///   - responseBody: The body data of the response
    public class func add(request: Request,
                          response: Response,
                          responseBody: Data?) {
  • Example:
@IBAction func getManualBtnOnClick(_ sender: Any) {
    // Init Request and Response
    let header = Header(key: "X-Data", value: "Atlantis")
    let jsonType = Header(key: "Content-Type", value: "application/json")
    let jsonObj: [String: Any] = ["country": "Singapore"]
    let data = try! JSONSerialization.data(withJSONObject: jsonObj, options: [])
    let request = Request(url: "https://proxyman.io/get/data", method: "GET", headers: [header, jsonType], body: data)
    let response = Response(statusCode: 200, headers: [Header(key: "X-Response", value: "Internal Error server"), jsonType])
    let responseObj: [String: Any] = ["error_response": "Not FOund"]
    let responseData = try! JSONSerialization.data(withJSONObject: responseObj, options: [])
    
    // Add to Atlantis and show it on Proxyman app
    Atlantis.add(request: request, response: response, responseBody: responseData)
}

2. My app use GRPC

You can construct the Request and Response from GRPC models:

    /// Helper func to convert GRPC message to Atlantis format that could show on Proxyman app as a HTTP Message
    /// - Parameters:
    ///   - url: The url of the grpc message to distinguish each message
    ///   - requestObject: Request Data for the Request, use `try? request.jsonUTF8Data()` for this.
    ///   - responseObject: Response object for the Response, use `try? response.jsonUTF8Data()` for this.
    ///   - success: success state. Get from `CallResult.success`
    ///   - statusCode: statusCode state. Get from `CallResult.statusCode`
    ///   - statusMessage: statusMessage state. Get from `CallResult.statusMessage`
    public class func addGRPC(url: String,
                                 requestObject: Data?,
                                 responseObject: Data?,
                                 success: Bool,
                                 statusCode: Int,
                                 statusMessage: String?,
                                 HPACKHeadersRequest: [Header]?,
                                 HPACKHeadersResponse: [Header]?){
  • Example:
Void) { _ = try? client.insert(note, completion: { (createdNote, result) in // Add to atlantis and show it on Proxyman app Atlantis.addGRPC(url: "https://my-server.com/grpc", requestObject: try? note.jsonUTF8Data(), responseObject: try? createdNote.jsonUTF8Data(), success: result.success, statusCode: result.statusCode.rawValue, statusMessage: result.statusMessage) }) } ">
// Your GRPC services that is generated from SwiftGRPC
private let client = NoteServiceServiceClient.init(address: "127.0.0.1:50051", secure: false)

// Note is a struct that is generated from a protobuf file
func insertNote(note: Note, completion: @escaping(Note?, CallResult?) -> Void) {
    _ = try? client.insert(note, completion: { (createdNote, result) in
    
        // Add to atlantis and show it on Proxyman app
        Atlantis.addGRPC(url: "https://my-server.com/grpc",
                         requestObject: try? note.jsonUTF8Data(),
                         responseObject: try? createdNote.jsonUTF8Data(),
                         success: result.success,
                         statusCode: result.statusCode.rawValue,
                         statusMessage: result.statusMessage)
    })
}

FAQ

1. How does Atlantis work?

Atlantis uses Method Swizzling technique to swizzle certain functions of NSURLSession and NSURLConnection that enables Atlantis captures HTTP/HTTPS traffic on the fly.

Then it sends to Proxyman app for inspecting later.

2. How can Atlantis stream the data to the Proxyman app?

As soon as your iOS app (Atlantis is enabled) and the Proxyman macOS app are the same local network, Atlantis could discover the Proxyman app by using Bonjour Service. After the connection is established, Atlantis will send the data via Socket.

3. Is it safe to send my network traffic logs to the Proxyman app?

It's completely safe since your data is locally transferred between your iOS app and the Proxyman app, no Internet is required. All traffic logs are captures and send to the Proxyman app for inspecting on the fly.

Atlantis and Proxyman app do not store any of your data on any server.

4. What kind of data that Atlantis capture?

  • All HTTP/HTTPS traffic from your iOS apps, that integrate the Atlantis framework
  • Your iOS app name, bundle identifier, and small size of the logo
  • iOS devices/simulators name and device models.

All the above data are not stored anywhere (except in the memory). It will be wiped out as soon as you close the app.

They are required to categorize the traffic on the Proxyman app by project and device name. Therefore, it's easier to know where the request/response comes from.

Troubleshooting

1. I could not see any request from Atlantis on Proxyman app?

For some reason, Bonjour service might not be able to find Proxyman app.

=> Make sure your iOS devices and the Mac are in the same Wifi Network or connect to your Mac with USB Cable

=> Please use Atlantis.start(hostName: "_your_host_name") version to explicitly tell Atlantis connect to your Mac.

2. I could not use Debugging Tools on Atlantis's requests?

Atlantis is built for inspecting the Network, not debugging purpose. If you would like to use Debugging Tools, please consider using normal HTTP Proxy

Credit

License

Atlantis is released under the Apache-2.0 License. See LICENSE for details.

Comments
  • Atlantis not connecting to Proxyman

    Atlantis not connecting to Proxyman

    My Mac and iPhone are connected to the same network and are connected by a USB cable. However, when launching an app with Atlantis inside, it is unable to find Proxyman in the network, even if I specify hostname. It connects successfully only if I:

    1. Launch the app for the first time. Atlantis successfully connects upon giving local network permission.
    2. I put the app to background for a second or longer. Atlantis successfully connects upon reopening the app.

    The issue was not present about 2 months ago, when I last used this awesome tool!

    opened by shgew 14
  • Carthage can't build 1.18.2

    Carthage can't build 1.18.2

    I successfully build with 1.18.1 but 1.18.2 can't build with carthage

    Console: xcodebuild timed out while trying to read Atlantis-Example-App.xcodeproj 😭

    carthage 0.38.0 (installed with brew to m1 mac) macOS 12.4 Xcode 13.4.1 Xcode build version: Xcode 13.4.1 Build version 13F100 Command: carthage update --use-xcframeworks --cache-builds

    opened by ttuygun 8
  • Atlantis.start() produces EXC_BAD_ACCESS

    Atlantis.start() produces EXC_BAD_ACCESS

    With Atlantis 1.16.0 and Xcode 13.3.1, running Atlantis.start() sometimes produces a EXC_BAD_ACCESS error (in NetworkInjector:injectAllURLConnection() function). The error does not occur with Xcode 13.3.0.

    bug Done 
    opened by valentinperignon 8
  • Assertion Failure when using file URLs

    Assertion Failure when using file URLs

    I get this assertion failure when using file URLs.

    Fatal error: Only support HTTPURLResponse: file Atlantis/Packages.swift, line 209
    

    It can be reproduced with this code in an iOS app.

    if let url = Bundle.main.url(forResource: "Info", withExtension: "plist") {
      let task = URLSession.shared.downloadTask(with: url)
      task.resume()
    }
    

    In our app, many resources are retrieved from a web server, while some are bundled in the app. For a specific kind of resource, we want to use the same implementation for web and bundled file, which uses URLSessionDownloadTask. It would be helpful if this assertionFailure is removed.

    opened by kenjitayama 8
  • Could not find module 'Atlantis' for target 'x86_64-apple-ios-simulator'; found: arm64-apple-ios-simulator

    Could not find module 'Atlantis' for target 'x86_64-apple-ios-simulator'; found: arm64-apple-ios-simulator

    I'm trying to import Atlantis into my project but getting the error:

    Could not find module 'Atlantis' for target 'x86_64-apple-ios-simulator'; found: arm64-apple-ios-simulator, at: /Users/.../Index.noindex/Build/Products/Debug-iphonesimulator/Atlantis.swiftmodule
    

    I am integrating this using SPM in a project that also contains Cocoapods.

    • M1 Pro
    • Atlantis 1.18.2
    • Xcode Version 14.1 (14B47b)
    • Building for simulator iPhone 14 Pro 16.0
    opened by ptrkstr 5
  • Assertion failure in _swizzleURLSessionDataTaskDidReceiveResponseForIOS13AndLater

    Assertion failure in _swizzleURLSessionDataTaskDidReceiveResponseForIOS13AndLater

    Version: 1.2.0 (d918263) integrated using SPM. Device: Simulator running iOS 13.0.

    This happens in NetworkInjector+URLSession.swift:82, due to a failed safe-check in this line:

    if let task = me.value(forKey: "task") as? URLSessionDataTask
    

    The response URL is starting with https://app-measurement.com/config/app/.... So most likely, this is a request sent by Firebase SDK (namely Firebase Remote Config feature).

    Some LLDB info:

    po me.value(forKey: "task") as? URLSessionDataTask

    nil
    

    po type(of: me.value(forKey: "task")!)

    __NSCFLocalDownloadTask
    

    po dump(me.value(forKey: "task")!)

    - LocalDownloadTask <20850171-C07B-4A76-9195-08F62CCB7ACC>.<1> #0
      - super: __NSCFLocalSessionTask
        - super: __NSCFURLSessionTask
          - super: NSURLSessionTask
            - super: NSObject
    LocalDownloadTask <20850171-C07B-4A76-9195-08F62CCB7ACC>.<1>
    
    p me.value(forKey: "task")!
    Any) $R96 = {
      payload_data_0 = 0x00007fe1e4601ce0 {
        base__NSCFLocalSessionTask@0 = {
          base__NSCFURLSessionTask@0 = {
            baseNSURLSessionTask@0 = {
              baseNSObject@0 = {
                isa = __NSCFLocalDownloadTask
              }
              _nw_activity_ivar = nil
              _metrics_ivar = 0x000060000191c360
              earliestBeginDate = nil
              _private_nw_activity = nil
              __taskGroup = 0x00007fe1e4503dc0
            }
            _cachedSocketStreamProperties = 0x0000600003d52780
            _httpConnectionInfoCompletionBlock = nil
            _taskIdentifier = 1
            _taskDescription = nil
            _loggableDescription = 0x0000600001ea0af0 "Task <20850171-C07B-4A76-9195-08F62CCB7ACC>.<1>"
            _originalRequest = some {
              some = 0x0000600003f09930 {
                baseNSURLRequest@0 = {
                  baseNSObject@0 = {
                    isa = NSMutableURLRequest
                  }
                  _internal = 0x0000600000606f20
                }
              }
            }
            _currentRequest = some {
              some = 0x0000600003f31850 {
                baseNSURLRequest@0 = {
                  baseNSObject@0 = {
                    isa = NSMutableURLRequest
                  }
                  _internal = 0x000060000060e2f0
                }
              }
            }
            _response = some {
              some = 0x0000600003c205c0 {
                baseNSURLResponse@0 = {
                  baseNSObject@0 = {
                    isa = NSHTTPURLResponse
                  }
                  _internal = 0x0000600001640460
                }
                _httpInternal = 0x0000600003c20200
              }
            }
            _countOfBytesClientExpectsToSend = -1
            _countOfBytesClientExpectsToReceive = -1
            _countOfBytesReceived = 0
            __countOfPendingBytesReceivedEncoded = 0
            __countOfBytesReceivedEncoded = 0
            _countOfBytesSent = 0
            _countOfBytesExpectedToSend = 0
            _countOfBytesExpectedToReceive = -1
            _state = 0
            _error = nil
            _startTime = 626263406.09285104
            __TCPConnectionMetadata = nil
            _TLSNegotiatedCipherSuite = 4865
            _priorityHint = 0.5
            _priorityValue = 300
            _loadingPriorityValue = 0.5
            _bytesPerSecondLimitValue = 0
            _expectedProgressTargetValue = 0
            _backgroundTransactionMetrics = nil
            _legacySocketStreamProperties = nil
            _cfHSTS = 0x0000000000000000
            _cfCache = 0x0000000000000000
            _cfCreds = 0x0000000000000000
            _cfCookies = 0x0000000000000000
            _cachePolicy = 1
            _timeoutInterval = 60
            _timeoutIntervalForResource_ivar = 60
            _proxySettings = nil
            _sslSettings = 0x0000600003d51ea0
            _cookieAcceptPolicy = 2
            _contentDispositionFallbackArray = nil
            _networkServiceType = 0
            _qos = 9
            _voucher = nil
            _suspensionThreshhold = 524288
            _boundInterfaceIdentifier = nil
            _allowedProtocolTypes = 0
            _requestPriority = -1
            _expectedWorkload = 0
            _timeWindowDelay = 0
            _timeWindowDuration = 0
            _uniqueIdentifier = 0x0000600003c364e0
            _powerAssertion = 0
            _darkWakePowerAssertion = 0
            _effectiveConfiguration = 0x0000600003f096c0
            _protocolForTask = nil
            _authenticator = nil
            _storagePartitionIdentifier = nil
            _parentDocumentURL = nil
            _siteForCookies = nil
            _dependencyInfo_ivar = 0x0000600003c3acc0 1 key/value pair
            _DuetActivityProperties = nil
            _dependencyTree = nil
            _taskDependency = nil
            _pathToDownloadTaskFile = nil
            _trailers = nil
            _discretionaryOverride = 0
            _appleIDContext = nil
            _progress = nil
            _uploadProgress = nil
            _downloadProgress = nil
            _publishingURL = nil
            _backgroundPublishingURL = nil
            _APSRelayTopic = nil
            _extractor = nil
            _extractorFinishedDecoding = false
            _hasSZExtractor = false
            _doesSZExtractorConsumeExtractedData = false
            _shouldSkipPreferredClientCertificateLookup = false
            _cacheOnly = false
            _preventsSystemHTTPProxyAuthentication = false
            _requiresSecureHTTPSProxyConnection = false
            _preventsAppSSO = false
            _appSSOFallback = false
            _shouldPipelineHTTP = false
            _shouldUsePipelineHeuristics = false
            _shouldSkipPipelineProbe = false
            _shouldHandleCookies = true
            _isTopLevelNavigation = false
            _prohibitAuthUI = false
            _strictContentLength = true
            _connectionIsCellular = false
            _disallowCellular = false
            _allowsCellular = true
            _allowsExpensiveOverride = 0
            _allowsConstrainedOverride = 0
            _allowsCellularOverride = 0
            _isInUpload = false
            _undeterminedUploadProgressState = false
            _undeterminedDownloadProgressState = false
            _progressReportingFinished = false
            _allowsQUIC = false
            _preventsIdleSystemSleep = false
            _preconnect = false
            _authenticatorConfiguredViaTaskProperty = false
            _seenFirstResume = true
            _atsStateCache = 0x00006000023a5700
            _connectionIsCompanionLink = false
            _extractorPreparedForExtraction = false
          }
          _cfConn = 0x000060000086f840
          _uploadFile = nil
          _dataTaskData = nil
          _dataTaskCompletion = nil
          _pendingResponseBytes = nil
          _suspendCount = 0
          _async_initialization = nil
          _resourceTimeout = some {
            some = 0x0000600001318a80 {
              baseOS_dispatch_object@0 = {
                baseOS_object@0 = {
                  baseNSObject@0 = {
                    isa = OS_dispatch_source
                  }
                }
              }
            }
          }
          _startTimeoutTime = 0
          _startTimeoutTimer = nil
          _payloadTransmissionTimer = nil
          _willSendRequestTimer = nil
          _socketReadStreamForUpgrade = nil
          _socketWriteStreamForUpgrade = nil
          _extraBytes = nil
          _connectionWorkQueue = nil
          _connectionWorkQueueSuspensionCount = 0
          _pendingResponseDisposition = false
          _pendingResponseDisposition_didFinish = false
          _didIssueWaitingForConnectivity = false
          _didIssueDidFinish = false
          _suspendedForDisposition = false
          _didCheckMixedReplace = true
          _isMixedReplace = false
        }
        _fileCompletion = nil
        _downloadFile = 0x000060000060e080
        _writeBuffer = nil
        _ioSuspend = 0
        _totalWrote = 0
        _resumeCallback = nil
        _initialResumeSize = -1
        _originalResumeInfo = nil
        _transientWriteProgress = 0
        _afterDidReportProgressOnQueue = nil
        _dataAckCompletion = nil
        _seqNo = 0
        _canWrite = true
        _suppressProgress = false
        _needFinish = false
        _didIssueNeedFinish = false
      }
      payload_data_1 = 0x000000010e8e5a00
      payload_data_2 = 0x00007fe1e4879628
      instance_type = 0x00007fe1e4879628
    
    bug Done 
    opened by advantis 5
  • Failing to capture request body

    Failing to capture request body

    I'm trying to replace the proxy setup with Atlantis but it's not capturing most of the request bodies. Doing the same request over and over again, it was only the request body for a couple of them.

    image

    Using the latest version via SPM. Running on a physical device with iOS 14.2.1.

    bug 
    opened by hpinhal 4
  • Is it possible to allow installing atlantis on < iOS 12?

    Is it possible to allow installing atlantis on < iOS 12?

    Thanks for developing atlantis, however our project's deployment version is still iOS 11. Is it possible to allow installing atlantis on < iOS 12? Without functioning on older version is okay but only allow it to install (Maybe adding some #available flags?) on projects that deployment version are still on older versions

    enhancement Done 
    opened by JohnnyTseng 4
  • Atlantis uses huge amounts of memory if Proxyman isn't running

    Atlantis uses huge amounts of memory if Proxyman isn't running

    We have Atlantis in our app, and the app receives a lot of web socket messages. If Proxyman isn't running, all these messages (and any other network requests) get appended to pendingPackages here: https://github.com/ProxymanApp/atlantis/blob/main/Sources/Transporter.swift#L95

    There seems to be no limit on the size of this array, so this will continue until the app runs out of memory, or Proxyman is launched.

    It would be great to have an option to disable the storing of pending packages, so if you don't have Proxyman running, these packages are just lost, and you only start seeing new data in Proxyman from the moment you start it.

    Done 
    opened by mluisbrown 3
  • Missing release notes for v1.8.0

    Missing release notes for v1.8.0

    Hi, I saw that the 1.8.0 release was pushed yesterday. Is it possible to ensure that release notes are added to those releases? Given the nature of what Atlantis does its helpful to be able to distribute that as a link to our team.

    https://github.com/ProxymanApp/atlantis/releases/tag/1.8.0

    opened by justin 3
  • Map Local does not work when using Atlantis on device

    Map Local does not work when using Atlantis on device

    Hi!

    I’m using Atlantis and everything seems to setup correctly, I can see all the traffic from the device etc, but when I try to map a response nothing happens. In this example a replaced the status code but when I re run the app nothing gets mapped. Same map local works as expected in the simulator. Screenshot 2021-04-05 at 15 09 55

    opened by johanthorell 3
  • Doesn't see WebSocket traffic with SocketRocket library

    Doesn't see WebSocket traffic with SocketRocket library

    Hello,

    I'm using SocketRocket library on my iOS client app. I've also installed Atlantis.

    This way, on desktop Proxyman I can see all HTTPS requests made from my iOS app. However, I don't see any WebSocket requests, the tab is just empty in Proxyman.

    I tried using URLSessionWebSocketTask and the WebSocket requests are correctly displayed in Proxyman.

    Could you suggest what might be an issue with SocketRocket and how to fix it?

    opened by mmatiush 1
  • [Bug] Atlantis on iOS 16 could not connect to Proxyman macOS app due to

    [Bug] Atlantis on iOS 16 could not connect to Proxyman macOS app due to "Connection reset by peer"

    Description

    If we use Atlantis on an iOS 16 Physical device, most of the time the Atlantis service cannot successfully connect to Proxyman macOS app.

    Always get the following error:

    [Atlantis] ❌ Connection to Proxyman app is failed, error=POSIXErrorCode(rawValue: 54): Connection reset by peer
    

    Reason: We suspect that NSNetServiceBrowser is deprecated, so it might not work on iOS 16. NSNetServiceBrowser is a legacy framework for Bonjour Connection.

    To workaround, use the iOS 16 Simulator.

    Steps to Reproduce

    1. Use iOS 16 physical device and integrate Atlantis framework
    2. Start the app

    Current Behavior

    1. Observe that the connection is failed ❌

    Expected Behavior

    • The connection should work

    Environment

    • App version: Proxyman 3.13.0 + Atlantis 1.19.0
    • macOS version: macOS Monterey
    Done 
    opened by NghiaTranUIT 1
  • duplicated connection working in an office

    duplicated connection working in an office

    hi, me and my colleagues are experiencing duplicated connections from atlantis to Proxyman when we are working at the office. Thus, we receive the same network request multiple times with the exact same time, duration etc.

    I couldn't find the root of the issue, but filtering in NetServiceTransport#connectToService(_ service: NetService) also gets the job done. Maybe it could be a change to be considered for a future release. Let's see if I manage to create a PR

    A problem could be that with that change devices which have the same name couldn't connect both over the network to atlantis

    bug Done 
    opened by chrisknapp98 12
  • Atlantis is conflicting with my URLProtocol

    Atlantis is conflicting with my URLProtocol

    The Atlantis library has been really useful because I couldn't get a working setup with just the Proxyman macOS app due to VPN issues (though have just managed to hopefully finally resolve that by using the allow-list!) and Alantis actually managed to get network logs working!

    But there were some quirks regarding how Atlantis intercepts the network traffic and my app's own networking complexities conflicted (both use URLProtocol). It basically meant that the network logs weren't showing an accurate or stable picture of what was conceptually happening.

    Largely this was down to my networking code intercepting looking for specific error responses to requests within my URLProtocol and then replaying the request differently to get a successful response (relating to handling custom authentication challenges).

    I've put together a simple sample app that illustrates the difference between using Atlantis and not in this sort of scenario: AtlantisTest.zip

    The sample app sends a request that gets a 404 response, catches that in my URLProtocol and then makes another request that gets a 200 and reports that result to the request that made the 404 request. So the original request doesn't know about the replay, but gets the result that it really wanted (it's a simplified example so might not make a huge amount of sense!)

    Without Atlantis without atlantis.proxymanlog.zip Screenshot 2022-08-05 at 15 35 40 Just see the two requests, with IDs ordered the same as their timestamps, which is what I'd hope for as this is the reality

    With Atlantis with atlantis.proxymanlog.zip Screenshot 2022-08-05 at 15 35 06 See four requests, with IDs that don't match the order of the timestamps. This obviously makes it hard to look at exported network logs and make sense of what was really going on.

    Not sure if there's a huge amount that can be done about this though! Even if I register my URLProtocol before or after starting Atlantis the result is the same.

    opened by ChrisMash 1
  • Doesn't compile with Xcode 14 beta 2

    Doesn't compile with Xcode 14 beta 2

    title says it all; there's no reason you have to make it work, but you're going to have to sooner than later. We compile with 'warnings as errors' on - not sure if this was just warnings or errors, but bottom line, it breaks our build.

    bug Done 
    opened by doncl 5
Releases(1.20.0)
  • 1.20.0(Nov 19, 2022)

  • 1.19.0(Nov 8, 2022)

  • 1.18.2(Jul 28, 2022)

  • 1.18.1(Jul 16, 2022)

  • 1.18.0(Jun 28, 2022)

  • 1.17.0(May 10, 2022)

  • 1.16.0(Feb 24, 2022)

  • 1.15.0(Dec 22, 2021)

    What's new

    • Add isRunningOniOSPlayground to bypass the Safety check for the Bonjour Service (https://github.com/ProxymanApp/atlantis/pull/92)
    • Able to integrate Atlantis to Swift Playground (iOS and macOS)
    Source code(tar.gz)
    Source code(zip)
  • 1.14.0(Dec 14, 2021)

    What's new

    • Remove all Objective-C code and refactor with Swift. It refactors how Atlantis can capture WS/WSS traffic. Credit to @VaslD https://github.com/ProxymanApp/atlantis/pull/91
    Source code(tar.gz)
    Source code(zip)
  • 1.13.0(Nov 22, 2021)

    Changelog

    • Maintain multiple connections to Proxyman app: From now, Atlantis will connect to all available Proxyman and broadcast the data to all connections (Unless we specify the hostname) #72
    • Use NWConnection instead of URLSessionStreamTask
    • Bump to iOS 13, tvOS 13, macOS 10.15 as a minimum OS
    Source code(tar.gz)
    Source code(zip)
  • 1.12.0(Oct 23, 2021)

    What's new

    • Simple Example App that works with Proxyman + Atlantis
    • Fix UI Background check when receiving the macOS app icon
    • Remove unnecessary files
    Source code(tar.gz)
    Source code(zip)
  • 1.11.2(Jul 7, 2021)

  • 1.11.1(Jul 2, 2021)

  • 1.11.0(Jun 30, 2021)

  • 1.10.0(Jun 4, 2021)

  • 1.9.0(Apr 23, 2021)

  • 1.8.0(Apr 9, 2021)

  • 1.7.1(Jan 22, 2021)

  • 1.7.0(Jan 22, 2021)

    What's new

    • Add new Atlantis APIs
    • Introduce Atlantis Delegate to notify new request/response
    • A flag to disable the Transport Layer (Bonjour)

    Ticket: #52

    Source code(tar.gz)
    Source code(zip)
  • 1.6.0(Jan 21, 2021)

  • 1.5.0(Dec 23, 2020)

  • 1.4.3(Dec 1, 2020)

  • 1.4.2(Nov 26, 2020)

  • 1.4.1(Nov 19, 2020)

  • 1.4.0(Nov 11, 2020)

    What's new:

    • Able to manually add Request and Response to Atlantis and show the log on Proxyman app (if your app doesn't use URLSession, NSURLConnection, or using GRPC) #36
    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Nov 5, 2020)

  • 1.2.0(Nov 4, 2020)

    What's new

    • Able to tell Atlantis to connect to which particular macOS machine (Proxyman is opening). It's useful if there are multiple Proxyman apps in the same network (e.g. in the company)
    • Add more useful logs
    • Support multiple Atlantis device on Proxyman app

    Screen_Shot_2020-11-04_at_21_13_49

    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Nov 1, 2020)

    What's new:

    • Stable version of Atlantis 1.1.0: Able to intercept HTTP/HTTPS Traffic from URLSession or NSURLConnection
    • Inspect Request/Response from Proxyman app without config HTTP Proxy, Install or Trust any Certificate
    • Use Bonjour Service to discover the Proxyman app
    • Compress the Request/Response content with gzip to reduce the size and increase performance
    • Install Atlantis via CocoaPod, Swift Package Manager or Carthage

    Screen_Shot_2020-10-29_at_17_04_29

    Source code(tar.gz)
    Source code(zip)
Owner
Proxyman
Modern and Delightful Web Debugging Proxy for macOS, iOS and Android ⚡️
Proxyman
Http - Demo for Http Layer

http Example To run the example project, clone the repo, and run pod install fro

null 0 Jan 24, 2022
📡 RealHTTP is a lightweight yet powerful client-side HTTP library.

RealHTTP RealHTTP is a lightweight yet powerful client-side HTTP library. Our goal is make an easy to use and effortless http client for Swift. Featur

Immobiliare Labs 233 Jan 7, 2023
Little project I wrote a while ago I decided to clean up and upload.

ImageSearch About The project uses the Pixabay (https://pixabay.com/) API to show images relating to entered text. The app is built using an MVVM arch

Jay Bennett 0 Dec 7, 2021
❌📱 A little swift Internet error status indicator using ReachabilitySwift

EFInternetIndicator Requirements Xcode 8.0+ iOS 8.3+ WARNING : It's not work on simulator. #1 Installation CocoaPods You can use CocoaPods to install

Ezequiel França 131 Dec 14, 2022
Swift/Obj-C HTTP framework with a focus on REST and JSON

Now Archived and Forked PMHTTP will not be maintained in this repository going forward. Please use, create issues on, and make PRs to the fork of PHMT

Postmates Inc. 509 Sep 4, 2022
A Swift web framework and HTTP server.

A Swift Web Framework and HTTP Server Summary Kitura is a web framework and web server that is created for web services written in Swift. For more inf

Kitura 7.6k Jan 6, 2023
libuv base Swift web HTTP server framework

Notice Trevi now open a Trevi Community. Yoseob/Trevi project split up into respective Trevi, lime, middlewares and sys packages at our community. If

leeyoseob 46 Jan 29, 2022
Lightweight, flexible HTTP server framework written in Swift

Hummingbird Lightweight, flexible server framework written in Swift. Hummingbird consists of three main components, the core HTTP server, a minimal we

Hummingbird 245 Dec 30, 2022
A Concise HTTP Framework in Swift

NetKit A Concise HTTP Framework in Swift. Requirements NetKit requires Swift 5.0 and Xcode 10.2 Installation CocoaPods You can use CocoaPods to integr

Aziz Uysal 4 Apr 23, 2019
QwikHttp is a robust, yet lightweight and simple to use HTTP networking library for iOS, tvOS and watchOS

QwikHttp is a robust, yet lightweight and simple to use HTTP networking library. It allows you to customize every aspect of your http requests within a single line of code, using a Builder style syntax to keep your code super clean.

Logan Sease 2 Mar 20, 2022
Minimalistic Swift HTTP request agent for iOS and OS X

Agent Table of Contents Introduction Usage HTTP Verbs Overloading Method Chaining Response Closure Verbs Methods NSMutableURLRequest Contributing Lice

null 589 Jun 29, 2022
A frida tool that capture GET/POST HTTP requests of iOS Swift library 'Alamofire' and disable SSL Pinning.

FridaHookSwiftAlamofire A frida tool that capture GET/POST HTTP requests of iOS Swift library 'Alamofire' and disable SSL Pinning. 中文文档及过程 Features Ca

neilwu 69 Dec 16, 2022
iONess is HTTP Request Helper for iOS platform used by HCI iOS App

iONess iONess (iOS Network Session) is HTTP Request Helper for the iOS platform used by Home Credit Indonesia iOS App. It uses Ergo as a concurrent he

OSFE Homecredit Indonesia 1 Mar 28, 2022
A simple GCD based HTTP client and server, written in 'pure' Swift

SwiftyHTTP Note: I'm probably not going to update this any further - If you need a Swift networking toolset for the server side, consider: Macro.swift

Always Right Institute 116 Aug 6, 2022
Easy to use CFNetwork wrapper for HTTP requests, Objective-C, Mac OS X and iPhone

ASIHTTPRequest is an easy to use wrapper around the CFNetwork API that makes some of the more tedious aspects of communicating with web servers easier

Ben Copsey 5.8k Dec 14, 2022
Cross-platform JsonRPC client implementation with HTTP and WebSocket support

JsonRPC.swift Cross-platform JsonRPC client implementation with HTTP and WebSocket support Getting started Installation Package Manager Add the follow

Tesseract 5 Oct 19, 2022
Deal with query items, HTTP headers, request body and more in an easy, declarative way

Reusable system for complex URL requests with Swift. Deal with query items, HTTP headers, request body and more in an easy, declarative way. Check out our engineering blog to learn more!

Parable Health 19 Sep 5, 2022
Super lightweight async HTTP server library in pure Swift runs in iOS / MacOS / Linux

Embassy Super lightweight async HTTP server in pure Swift. Please read: Embedded web server for iOS UI testing. See also: Our lightweight web framewor

Envoy 540 Dec 15, 2022
Extensible HTTP Networking for iOS

Bridge Simple Typed JSON HTTP Networking in Swift 4.0 GET GET<Dict>("http://httpbin.org/ip").execute(success: { (response) in let ip: Dict = respo

null 90 Nov 19, 2022