Skip to content
Swift Other
  1. Swift 99.3%
  2. Other 0.7%
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/ISSUE_TEMPLATE
Assets.xcassets
Screenshots
StudApp.xcodeproj
StudApp
StudAppSnapshots
StudAppTests
StudAppUITests
StudFileProvider
StudFileProviderUI
StudKit
StudKitTests
StudKitUI
StudNotificationService
fastlane
.gitignore
.swiftlint.yml
Cartfile
Cartfile.resolved
Gemfile
LICENSE.md
README.md

README.md

StudApp—Stud.IP to Go

StudApp is an iOS application for the Stud.IP learning platform, which is used by more than half a million students and lecturers at over 40 German universities and 30 other organizations like the German Football Association or a state police.

This project aims to take this platform to the next level by leveraging native capabilities of iOS. With StudApp, it easier than ever to browse your courses, documents, and announcements! Being officially certified by Stud.IP e.V., it provides excellent ways to stay up-to-date.

And—just like Stud.IP itself—StudApp is completely open source and free to be used by anyone as an no-cost app on the App Store.

Screenshot: Course Overview on iPhone X Screenshot: Events on iPhone X Screenshot: Downloads on iPhone X
Screenshot: Courses on iPad Pro

Compatibility

Generally, StudApp can be used with every Stud.IP instance and most iPhone, iPad, and iPod touch devices.

Please note that you need at least Stud.IP 4.0.4 as well as iOS 10.0.

Features

  • Organizing Courses
    • Grouping by collapsable semesters and selecting relevant semsters
    • Setting course colors (available since Stud.IP 4.2)
    • Hiding courses one-by-one
  • Document Management
    • Downloading and special downloads section with powerful search
    • Support for downloading or linking to external documents (e.g. hosted by iCloud Drive)
    • Support for web-links as files
    • File extension inference
  • Rich announcements
  • Events timetable
  • Highlighting new data and manual (un-)highlighting
  • Complete offline availability and cache management
  • Integrates with iOS's native Files app
  • Integration into Spotlight search and Handoff
  • Usage of 3D Touch, Quick Actions, Drag'n'Drop, Haptic Feedback, and more
  • Fully translated into English and German
  • Optimized for accessibility features like Dynamic Type, VoiceOver, and Smart Invert

See my blog post if you want to learn more about the motivations behind this project!

Using StudApp

It is easy to get started!

Students and Lecturers

Make sure your organizations supports StudApp and download it from the App Store!

Administrators

Do you want to add support for StudApp at your university, school, club, or other kind of organization? Glad to hear that!

I've made it very easy for you:

  1. Be administrator of a Stud.IP instance of version 4 or higher
  2. Activate the REST API
  3. Generate OAuth credentials
  4. Give them to me in a secure way and I'll add your organization to StudApp organization picker

…you can also shoot me a mail or open an issue!

Supporting StudApp at your organization doesn't cost a cent—how cool is that?

If you want to support development, feel free to give a tip using the button in the in the app's about section. Thank you!


Technical Stuff

Setting Up a Development Environment

  1. Download the most recent version of Xcode from the Mac App Store
  2. Run xcode-select --install in your shell in order to install headers for CommonCrypto
  3. Run brew install swiftlint for installing an addtional Swift linting tool
  4. Run brew install swiftformat for installing a Swift source code formatting tool
  5. Open StudApp/StudApp.xcodeproj

Trivia

  • Data persistence is backed by Core Data
  • Signing in uses OAuth1 for authorization and stores tokens securely in Apple's Keychain
  • Organizations are backed by CloudKit and can be updated on the fly

Architecture

If you want to know more about how StudApp works, you've come to the right place! I'll give a general perspective on how things work.

There are many topics that I've discussed in detail in other blog posts or will do so in the future. Give them a read if you like!

You can also find more elaborate information as documentation comments in the source code. I encourage you to check it out!

Patterns

This section gives a broad overview over design patterns used in StudApp with the goal to make its code easy to understand and maintain.

Project Layout

StudApp is divided into five distinct targets (and—where useful—accompanying testing targets):

StudApp is the actual iOS application with all view controllers and storyboards except those shared by multiple targets.

StudKit is a common framework containing all models, view models, and services. It is meant to be a common foundations for all targets, including potential macOS apps.

StudKitUI, also a common framework, contains UI-related constants, views, and shared view controllers and storyboards.

StudFileProvider integrates with Files, which is iOS's native file browser.

StudFileProviderUI displays user interfaces inside Files.

Each targets groups sources files logically instead of by type, sometimes nested. For instance, Api, HttpMethods, and Result+Api are all contained within one group. Extensions that operate on another framework's objects are grouped by framework.

MVVM

This project utilizes the MVVM "Model-View-ViewModel" pattern, which encourages separation of view and business logic and makes both easier to reuse and test. All models live in StudKit, e.g. in the form of database models and services. View models also reside in StudKit. Views and controllers form the View part of MVVM.

Using this approach as an addition to Apple's MVC actually makes a lot of sense for this project as I am able to reuse much of my view model logic in both the main app and the file provider. It also makes developing a potential macOS app way easier.

Dependency Injection

Another pattern that StudApp uses is Dependency Injection, which makes unit testing a lot easier. For example, I swap the real API class with a mock subclass that always returns specific responses.

I've implement a minimal approach that lets targets register instances for specific types at launch. Later, services can resolve these instances at runtime.

Frameworks and Libraries

To give you a broad overview, here are the frameworks and libraries used in StudApp:

First-Party

  • CloudKit—Managing and updating organizations
  • CommonCrypto—signing requests
  • CoreData—persisting and organizing data
  • CoreGraphics—drawing custom graphics like confetti or the loading indicator
  • CoreSpotlight—indexing app content
  • FileProvider—providing data to the Files app
  • FileProviderUI—showing UI in the Files app
  • Foundation—performing network requests and much more
  • MessageUI—Showing a mail composer for feedback
  • MobileCoreServices—dealing with file types
  • QuickLook—previewing documents
  • SafariServices—displaying websites inline and authorizing a user
  • StoreKit—handling tipping
  • UIKit—creating the iOS app UI
  • WebKit—rendering web-based content like announcements
  • XCTest—testing my app

Testing

Ensuring quality requires automated testing. I use XCTest to unit-test my models with a focus on parsing API responses as well as updating and fetching data.

I've created a way to automatically load mock data into Core Data when running UI tests. Those tests will be automated in the future.

Code and Licensing

As mentioned in the introduction, StudApp is completely open source and licensed under GPL-3.0. See LICENSE.md for details.

Why I chose GPL

Since StudApp is a complete software available on the App Store and not a library, I want to encourage sharing improvements and prevent people from releasing their own closed source modified version since it took many months to build.

The thing about GPL is that it requires source disclosure and forbids sublicencing, i.e. using something in a non-GPL-project. To that end, it is a perfect fit. Especially because Stud.IP follows the same approach.

However, I appreciate feedback and contributions of any kind! It would also be great to find people excited about Stud.IP who could help maintain this app in case I'm not able to.

You can’t perform that action at this time.