Skip to content

0.6.0

Latest

Choose a tag to compare

@ipinfo-ci-bot ipinfo-ci-bot released this 28 Jul 14:03

Changed

  • BREAKING: Rename NetworkInterface to NetworkPath.Interface across public APIs, including Device.interfaceInfo, InterfaceInfoClient, TracerouteClient, and the InterfaceMonitor Wi-Fi/VPN/Ethernet/Cellular dependency factories
  • BREAKING: Replace the top-level TracerouteProbe and TracerouteError with nested Traceroute.Probe (now carrying an ID and Response) and Traceroute.Error
  • BREAKING: TracerouteClient.traceroute is now async throws and yields enriched Traceroute.Probe values
  • BREAKING: Replace the stored InterfaceInfoClient.live and TracerouteClient.live values with factory functions: InterfaceInfoClient.live(interface:) and TracerouteClient.live(device:bundleInfo:logger:)
  • BREAKING: IPInfoAPIClient.lookup now threads request headers through the call
  • BREAKING: Remove the path parameter from InterfaceMonitor.init
  • Device and all of its accessor closures are now @Sendable
  • Deprecate Traceroute.Probe.probeIndex in favor of index

Added

  • Ping API with configurable host, timeout, and interval, emitting Reply values (Response/Error) as an async sequence
  • Hopscotch DNS.hostname(for:timeout:) reverse-DNS resolution
  • Enriched traceroute: Traceroute.hops
  • String.isPrivateIPAddress for classifying IP-address strings
  • CellularNetwork.interfaceNetwork, backed by a new NetworkInterface.Network enum
  • Sendable, Codable, Hashable, and Equatable conformances across Traceroute, Device, PathMonitor, CellularNetwork, IPInfoResponse, and the traceroute/ping error types

Removed

  • BREAKING: Remove the public traceroute property and its initializer from IPInfoHeaders

Fixed

  • Add an explicit import HTTPClient in RetryConfiguration so the pre-built XCFrameworks compile under the MemberImportVisibility upcoming feature. SwiftPM source builds were unaffected; only XCFramework distribution builds failed to archive

Changed

  • BREAKING: NetworkInfo and InterfaceData protocols now require Sendable conformance.
  • Add Sendable conformance to built-in NetworkInfo and InterfaceData conformers

Added

  • Sendable conformances for public model types. This enables passing these types across actor boundaries without @preconcurrency workarounds

Changed

  • BREAKING: Rename IPInfoMonitor.InterfaceState to IPInfoMonitor.Interface. The new type exposes a .state property (.loading / .unavailable / .available(_:)) to enable exhaustive switching
  • BREAKING: Replace IPInfoMonitor.primaryInterfaceState and the async primaryInterface getter with a synchronous primaryInterface: Interface? that returns the first element of interfaces
  • BREAKING: IPInfoMonitor is now @MainActor-isolated. Per-interface monitors are created dynamically from NWPathMonitor updates instead of statically at initialization, and are reconciled to match the system's interface order
  • BREAKING: IPInfoMonitor.Dependencies now exposes per-type factory closures (makeWifiDependencies, makeVPNDependencies, makeEthernetDependencies, makeCellularDependencies) that receive a NetworkInterface, instead of static per-monitor dependency instances. This supports interface monitors being created on demand from NWPathMonitor updates. Most call sites can continue using IPInfoMonitor.Dependencies.live(logger:)
  • Forward the IPInfoMonitor logger to its per-interface monitors so SDK-wide logging configuration propagates correctly

Added

  • IPInfoMonitor.interfaces: [Interface] active interfaces ordered by the system's routing preference
  • Top-level NetworkInterface model exposing the underlying interface's name, type, and helpers (isVPN, isEthernet)
  • IPInfoMonitor.availableInterfaces: [NetworkInterface] available system interfaces without enrichment data, for diagnostic tools (ping, traceroute)
  • InterfaceMonitoring protocol for type-erased per-interface monitor storage
  • HTTPClient.Client.InterfaceBinding (.interfaceType(_:), .interface(_:)) and a bind: argument on request builders, allowing callers to route a request through a specific interface or interface type

Fixed

  • Crash when enabling logging from a widget extension on macOS, where NSApp is unavailable

Removed

  • BREAKING: PrimaryInterfaceState type. Use interfaces for the full list or primaryInterface for the highest-priority one

Fixed

  • Throw response code errors from IPInfoAPIClient so 429 retry logic works
    correctly

Changed

  • Use .otherNavigation as location activity type
  • Retry 429 response codes after one hour

Changed

  • BREAKING: Reduce public API surface — DeviceKit, AsyncAlgorithms, and NIOConcurrencyHelpers are now implementation details
  • BREAKING: Remove IPinfoKit type
  • BREAKING: Replace swift-log with built-in logger
  • Favor system APIs over AsyncDNSResolver dependency
  • Implement own HTTP types, replacing dependency
  • Relax dependency versions

Added

  • Canonical log lines for SDK debugging; single-line logs per request with IP version, application state, update reason, and request count
  • Support cellular interface on macOS
  • XCFramework build infrastructure for third-party distribution

Fixed

  • Report correct macOS model identifier and OS version in device headers

Added

  • Report Wi-Fi security type

Fixed

  • Fix SSID and BSSID being sent as empty strings instead of being omitted
  • Refresh Cloudflare traces that are older than an hour

Changed

  • Update location for each request

Added

  • Titanium module

Fixed

  • Report ethernet instead of VPN information for ethernet interface
  • Remove additional headers from traceroute requests

Removed

  • BREAKING: Remove reverse geocoding

Changed

  • Report interface type in traceroute header
  • Emit updates when IP hasn't changed

Fixed

  • Use hardware UUID as vendor identifier on macOS
  • Only start location monitoring after we're granted permission

Added

  • BREAKING: Add support for ethernet interfaces

Fixed

  • Bind traceroute to a specific interface

Changed

  • Only emit updates when data changes
  • Reduce redundant enrichments. Only update when IP address has changed

Changed

  • Use kernel timestamps (SO_TIMESTAMP) for traceroute RTT measurements instead of user-space timing, improving accuracy
  • Replace Swift-NIO with plain BSD sockets for traceroute implementation to improve performance

Added

  • swift run hopscotch compare to compare system and Hopscotch traceroute performance

Removed

  • Ping functionality (Ping.swift, PingResult) because it was using Swift-NIO and it wasn't worth the rewrite

Fixed

  • Ensure IP is updated after switching networks