Apr 29, 2020
Icro 2.2 for iOS and macOS is now available in the App Stores. 8h from submission to release for both platforms. 🙌
Apr 28, 2020
The release of the Magic Keyboard and mouse pointer support really pushes iPad Apps forward. Context menus everywhere! 😍
Apr 21, 2020
In my full-time job, I’m working on a project that was started almost 12 years ago. I have no illusion that I would be able to compile and run this on Xcode for iPad. In my spare time, I’m building a pure SwiftUI App with a few external SwiftPM dependencies, no custom build scripts besides SwiftLint, no interface builder. I don’t see why it wouldn’t be great to work on this on the iPad.
Apr 21, 2020
I don’t understand the negative sentiment towards Xcode on iPad. Even comments like: “it will only be used by children to ship their first toy App”. Wouldn’t this be already a great achievement in itself?
Apr 14, 2020
After listening to a recent ATP, I finally installed Pi-hole on my Mac Mini Server. Having blocked ads without shady extensions is magic. Pi-hole
Apr 12, 2020
I declare Easter as my password hygiene holiday. Deleted 400 entries from my 1Password store!
Apr 11, 2020
My girlfriend recently got a Switch and Animal Crossing. She would love if someone comes by her island: Dodo Code L1TN0 It’s her second day only!
Apr 5, 2020
I finally finished rewriting my hacky Jekyll micropub endpoints in Rust. Now hosted for free on Heroku and GitHub pages.
Mar 20, 2020
Something is missing…
Mar 18, 2020
If Apple is going to announce the ARM transition soon, maybe we can install macOS on this new iPad? 😁
Feb 16, 2020
Internal SwiftPM packages are a game changer for me. It‘s finally as easy as it should be to modularize an App.
Feb 9, 2020
A typical post of the category: “Better write a blog post about it, otherwise I will forget how to make it work”
Early on in the development of Icro I integrated fastlane to run continuous integration tests on bitrise and build and uploaded release version from a local Mac. As GitHub Actions is now available and offers similar features as bitrise for open source projects, I decided to move the CI tests over and also start using it for Apple TestFlight deployments.
Thanks to the already defined lanes, the migration to run unit tests on every push and pull request was trivially easy.
The Fastfile just uses the
run_testsaction configured with the correct workspace and scheme:
default_platform(:ios) platform :ios do desc "Run unit tests" lane :tests do run_tests(workspace: "Icro.xcworkspace", derived_data_path: "derivedData", devices: ["iPhone Xs"], scheme: "Icro") end ... end
The GitHub action workflow file defines when the action should be run, installs the bundle dependencies (including fastlane) and runs the lane
name: CI on: [push, pull_request] jobs: build: runs-on: macos-latest steps: - uses: actions/checkout@v1 - name: submodules-init uses: snickerbockers/submodules-init@v4 - name: Bundle Install run: bundle install - name: Build and test run: bundle exec fastlane tests
Running unit tests usually does not require complicated code-signing steps or access to shared accounts, and passwords. All this is required to deploy builds to TestFlight. As a first step, the certificates and provisioning profiles need to be made accessible for GitHub actions. Luckily fastlane also helps with this: match. Following the guide to integrate fastlane match, I created a repository accessible for GitHub Actions to store encrypted profiles and certificates. The passphrase for the certificates is saved inside GitHub Secrets. Fastlane match will then install the certificates in the keychain of the Action runner to successfully sign the build. The added lane to the Fastfile looks like this:
lane :beta_ci do bump_version create_keychain( name: "Fastlane_CI", password: "CI_Password", default_keychain: true, unlock: true, timeout: 3600, add_to_search_list: true, ) match(type: "development", readonly: true, keychain_name: 'Fastlane_CI', keychain_password: 'CI_Password') match(type: "appstore", readonly: true, keychain_name: 'Fastlane_CI', keychain_password: 'CI_Password') build_app(workspace: "Icro.xcworkspace", scheme: "Icro") upload_to_testflight(skip_waiting_for_build_processing: true, username: "email@example.com") end
bump_versionis just a simple internal lane to set the build number to the number of commits on
master. We need to call
create_keychainto use a specialised keychain on the Action runner. Otherwise, the build would be blocked forever, during the signing, a keychain-popup to access the installed certificates would block the execution. Two
matchactions will install the certificates for
appstoreto ensure a successful signing. Using a restricted App Store Connect user, the build gets uploaded to TestFlight. The Fastfile does not have access the defined GitHub secrets. Therefore the passphrase for match and the password for the App Store Connect account are defined as environment variables on the deployment workflow file.
name: Deploy on: release: types: [published] jobs: build: runs-on: macos-latest steps: - uses: actions/checkout@v1 - name: submodules-init uses: snickerbockers/submodules-init@v4 - name: Bundle Install run: bundle install - name: Set Appstore Connect User run: bundle exec fastlane fastlane-credentials add --username firstname.lastname@example.org --password $ - name: Fastlane Beta CI run: bundle exec fastlane beta_ci env: MATCH_PASSWORD: $ FASTLANE_PASSWORD: $
The deployment is triggered on every newly created release inside GitHub (just a tag). The workflow will install the bundles again, set the fastlane credentials by accessing the
APPSTORE_PASSWORDinside GitHub secrets. As a final step, the lane gets called with the
matchpassphrase and App Store Connect password defined.
With this setup in place, every push and pull request to Icro will run unit tests, every new release will automatically create and upload a new build to App Store Connect.
Feb 9, 2020
Spending way too little time on writing Rust, this still is a helpful guide.
Feb 4, 2020
A German newspaper writing about RSS, not sure why now but spreading awareness is great!
Feb 1, 2020
“Apple set the standard that highly complex, innovative software that was only possible on the iPad could only ever earn 5 bucks from a customer forever (updates, of course, were free).”