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.
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.
- 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!
It is easy to get started!
Students and Lecturers
Make sure your organizations supports StudApp and download it from the App Store!
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:
- Be administrator of a Stud.IP instance of version 4 or higher
- Activate the REST API
- Generate OAuth credentials
- 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!
Setting Up a Development Environment
- Download the most recent version of Xcode from the Mac App Store
xcode-select --installin your shell in order to install headers for
brew install swiftlintfor installing an addtional Swift linting tool
brew install swiftformatfor installing a Swift source code formatting tool
- 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
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!
This section gives a broad overview over design patterns used in StudApp with the goal to make its code easy to understand and maintain.
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,
Result+Api are all contained within one group. Extensions that operate on another framework's objects are grouped by framework.
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.
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:
CloudKit—Managing and updating organizations
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
SafariServices—displaying websites inline and authorizing a user
UIKit—creating the iOS app UI
WebKit—rendering web-based content like announcements
XCTest—testing my app
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.