NetworkKit is a reusable Swift Package that provides a clean, scalable, and production-ready network abstraction for Apple platforms.
It supports:
Alamofire-backed networking withasync/await- Standardized request, upload, and download methods
- Multipart form data support
- Request interception and retry logic
- Progress tracking for long-running operations
- Thread-safe access patterns and dependency injection
- iOS 15+
- macOS 12+
- Swift 6.2+
In Xcode:
- Go to File > Add Packages...
- Enter your repository URL for
NetworkKit - Select the version/range and add the package
Or in Package.swift:
dependencies: [
.package(url: "https://github.com/Coderkube-App/NetworkKit.git", from: "1.0.0")
],
targets: [
.target(
name: "YourApp",
dependencies: [
.product(name: "NetworkKit", package: "NetworkKit")
]
)
]NetworkKit/
├── Sources/NetworkKit/
│ ├── Core/
│ ├── Models/
│ ├── Service/
│ ├── Resources/
│ └── NetworkKit.swift
├── Tests/NetworkKitTests/
└── Package.swift
public protocol NetworkProtocol {
func request<T: Decodable & Sendable>(_ url: URLConvertible, method: HTTPMethod, parameters: Parameters?, encoding: ParameterEncoding, headers: HTTPHeaders?, interceptor: RequestInterceptor?) async throws -> T
func upload<T: Decodable & Sendable>(_ url: URLConvertible, method: HTTPMethod, multipartFormData: @escaping (MultipartFormData) -> Void, headers: HTTPHeaders?, interceptor: RequestInterceptor?, onProgress: (@Sendable (Double) -> Void)?) async throws -> T
func download(_ url: URLConvertible, method: HTTPMethod, parameters: Parameters?, encoding: ParameterEncoding, headers: HTTPHeaders?, interceptor: RequestInterceptor?, to destination: DownloadRequest.Destination?, onProgress: (@Sendable (Double) -> Void)?) async throws -> URL
}let service = NetworkKit.shared.service
let response: MyModel = try await service.request("https://api.example.com/data")let service = NetworkKit.shared.service
// GET Request
let users: [User] = try await service.request("https://api.example.com/users")
// POST Request with parameters
let params = ["name": "Vijay", "job": "Developer"]
let newUser: User = try await service.request(
"https://api.example.com/users",
method: .post,
parameters: params,
encoding: JSONEncoding.default
)let service = NetworkKit.shared.service
let result: UploadResponse = try await service.upload(
"https://api.example.com/upload",
multipartFormData: { formData in
formData.append(imageData, withName: "file", fileName: "avatar.jpg", mimeType: "image/jpeg")
formData.append("user_123".data(using: .utf8)!, withName: "userId")
},
onProgress: { progress in
print("Upload progress: \(progress * 100)%")
}
)let service = NetworkKit.shared.service
let localURL = try await service.download(
"https://api.example.com/large-file.zip",
onProgress: { progress in
print("Download progress: \(progress * 100)%")
}
)let retryInterceptor = RetryInterceptor(retryLimit: 3)
let networkKit = NetworkKit(interceptor: retryInterceptor)
let data: MyModel = try await networkKit.service.request("https://api.example.com/data")NetworkError provides shared error types:
invalidURLserverError(statusCode:data:)decodingFailednoInternetConnectiontimeoutalamofireError(AFError)
Run tests:
swift testThis repository uses a GitHub Actions workflow to automatically create version tags and GitHub Releases after changes are merged into main.
Version bump rules:
fix:or other non-breaking commits -> patch bump (x.y.Z)feat:-> minor bump (x.Y.0)BREAKING CHANGEin the commit body or footer -> major bump (X.0.0)
The workflow runs from .github/workflows/automated-versioning.yml and generates release notes automatically for each new version.
- Protocol-driven architecture for flexibility
- Dependency injection support for testability
- Thread-safe implementation using structured concurrency
- Built-in support for Alamofire features (Interceptors, Parameter Encoding)
This project is licensed under the MIT License.