A beautiful, professional SwiftUI library for showcasing your other apps from the App Store. Automatically fetches app metadata including icons, descriptions, ratings, and more from iTunes Search API.
- 5 Beautiful Layouts: Grid, List, Carousel, Featured, and Minimal
- Cross-Platform: iOS, macOS, watchOS, tvOS support
- Multiple Data Sources: JSON URLs, App Store URLs, or configuration objects
- Customizable: Colors, fonts, spacing, and more
- In-App App Store: SKOverlay integration for seamless app discovery (iOS 14+)
- Reliable Fallback: itms-apps:// URL scheme for older iOS versions
- Async Loading: Built with modern Swift concurrency
- Error Handling: Graceful error states and retry functionality
- Accessibility: Full VoiceOver and Dynamic Type support
Simple Usage - Light Mode | Simple Usage - Dark Mode |
---|---|
Grid Layout - Light Mode | Grid Layout - Dark Mode |
---|---|
List Layout - Light Mode | List Layout - Dark Mode |
---|---|
Featured Layout - Light Mode | Featured Layout - Dark Mode |
---|---|
Carousel Layout - Light Mode | Carousel Layout - Dark Mode |
---|---|
Minimal Layout - Light Mode | Minimal Layout - Dark Mode |
---|---|
- Simple Usage: Basic implementation with default settings
- Grid Layout: Perfect for showcasing multiple apps in App Store style
- List Layout: Detailed view with full descriptions and ratings
- Featured Layout: Highlight one app with others below in compact grid
- Carousel: Horizontal scrolling showcase for featured apps
- Minimal Layout: Clean, simple design with app icons and links
All layouts automatically adapt to system appearance settings, providing a seamless experience in both light and dark modes.
import SwiftUI
import OtherApps
struct ContentView: View {
var body: some View {
OtherAppsView.withUrls([
"https://apps.apple.com/us/app/cartoonify-me/id6747951776",
"https://apps.apple.com/us/app/instagram/id389801252"
])
}
}
OtherAppsView.withJsonUrl("https://yourwebsite.com/apps.json")
let config = AppsConfiguration(
apps: [
AppConfig(appStoreUrl: "https://apps.apple.com/us/app/cartoonify-me/id6747951776", featured: true),
AppConfig(appStoreUrl: "https://apps.apple.com/us/app/instagram/id389801252")
],
title: "My Amazing Apps",
subtitle: "Check out what I've built!"
)
OtherAppsView(configuration: config, layout: .featured)
// Grid layout (default)
OtherApps.view(urls: yourUrls, layout: .grid)
// Featured layout (first app highlighted)
OtherApps.view(urls: yourUrls, layout: .featured)
// List layout (detailed cards)
OtherApps.view(urls: yourUrls, layout: .list)
// Carousel (horizontal scrolling)
OtherApps.view(urls: yourUrls, layout: .carousel)
// Minimal layout (clean, simple design)
OtherApps.view(urls: yourUrls, layout: .minimal)
Create a JSON file on your website with this structure:
{
"title": "My Other Apps",
"subtitle": "Check out my other creations!",
"apps": [
{
"url": "https://apps.apple.com/us/app/cartoonify-me/id6747951776",
"featured": true,
"title": "Custom Title (Optional)",
"description": "Custom Description (Optional)"
},
{
"url": "https://apps.apple.com/us/app/another-app/id123456789",
"featured": false
}
]
}
public enum OtherAppsLayout {
case list // Vertical list with full-width cards
case grid // 2-column grid with compact cards
case carousel // Horizontal scrolling carousel
case featured // Featured first app + grid of others
case minimal // Clean, simple design with app icons and links
}
OtherAppsView(
configuration: config,
onAppTap: { app in
// Custom action when user taps an app
print("User tapped: \(app.name)")
// Default behavior: opens App Store
}
)
struct MyAppView: View {
var body: some View {
ScrollView {
// Your app content
Text("Welcome to my app!")
// Add other apps at the bottom
}
.otherApps(urls: [
"https://apps.apple.com/us/app/cartoonify-me/id6747951776"
])
}
}
- In Xcode, go to File β Add Package Dependencies
- Enter this repository URL:
https://github.com/asilarslan/OtherApps
- Click Add Package
Or add it to your Package.swift
:
dependencies: [
.package(url: "https://github.com/asilarslan/OtherApps", from: "1.0.5")
]
- Download the
OtherApps
folder - Add it to your Xcode project
- Import
OtherApps
in your SwiftUI files
- iOS 15.0+ / macOS 12.0+ / watchOS 8.0+ / tvOS 15.0+
- SwiftUI
- Xcode 13+
- Swift 5.7+
The library automatically extracts App IDs from various App Store URL formats:
https://apps.apple.com/us/app/app-name/id123456789
https://apps.apple.com/app/id123456789
https://itunes.apple.com/app/id123456789
- Smart Caching: Images and app data are cached for fast loading
- Lazy Loading: Apps load progressively to avoid blocking the UI
- Memory Efficient: Optimized for smooth scrolling with many apps
- Network Efficient: Minimal API calls with intelligent retry logic
// Access the shared service for custom configuration
let service = AppStoreService.shared
// Fetch apps manually
Task {
let apps = try await service.fetchApps(from: jsonUrl)
// Handle apps...
}
The library provides comprehensive error handling:
enum AppStoreServiceError: LocalizedError {
case invalidURL
case invalidAppStoreURL
case invalidResponse
case appNotFound
case networkError(Error)
case decodingError(Error)
}
Perfect for:
- Settings screens - Show your other apps to users
- About pages - Showcase your app portfolio
- Onboarding flows - Cross-promote your apps
- Marketing pages - Beautiful app galleries
- Developer portfolios - Display your work
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the project
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
If you have questions or need help:
- π Bug reports: Open an issue
- π‘ Feature requests: Open an issue
- π¬ Questions: Start a discussion
If this library helped you, please consider:
- β Starring the repository
- π¦ Sharing it on Twitter
- π Writing a blog post about it
Made with β€οΈ for iOS developers who want to showcase their apps beautifully.