Sample iOS app demonstrating Coordinators, Dependency Injection, MVVM, Binding

Overview

iOS Sample App

License: MIT Platforms Swift Version Twitter

Sample iOS app written the way I write iOS apps because I cannot share the app I currently work on.

Shown concepts

Architecture concepts

Other concepts

  • Localization to 2 languages with safer string usage and checking for missing translations
  • Continuous integration with Github Actions and Danger
  • Unit testing, including testing view controllers for leaks
  • Using (multiple) Storyboards just as glorified XIBs
  • Creating a view controller in code when Storyboard cannot be used
  • Using static UITableView cells in a typed way with enums
  • Image literals
  • Automated AppStore screenshots taking in multiple languages
  • Adding custom reactive properties
  • Basic Dark mode support

Getting started

Prerequisites

Built with

  • RxSwift - Reactive Programming in Swift
  • RxSwiftExt - A collection of Rx operators & tools not found in the core RxSwift distribution
  • Swinject - Dependency injection framework for Swift
  • Reusable - A Swift mixin for reusing views easily and in a type-safe way
  • Nuke - A powerful image loading and caching system
  • FeedKit - An RSS, Atom and JSON Feed parser written in Swift
  • NotificationBanner - The easiest way to display highly customizable in app notification banners in iOS
  • SpecLeaks - Unit Tests Memory Leaks in Swift. Write readable tests for mem leaks easily with these Quick and Nimble extensions
  • Quick - The Swift (and Objective-C) testing framework
  • Nimble - A Matcher Framework for Swift and Objective-C

Author

Igor Kulman - [email protected]

License

This project is licensed under the MIT License - see the LICENSE file for details

Comments
  • Project not building on Xcode 11.4

    Project not building on Xcode 11.4

    I am trying build project on Xcode 11.4

    the carthage update failing you can see the below.

    I also have this warning "Incompatible Swift version - framework was built with 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7) and the local version is 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)."

    Is there something we can do to fix it?

    *** Checking out Nuke at "8.4.2" *** Checking out Reusable at "4.1.1" *** Checking out Quick at "v2.2.0" *** Checking out FeedKit at "9.1.0" *** xcodebuild output can be found in /var/folders/rx/mby_9bp11g98xr3ds6st2fxw0000gn/T/carthage-xcodebuild.L8y03x.log *** Downloading Reusable.framework binary at "4.1.1" *** Downloading RxSwift.framework binary at "Catalyst.1" *** Skipped installing Reusable.framework binary due to the error: "Incompatible Swift version - framework was built with 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7) and the local version is 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)."

    Falling back to building from the source
    

    *** Building scheme "CRToast" in CRToast.xcodeproj *** Building scheme "FeedKit iOS" in FeedKit.xcodeproj *** Building scheme "Nimble-iOS" in Nimble.xcodeproj *** Building scheme "Nuke" in Nuke.xcodeproj *** Building scheme "Quick-iOS" in Quick.xcworkspace *** Building scheme "Reusable-iOS" in ReusableDemo.xcworkspace *** Building scheme "RxNuke" in RxNuke.xcodeproj *** Building scheme "RxSwiftExt-iOS" in RxSwiftExt.xcworkspace *** Building scheme "SpecLeaks" in SpecLeaks.xcodeproj Build Failed Task failed with exit code 65: /usr/bin/xcrun xcodebuild -project /Users/mg/iOSProjects/iOSSampleApp/Sources/Carthage/Checkouts/specleaks/SpecLeaks.xcodeproj -scheme SpecLeaks -configuration Release -derivedDataPath /Users/mg/Library/Caches/org.carthage.CarthageKit/DerivedData/11.4_11E146/specleaks/0.1.8 -sdk iphoneos ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES archive -archivePath /var/folders/rx/mby_9bp11g98xr3ds6st2fxw0000gn/T/specleaks SKIP_INSTALL=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=NO CLANG_ENABLE_CODE_COVERAGE=NO STRIP_INSTALLED_PRODUCT=NO (launched in /Users/mg/iOSProjects/iOSSampleApp/Sources/Carthage/Checkouts/specleaks)

    bug 
    opened by matghazaryan 2
  • Releasing child coordinators

    Releasing child coordinators

    Hi Igor,

    Thanks for sharing this repo, lots of good stuff! I wasn't sure where to ask you a question regarding the code so I'll add an issue, hope that's okay.

    Regarding releasing the child coordinators in the AppCoordinator, is there a reason you don't clean up the other child coordinator when switching view's? eg: childCoordinators[.setup] = nil

    And I was wondering, in the FeedCoordinator, you check if it's transitioning from the setup (with !navigationController.viewControllers.isEmpty. Wouldn't it be better to check this in the AppCoordinator to separate out the responsibilities better? The FeedCoordinator does not need to know anything about the setup right?

    Oh and I like your child-coordinator enums a lot, will use this for my next project!

    Cheers!

    question 
    opened by teameh 2
  • Fix destroy `AboutCoordinator`.

    Fix destroy `AboutCoordinator`.

    Great sample app helps me a lot.

    I have found the timing destroy AboutCoordinator is not accurate. When you pan back to trigger pop animation, then cancel, will cause destroy AboutCoordinator immediately, as result, you can call AboutCoordinator related api no more.

    bug 
    opened by cuzv 1
  • [ImgBot] Optimize images

    [ImgBot] Optimize images

    Beep boop. Your images are optimized!

    Your image file size has been reduced by 31% 🎉

    Details

    | File | Before | After | Percent reduction | |:--|:--|:--|:--| | /fastlane/screenshots/sk-SK/iPhone 7 Plus-4-About.png | 107.87kb | 52.58kb | 51.26% | | /fastlane/screenshots/en-US/iPhone 7 Plus-4-About.png | 105.72kb | 51.63kb | 51.16% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-1024.png | 40.50kb | 22.71kb | 43.94% | | /Sources/iOSSampleApp/Assets.xcassets/Back.imageset/[email protected] | 0.80kb | 0.46kb | 42.46% | | /Sources/iOSSampleApp/Assets.xcassets/Forward.imageset/[email protected] | 0.80kb | 0.47kb | 41.92% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-167.png | 4.78kb | 2.83kb | 40.83% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-180.png | 5.19kb | 3.09kb | 40.46% | | /Sources/iOSSampleApp/Assets.xcassets/Logo.imageset/Icon-180.png | 5.19kb | 3.09kb | 40.46% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-120.png | 3.28kb | 1.98kb | 39.43% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-121.png | 3.28kb | 1.98kb | 39.43% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-152.png | 4.25kb | 2.58kb | 39.38% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-87.png | 2.36kb | 1.50kb | 36.49% | | /fastlane/screenshots/en-US/iPhone 7 Plus-1-Setup.png | 155.56kb | 99.33kb | 36.15% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-81.png | 2.24kb | 1.43kb | 36.05% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-80.png | 2.24kb | 1.43kb | 36.05% | | /fastlane/screenshots/sk-SK/iPhone 7 Plus-1-Setup.png | 158.73kb | 101.88kb | 35.82% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-76.png | 2.02kb | 1.33kb | 34.11% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-60.png | 1.62kb | 1.10kb | 32.47% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-58.png | 1.57kb | 1.06kb | 32.38% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-59.png | 1.57kb | 1.06kb | 32.38% | | /fastlane/screenshots/sk-SK/iPhone 7 Plus-2-List.png | 346.32kb | 252.19kb | 27.18% | | /fastlane/screenshots/en-US/iPhone 7 Plus-2-List.png | 346.32kb | 252.19kb | 27.18% | | /fastlane/screenshots/en-US/iPhone 7 Plus-3-Detail.png | 320.35kb | 240.10kb | 25.05% | | /fastlane/screenshots/sk-SK/iPhone 7 Plus-3-Detail.png | 320.79kb | 240.53kb | 25.02% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-42.png | 1.13kb | 0.86kb | 23.85% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-40.png | 1.13kb | 0.86kb | 23.85% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-41.png | 1.13kb | 0.86kb | 23.85% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-30.png | 0.76kb | 0.65kb | 15.20% | | /Sources/iOSSampleApp/Assets.xcassets/Settings.imageset/[email protected] | 1.26kb | 1.07kb | 14.85% | | /Sources/iOSSampleApp/Assets.xcassets/Back.imageset/[email protected] | 0.44kb | 0.39kb | 10.74% | | /Sources/iOSSampleApp/Assets.xcassets/Forward.imageset/[email protected] | 0.42kb | 0.38kb | 8.92% | | /Sources/iOSSampleApp/Assets.xcassets/About.imageset/[email protected] | 1.01kb | 0.94kb | 7.06% | | /Sources/iOSSampleApp/Assets.xcassets/AppIcon.appiconset/Icon-21.png | 0.55kb | 0.52kb | 5.88% | | | | | | | Total : | 1,951.19kb | 1,345.04kb | 31.07% |


    📝docs | :octocat: repo | 🙋issues | 🏅swag | 🏪marketplace

    opened by imgbot[bot] 0
  • Upgrade to Xcode 11

    Upgrade to Xcode 11

    Includes

    • using iOS 13 simulator commands instead of the SimulatorStatusMagic library
    • Upgraded dependencies
    • Using SpecLeaks via Carthage
    • Moving sources into a separate directory
    enhancement 
    opened by igorkulman 0
Owner
Igor Kulman
Building mobile apps since 2011, currently suffering Xcode for iOS / Swift development.
Igor Kulman
📅 Sample calendar app created with CalendarKit (template)

CalendarApp CalendarApp is a template repository serving as a starting point for experiments with CalendarKit. It's a sample calendar app for iOS buil

Richard Topchii 136 Dec 20, 2022
Simple sample of using the VIP (Clean Swift) architecture for iOS

MyAnimeList Simple sample of using the VIP (Clean Swift) architecture for iOS. ViewController: controls the event handling, view life cycle and displa

null 24 Oct 12, 2022
An experimental clone of the new iOS 11 App Store app

appstore-clone An experimental clone of the new iOS 11 App Store app for this Medium Article Description Apple announced an entirely redesigned iOS Ap

Phill Farrugia 498 Dec 13, 2022
iOS app to record how much things cost using various data persistence implementations.

how-much iOS app to record how much things cost using various data persistence implementations. The basic data unit is an item, a simple dictionary: {

null 22 Aug 15, 2022
The (second) best iOS app for GitHub.

GitHawk is the second-highest rated iOS app for GitHub. Features 0️⃣ Inbox Zero your notifications ?? Comment even faster than on GitHub desktop ?? Th

GitHawk 2.8k Dec 23, 2022
iOS app for 5calls.org

5Calls iOS App This is the repository for the iOS app for 5Calls.org. Requirements Xcode 10.2.1 iOS 10.2 Getting Started Install the dependencies: bun

5 Calls 129 Dec 25, 2022
Development of the TUM Campus App for iOS devices - for and from students at Technical University of Munich.

Tum Campus App - An Unofficial Guide Through University Life The TUM Campus App (TCA) is an open source project, developed by volunteers and available

TUM Developers 93 Dec 16, 2022
Lightweight iOS Photo Blur App

Blurry Blurry is the go-to image blurring tool to help you apply beautiful blurs for your photos. It is perfect for creating wallpapers, backgrounds,

Andy 17 Nov 22, 2022
Alfresco iOS App - Alfresco is the open platform for business-critical content management and collaboration.

Welcome to the Alfresco iOS App Alfresco is the open platform for business-critical content management and collaboration. Alfresco Mobile was designed

Alfresco Software 42 Sep 26, 2022
📱 Nextcloud iOS app

Nextcloud iOS app Check out https://nextcloud.com and follow us on twitter.com/nextclouders or twitter.com/NextcloudiOS How to contribute If you want

Nextcloud 1.4k Dec 30, 2022
🍣Making Recipes iOS app

Recipes App ❤️ Support my apps ❤️ Push Hero - pure Swift native macOS application to test push notifications PastePal - Pasteboard, note and shortcut

Khoa 88 Nov 22, 2022
📱The official Wikipedia iOS app.

Wikipedia iOS The official Wikipedia iOS app. License: MIT License Source repo: https://github.com/wikimedia/wikipedia-ios Planning (bugs & features):

Wikimedia 2.5k Dec 27, 2022
This app shows the current percentage of the vaccination campaign in Brazil and its states

This app shows the current percentage of the vaccination campaign in Brazil and its states. The data is obtained thanks to covid19br.

Anderson Kloss Maia 8 Jul 22, 2022
Open-Source Messaging App

Acani Chats Open-Source Native iOS Messages App This project and its submodules no longer work and are no longer being maintained. Acani Chats is an i

Acani 2.1k Dec 21, 2022
The Artsy Auction Kiosk App.

Eidolon The Artsy Auction Kiosk App. Note: Current development is done on the xcode-9 branch using Xcode 9 (available for download on Apple's develope

Artsy 2.7k Dec 25, 2022
Build a Swift App as a designer

DesignerNewsApp Simple iOS client for Designer News, by the creator of Design+Code and the team, written in Swift. Usage Download the repository $ git

Meng To 2.4k Dec 24, 2022
Basic app to show how to login with Facebook, Google, Twitter. Created for learning purpose :) using Xcode 9 and Swift 4.0

Social Logins iOS Basic app to show how to login with Facebook, Google, Twitter. Created for learning purpose :) using Xcode 9 and Swift 4.0 Note: Bef

Jogendra 12 Nov 4, 2022
PixPic, a Photo Editing App

PixPic PixPic, a Photo Editing App Built by Our iOS Interns What's the best way to teach interns how to write an iOS app? Just let them do it! This ap

Yalantis 1.3k Dec 24, 2022
An app focused on show in a visual way how sorting algorithms actually works.

Sorting Algorithms App An open source app focused on show in a visual way how sorting algorithms actually works. Available on the app store Do you wan

Victor Panitz Magalhães 45 Nov 25, 2022