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!
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!
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!
- Download the most recent version of Xcode from the Mac App Store
- Run
xcode-select --install
in your shell in order to install headers forCommonCrypto
- Run
brew install swiftlint
for installing an addtional Swift linting tool - Run
brew install swiftformat
for installing a Swift source code formatting tool - Open
StudApp/StudApp.xcodeproj
- 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, Api
, HttpMethods
, and 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.
To give you a broad overview, here are the frameworks and libraries used in StudApp:
CloudKit
—Managing and updating organizationsCommonCrypto
—signing requestsCoreData
—persisting and organizing dataCoreGraphics
—drawing custom graphics like confetti or the loading indicatorCoreSpotlight
—indexing app contentFileProvider
—providing data to the Files appFileProviderUI
—showing UI in the Files appFoundation
—performing network requests and much moreMessageUI
—Showing a mail composer for feedbackMobileCoreServices
—dealing with file typesQuickLook
—previewing documentsSafariServices
—displaying websites inline and authorizing a userStoreKit
—handling tippingUIKit
—creating the iOS app UIWebKit
—rendering web-based content like announcementsXCTest
—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.
As mentioned in the introduction, StudApp is completely open source and licensed under GPL-3.0. See LICENSE.md for details.
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.