Nintendo Switch Lite Official Carrying Case Quick Look Review

While I await the arrival of a turquoise Switch Lite, I thought I’d share a quick look at Nintendo’s official carrying case for those that like me were curious on what it looked like inside.

While a fairly basic case (retailing in Australia for around $30), it is pretty sturdy and is made from nice-feeling materials. It also comes with a plastic screen protector, which I’m yet to test but presume is decent.

The inside is lined with a nice, grey microfibre material and has storage for up to eight game cards, as well as another small pouch for miscellaneous.

Overall, I think this looks like a decent option for protecting the Switch Lite, but I’ll have to see how it holds up in practice.

For those that prefer video, please check out my short YouTube hands on:

NSToolbar Customisation in UIKit for Mac (Marzipan/Catalyst)

As I’m sure many of my fellow developers have been, following the recent announcements from WWDC 2019, I have been playing around with Catalyst, Apple’s new infrastructure designed to make it easy to bring iOS (or more specifically iPadOS) apps over to macOS. Unlike many developers, however, most of my apps make use of tab bar based interfaces, for which Apple recommends moving to toolbar segmented control navigation when porting to the Mac.

In this post I’ll briefly run through what I’ve figured out thus far, trying to implement this (I will hopefully keep updating as I go). If this isn’t quite what you’re looking for but still want to see what’s possible with Catalyst, then I recommend reading Beyond the Checkbox with Catalyst and AppKit by the always inspirational Steve Troughton-Smith.

iOS Tab Bar Navigation

iOS Tab Bar Navigation

Apple’s Recommended Mac Equivalent

Apple’s Recommended Mac Equivalent

To gain access to the toolbar you will first need to move your code base over to using the new UIScene APIs. This first involves adding the UISceneSession lifecycle methods to your App Delegate:

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create 
        // the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)

func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application 
        // was not running, this will be called shortly after
        // application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were 
        // specific to the discarded scenes, as they will not return.

You then need to create a scene delegate that conforms to UIResponder and UIWindowSceneDelegate, like so:

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the 
        // UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will 
        // automatically be initialized and attached to the scene.
        // This delegate doesn't imply the connecting scene or session are new
        // (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }

    func sceneDidDisconnect(_ scene: UIScene) {}
    func sceneDidBecomeActive(_ scene: UIScene) {}
    func sceneWillResignActive(_ scene: UIScene) {}
    func sceneWillEnterForeground(_ scene: UIScene) {}
    func sceneDidEnterBackground(_ scene: UIScene) {}

Once your scene delegate is in place, your Info.plist needs to be edited to reference it:

                <string>Default Configuration</string>

From there you should be able to get a reference to and make adjusts to your app’s NSToolbar instance, from the scene delegate’s willConnectTo session method, like so:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let _ = (scene as? UIWindowScene) else { return }

    #if targetEnvironment(UIKitForMac)
        if let windowScene = scene as? UIWindowScene {
            if let titlebar = windowScene.titlebar {
                let toolbar = NSToolbar(identifier: "testToolbar")
                titlebar.toolbar = toolbar

If you get a “Value of type ‘UIWindowScene’ has no member ‘titlebar‘" error, you will need to import NSToolbar+UIKitAdditions.h as detailed in the macOS 10.15 Beta Release Notes. This is likely a temporary requirement. Thanks to Sebastian in the comments for helping me over this hurdle!

Screen Shot 2019-06-10 at 12.38.57 am.png

You can import this directly if you’re using Objective-C, otherwise in Swift you can import them in a bridging header like so:

#import <Foundation/Foundation.h>
#import <UIKit/NSToolbar+UIKitAdditions.h>

Once you have access to the toolbar you configure it using the available NSToolbar properties, and set its contents using NSToolbarDelegate methods.

let toolbar = NSToolbar(identifier: "testToolbar")

toolbar.delegate = self
toolbar.allowsUserCustomization = false
toolbar.centeredItemIdentifier = NSToolbarItem.Identifier(rawValue: "testGroup")
titlebar.titleVisibility = .hidden

titlebar.toolbar = toolbar

To add a centred, segmented control in the toolbar implement the following delegate methods (ensure your scene delegate conforms to NSToolbarDelegate).

func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
    if (itemIdentifier == NSToolbarItem.Identifier(rawValue: "testGroup")) {
        let group = NSToolbarItemGroup.init(itemIdentifier: NSToolbarItem.Identifier(rawValue: "testGroup"), titles: ["Solver", "Resistance", "Settings"], selectionMode: .selectOne, labels: ["section1", "section2", "section3"], target: self, action: #selector(toolbarGroupSelectionChanged))
        group.setSelected(true, at: 0)
        return group

    return nil
@objc func toolbarGroupSelectionChanged(sender: NSToolbarItemGroup) {
    print("testGroup selection changed to index: \(sender.selectedIndex)")
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
    return [NSToolbarItem.Identifier(rawValue: "testGroup")]
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
    return self.toolbarDefaultItemIdentifiers(toolbar)

Behold, the final result:

Screen Shot 2019-06-10 at 10.30.56 pm.png

If you’re porting an app with tab bar based interface like I am then from here you can fairly easily hide the tab bar and hook view controller swapping up to the toolbar section change action, like so:

#if targetEnvironment(UIKitForMac)
let rootViewController = window?.rootViewController as? UITabBarController
rootViewController?.tabBar.isHidden = true
@objc func toolbarGroupSelectionChanged(sender: NSToolbarItemGroup) {
    let rootViewController = window?.rootViewController as? UITabBarController
    rootViewController?.selectedIndex = sender.selectedIndex
Appearance on iOS and macOS

Appearance on iOS and macOS

The source for a test app is available here if you’d prefer to just look at the code.

Xbox and Playstation Controller Support Coming To Apple TV

Apple announced toady at its annual developers conference that Xbox One and PS4 controller support will be coming to the Apple TV later this year, with an update to tvOS.

Many game developers have long bemoaned the lack of good, easily accessible controller support on the platform. This new capability is the best thing to happen for tvOS games since the rule forcing developers to support the Siri Remote was scrapped a couple of years ago, and may prove a boon for quality games on the system.

UPDATE: These controllers will also be supported on iPhone and iPad with iOS 13.


Multitouch Tap Gestures in Flutter

I've recently been playing around with Flutter – Google's open-source app development SDK for both iOS and Android - and have been very much enjoying it. It makes use of the Dart programming language and has so far proven great for quickly building cross-platform prototypes, however, given its immaturity it's not surprisingly a little rough around the edges, especially when it comes to more complex interactions.

I was trying to figure out how to handle taps with multiple fingers and eventually came to the conclusion that it just isn't something that's supported by the SDK as it stands. The proper way to implement this currently would be to write custom platform-specific code and hook it into your Flutter code. That being said, below I present a hacky, and likely not particularly robust solution I managed to get working by making a custom MultiTapGestureRecognizer subclass.

import "package:flutter/gestures.dart";

class MultiTouchGestureRecognizer extends MultiTapGestureRecognizer {
  MultiTouchGestureRecognizerCallback onMultiTap;
  var numberOfTouches = 0;
  int minNumberOfTouches = 0;

  MultiTouchGestureRecognizer() {
    super.onTapDown = (pointer, details) => this.addTouch(pointer, details);
    super.onTapUp = (pointer, details) => this.removeTouch(pointer, details);
    super.onTapCancel = (pointer) => this.cancelTouch(pointer);
    super.onTap = (pointer) => this.captureDefaultTap(pointer);

  void addTouch(int pointer, TapDownDetails details) {

  void removeTouch(int pointer, TapUpDetails details) {
    if (this.numberOfTouches == this.minNumberOfTouches) {
    else if (this.numberOfTouches != 0) {

    this.numberOfTouches = 0;

  void cancelTouch(int pointer) {
    this.numberOfTouches = 0;

  void captureDefaultTap(int pointer) {}
  set onTapDown(_onTapDown) {}

  set onTapUp(_onTapUp) {}

  set onTapCancel(_onTapCancel) {}

  set onTap(_onTap) {}

typedef MultiTouchGestureRecognizerCallback = void Function(bool correctNumberOfTouches);

That, as an example, can be used within a custom StatelessWidget, as in the code below.

import "package:flutter/material.dart";
import "./multiTouchGestureRecognizer.dart";

class MultiTapButton extends StatelessWidget {

  final MultiTapButtonCallback onTapCallback;
  final int minTouches;
  final Color backgroundColor;
  final Color borderColor;

  MultiTapButton(this.backgroundColor, this.borderColor, this.minTouches, this.onTapCallback);

  void onTap(bool correctNumberOfTouches) {
    print("Tapped with " + correctNumberOfTouches + " finger(s)");

  Widget build(BuildContext context) {
    return RawGestureDetector(
    gestures: {
      MultiTouchGestureRecognizer: GestureRecognizerFactoryWithHandlers<
        () => MultiTouchGestureRecognizer(),
        (MultiTouchGestureRecognizer instance) {
          instance.minNumberOfTouches = this.minTouches;
          instance.onMultiTap = (correctNumberOfTouches) => this.onTap(correctNumberOfTouches);
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
              padding: EdgeInsets.all(12.0),
              decoration: BoxDecoration(
                color: this.backgroundColor,
                border: Border(
                  top: BorderSide(width: 1.0, color: borderColor),
                  left: BorderSide(width: 1.0, color: borderColor),
                  right: BorderSide(width: 1.0, color: borderColor),
                  bottom: BorderSide(width: 1.0, color: borderColor),
              child: Text("Tap with " + correctNumberOfTouches + " finger(s).", textAlign:,

typedef MultiTapButtonCallback = void Function(bool correctNumberOfTouches);

Again, this is hacky, and I wouldn't advise it be used for production purposes, but for quick demos and POCs please feel free to take it and run with it.

NOTE: I did notice 3+ fingers initially not working on an HTC phone (U Ultra) before I disabled some gesture navigation feature that's on by default. So if you run into any trouble perhaps double check any gesture-based features that are enabled on your phone.

The Many Faces of Apple Watch Series 4

If you’re curious about the different configurations available for the new Infograph, Infograph Modular, Fire and Water, Vapor and Liquid Metal faces on Apple Watch Series 4, then here’s a fairly comprehensive screenshot gallery showing most of the options on offer.

Infograph Face

I’m a huge fan of complications and as such I’m glad to see a new face that allows more than any before (eight in total). If you like colourful designs then you may also find this face an appealing option.


The ring dial and second hand colour can be changed to any one of the vast number of options shown in the screenshots below.


As previously mention the Infograph face supports up to eight complication (four centre, and four corner ones). The top, centre complication is also capable of providing more information in the form of text that runs along and curve across the top half of the dial (in the screenshots below you can see heart rate data being displayed here). The following screenshots show which system complications ares supported in each area and what they look like.

Infograph Modular Face

The Infograph Modular watch face is not dissimilar to the existing Modular watch face, however, it does add day and date above the digital time and include a larger centre area that can be used to show more graphical data.


The four smaller complication areas (bottom three and top left), use the same complication type as those in the centre of the standard Infograph face, refer to above for available options in these positions.

Fire and Water Face

Vapor Face

Liquid Metal Face

How to Select Multiple Objects in Affinity Designer for iPad

Affinity Designer is a fantastic vector drawing program and Illustrator competitor, which last month made its debut on the iPad. The iOS version is fully featured and just as powerful as its desktop counterparts, however, not all of its functionality is immediately obvious or discoverable. Being one who bypasses manuals, one common task that I was initially puzzled on how to achieve was that of selecting multiple objects and layers.

After some time playing around with the app I accidentally discovered that, with one object selected, additional objects can be added to the selection by holding one finger on the screen and then sequentially tapping on the other objects you want to select with another (or tapping an already selected object to remove it).

If you want to select multiple layers, that can be done from the layers palette by swiping from left to right on each layer you wish to select (and intuitively swiping in the opposite direction on an already selected layer deselects it). This approach also works for objects and groups.

Selecting multiple objects from the layers palette

Selecting multiple objects from the layers palette

If you’d like to see it in action I together a quick video tutorial that's now available on YouTube (narrated by Ziyanda Matshe):

Xiaomi Enters Hybrid Smartwatch Market With The Mijia Quartz

As much as I like my Apple Watch I find the idea of hybrid smartwatches an intriguing one; with a decent amount of features and amazing battery life they present a good alternative for those looking for something that tracks basic fitness metrics and doesn’t compromise too much on style.

Yesterday the China consumer tech juggernaut, Xiaomi, launched the Mijia Quartz, a new and compelling hybrid offering. The Quartz features step counting and six-month battery life all wrapped up in a quite striking design, and at just over US$50 it seems like great value.


One question I have is whether or not it does sleep tracking like Xiaomi’s other wearables, I’m assuming not given it isn’t specifically called out as a feature but if that’s the case it feels like a strange omission.

Xiaomi Today has a good early review if you’re keen to learn more about the Mijia Quartz.

Siri Needs Better Data Sources

Poor ol’ Siri has had a lot of criticism in recent years and unfortunately almost all of it has been well justified. Hopefully the recent announcement that former Googler John Giannandrea is taking over as head of the machine learning and Siri teams at Apple will mean good things for the beleaguered virtual assistant’s future. For now though, let’s face it, when compared to the competition (notably Google’s Assistant and Amazon’s Alexa) Siri is just plain average.

One aspect of Siri’s struggles that doesn’t get much attention is the sub-par data sources it has has to draw on. While it is admittedly difficult to go up against the data king, Google, in this space, sometimes mistakes are laughable and completely undermine any confidence one might have in Apple’s vocal helper.

One example first discovered by my dear mother towards the end of last year is Apple’s mistaken belief that the upcoming Grand Final Friday public holiday for the Australian state of Victoria is on October 5, which is presented to users as fact both through Siri interactions and via the company’s built-in calendar application. The correct date however, is September 28, as is listed by Google and every other reputable source of public holiday information.

Siri Gets It Wrong

In an effort to help out the Silicon Valley giant — and anyone planning a vacation around the holiday — I reached out to Apple’s Twitter support team in early February with details of the issue and was told it had been “forwarded to the proper team for investigation”. Sadly it seems that investigation has gone nowhere, leaving the Apple-toting contingent of the 6,358,900 people that call Victoria home having to wait an extra week for their next day off.

You need to do better Apple, please fix this and give Siri the resources it needs to succeed.


→ Disposable America - A history of modern capitalism from the perspective of the straw. Seriously.

Alexis Madrigal:

A straw is a simple thing. It’s a tube, a conveyance mechanism for liquid. The defining characteristic of the straw is the emptiness inside it. This is the stuff of tragedy, and America.

If you didn’t already see this on Daring Fireball or elsewhere, you should give this fascinating, in-depth history of the disposable drinking straw a read.

The Asus PB3 is an Excellent Portable Projector That Doesn't Cost the Earth

After spending more time than I care to mention researching the vast and difficult-to-decipher world of projectors — following the fantastic suggestion to maybe look into getting one from my darling girlfriend — I finally pulled the trigger on an Asus PB3. Asus' epic naming aside, I must say I'm thoroughly impressed with the surprisingly compact unit.



Having never before wandered into the realm of projectors and after getting my head around what lumen levels, key-stoning and throw distance really mean I was surprised to find a huge number of projectors with few clear recommendations. The list of criteria I started to build up as my understanding grew were the following:

1. Must be portable (both because it's handy having something that can be toted around and because for the moment neither mine or my girlfriend's apartment have space for a dedicated home theatre setup)

2. Must be bright enough to be easily viewed in low light and not require complete darkness (while watching movies in the dark can be great, it's often good having the option to wander around, eat food etc. during less serious screen time sessions)

3. Must be easy to get content on to (while this may mean different things to different people — depending upon your preferred content and source — for me this essentially meant being able to stream Netflix, YouTube and the like from my phone)

4. And lastly, it had to *not* be insanely expensive (as I've learnt, projectors range wildly in price from tens to many thousands of dollars).

Initially, I was drawn to the so-called pocket or pico projectors because of their fantastic portability and relatively low cost, and while I still believe many of these are great options, my favourite perhaps being the Sony MP-CL1A, they all fall down when it comes to my second requirement. Bear in mine I've not personally tested any of these but they all range between 50-200 lumens, which from everything I've read leaves me to believe would produce unsatisfactory results in anything short of near-total darkness.

Having ruled out these tiny options I began looking at larger units, those mostly aimed at office use, and quite frankly was unimpressed. At the lower end of the price spectrum many of these produce a picture at a resolution of just 480p and have the older 4:3 aspect ratio. Higher resolution projectors in this space of course exist but price increases quickly and at the end of the day while they are technically portable (weighing in at around 2kg or so), they are all rather bulky and very bare bones in terms of features.

Before going on with my impressions of the P3B I will just give a quick mention to BenQ's GS1, which has many of the advantages of the projector I ultimately went with but was just more expensive enough to sway me towards the Asus. One notable feature the GS1 offers over the P3B is splash resistance (when paired with its included rubber case), which could offer some good piece of mind should you be looking to host a mini movie night at the beach or by the pool.

P3B Overview

Having assessed the options I went ahead and purchased the P3B, and was immediately impressed with not only the very compact size of the unit (weighing just 750g) but also the bundled accessories. Fitting for a portable projector, Asus decided to include a nice fabric carrying case as well as a little remote control, which provides access to all settings (volume, brightness etc.) without needing to interact with the controls on the unit itself.



The PB3 produces an excellent image. While it is only 720p, the picture is sharp, has a good contrast ratio (100000:1) and gets plenty bright enough (rated at 800 lumens) to be easily viewed in a moderately-lit environment where the main projection surface isn't subjected to many competing light sources (ideally indoors at night with ceiling lights off, one or two floor lamps are not a problem). One thing to note is that while on battery power (yes, the PB3 has an internal rechargeable battery) the unit is restricted to an output of 300 lumens, presumably to save power, which is still usually sufficient but not nearly as pleasant to look at in non-ideal situations. The battery is rated at 12,000mAh, which Asus states is good for up to three hours of projection, and in my experience is easily enough for at least one movie of sensible length.

The P3B offers auto keystoning, and if that means nothing to you don't feeling too bad, I didn't either not all that long ago. What this essentially means is that the unit is smart enough to adjust the image it projects (in the vertical plane) to ensure that the image isn't distorted no matter how the unit is placed or the angle it makes with the projection surface. It seems this feature is fairly prevalent these days and I can understand why as without it you would need to manually adjust the image every time you set up the unit, which would certainly impact the convenience of its portable nature.

Chromecast projection in a bright room

Chromecast projection in a bright room

Another handy feature not standard on all projectors is the PSB's built-in speakers, they are by no means home theatre quality and I do wish they could get just a smidge louder, but they get the job done and are perfectly serviceable for causal Netflix binging. On the subject of audio output I will say that for those wondering the unit doesn't run completely silently, its internal fan will spin up pretty quickly once powered on and continues to emit a fairly quiet but not unnoticeable whitenoise throughout operation (to be clear I don't find it bothersome but it is noticeable during quiet scenes). Should the built-in speakers prove insufficient the unit thankfully includes an audio out jack, meaning external speakers can be easily connected with a AUX cable.

Perhaps thanks to the audible fan the P3B stays surprisingly cool, it definitely gets warm to the touch but never uncomfortably so even after extended viewing, something I was not expecting given its incredibly compact nature (and not something I could say about a great number of laptops I've owned throughout the years).

The P3B retails for over AUD$1,000 and as that was more than I was willing to pay I eventually decided to bring one in from the states (via Amazon) for under $600. While I certainly prefer to support local retailers and buying internationally also leaves you more vulnerable warranty wise, at nearly twice the price it's a difficult sell. For those looking to do the same and wondering about the power situation, rest assured that Asus bundles one of their common laptop power adapters (INPUT: AC100-240V - 50-60Hz 1.5A, OUTPUT: +19V, 3.42A) — suitable for most regions around the world (although definitely do your own research) — that has a detachable mains leads with a IEC standard C5 or "Mick Mouse" connection, meaning you should be able to replace the included lead with one that works with your sockets easily and at minimal cost.

As mentioned previously, being able to effortlessly get content onto the projector was an important selection criteria, and while not unique to the P3B the ability to easily connect a Chromecast made it an attractive option. Just about every half-decent projector on the market these days will have an HDMI input (which the Chromecast outputs to), however what Asus' offering has that not all do is a powered USB-A port that's capable of powering a first or second generation Chromecast. Asus also sells a WiFi dongle, which when coupled with Asus' WiFi Projection software is advertised to provide a direct wireless connection to PC or phone, but given the success of the Chromecast approach I haven't bothered to get one to test.

Another handy feature is the 2GB of internal memory (not much I know but it's better than nothing), which can be used to load content on to and have it always accessible. The unit also includes a micro SD card slot that supports cards up to 32GB and provided a further option for directly playable media.


All-in-all I'm thoroughly impressed with this now two-year-old gadget (having been released in 2016) and while I can't directly compare it to any other of the frankly daunting number of competing products out there, I think it's a great option that I would wholeheartedly recommend to anyone looking at getting their first projector.

WWDC Wishlist 2018

With Apple's annual World Wide Developers Conference (WWDC) just around the corner I thought I'd take a moment to do a little wish-casting, and list a few things I'd like to see Apple announce and roll out later this year.



Developer-Apple App Store split

There's been a lot of talk around this recently, especially after the newly formed Developers Union stated it as the next item on their agena after free trials for paid apps, and like many who are trying to make their living from the app store I'd also like to see developer's share of the proceeds be increased somewhat from the 70% status quo. The move to 85% for subscriptions after the first year, introduced in 2016, was a good first step in this direction. I'm not sure what a fair figure is, but hopefully Apple sees fit to make a few changes to help devs, at least those at the lower end of the revenue scale.

Improved Swift Handling in Xcode

A common complaint is that Xcode's performance is considerably worse when writing a project in Swift than the equivalent is in Objective-C. It was true when Swift first launched and is still true today (although to be fair, it is leaps and bounds better than it was in those early days). I like Swift (not that I disliked Objective-C, gasp I know :P) and have finally embraced it as the language I'll be using for any new work, and I'd love to see Apple double their efforts in bringing their dev tools up to speed.

iOS 12

Lockscreen Complications

I don't know what the odds of this one are but now having spent a few weeks with an Apple Watch I've come to love the platform's complications - the tiny customisable views that sit alongside the time on the watchface - that provide very accessible, gancable information. While arguably less useful on the phone, I still think something similar would be very handy on iOS' lockscreen.

Live App Icons

This is an ancient request that will never happen, but wouldn't it be cool if, like in the complication idea above, apps (with user permission of course) could periodically update their icons to display useful information? Like the built-in Clock, Calendar and Weather apps do already. I understand why Apple hasn't opened up this Pandora's box as it has the potential to overwhelm the user, I think approached in the right way (a limited templating system perhaps?) it would be an awesome addition.

PIP on iPhone

The iPad has has picture-in-picture for years now, and while I can somewhat understand with screen real estate being more of a premium why it perhaps wasn't an obvious feature for the phone initially, the number of times I've wished it was there is ridiculous and I'd use the heck out of it if Apple could find a way.

Notifications Management

When compared to what is offered by even remotely recent releases of Android, iOS' notification handling is a bit of a joke. Having barely changed since the platform's inception over 10 years ago, notifications come in and are presented to the user chronologically. Beyond being able to enable or disable at an app level there is very little in place to help triage, group or prioritise the vast number of notifications that come in on a daily basis. This needs to change. At this point I don't care whether Apple outright copies Android or does things differently but it's past time that more tools for notification management were available on the "most advanced mobile operating system", as Apple has often claimed. However, given they've been absent this long I'm not holding my breath.

watchOS 5

Apple Watch Improvements

Having only very recently got myself an Apple Watch - with the novelty factor not yet worn off - I'm new to realising the potential power of this little platform. I say potential because while the hardware is excellent and very capable for something that can be strapped to one's wrist, the software in places lets it down. To be clear, the built-in in functionality is good and reliable (and reason enough for the watch to exist) but third-party apps are lacking, and seemingly fewer now than they once were. Having spent the last few weeks building my own little transit app (mainly for myself, but it may see the light of day at some point in the future) I've realised what a frustrating experience it can be, explaining the shortage of quality apps. The APIs are mostly well-thought through but are limited, not always reliable, and in parts poorly documented. The debugging process isn't any better, between things working differently on the simulator and the real device and the slow and flasky connection to physical hardware it can be rather painful. In short I'd like to see the good ideas in watchOS 4 tightened up with a focus on making existing frameworks rock-solid and the development experience as a whole a little more tolerable. Some choice new APIs would be nice also, to give devs just a little more power and freedom to make useful watch software.

macOS 10.14

Continued Development for macOS

This is low bar for the Mac, but it is already wonderful and very capable platform, and I honestly can't think of too much it needs. A new UI framework more in line with iOS' UIKit, as has been rumoured, would be nice. The addition of HomeKit would seem sensible, for platform consistency if nothing else. I love the Mac, and I hope Apple makes some solid under-the-hood improvements but really any sign of active development will probably be okay with me.

tvOS 12

Mentioned for Completeness

The Apple TV is a good product, and while apps may once have been heralded as the future more content is really what the platform needs. It will be interested to see what, if anything, in regards to tvOS will mentioned in the keynote on Monday.

Samsung Launches Galaxy S9 with Variable Aperture Camera

While Nokia may have had patents and the potential to bring variable aperture technology to smartphone cameras years ago — back when the Lumia brand was gaining traction and Windows Phone still had a future — it is Samsung that has finally made it a reality with the launch of their newest flagship, the Galaxy S9.

Touting the ability to capture photos at both f/2.4 and f/1.5 apertures Samsung's latest should have a significant advantage over rivals when it comes to shooting low-light scenes. For the uninitiated, the aperture refers to the hole at the front of the lens in which light enters and the f number or stop describes the size of the opening. In general, a lower stop is preferred for low-light photography as it allows more of the limited photons to enter the camera and in turn results in better, brighter images. Higher stops, meanwhile, are used for well-lit situations, as restricting some of the ample light results in greater sharpness and detail. The S9 will intelligently switch between the two apertures by activating its physical shutter mechanism and selecting the best mode of the scene it's presented with.


Having just two apertures to work with may sound unimpressive, especially when compared to dedicated cameras that have had far more stops as standard since the late 1800s, but this is a first for such a miniaturised module and doubtless only the beginning. I firmly subscribe to the sentiment that the best camera being the one you have on you, and as such am always excited to the advancements smartphone manufactures continue to bring to the table. I eagerly await the early reviews, which should start dropping ahead of the device's release on March 16, to see if Samsung can dethrone Google's Pixel 2 as the phone with the best optics.

iPhone X

As early reviews for the iPhone X start to roll out — seemingly with most of the press having had less than 24 hours with the new device — it is hopefully becoming more apparent to the general population just how much work developers will need to do to support the new form factor.

I have recently been spending some time updating my own apps for the "eared" screen of the X, and while Apple’s related APIs are very good there are significant challenges not just in dealing with the notch but also the very rounded corners and – I think most significantly – the home indicator at the bottom, which replaces the iconic home button of iPhones past. As easy as it is to move lower controls out of the way of this small, constant line, doing so while maintaining an aesthetically pleasing design can be far from simple, depending on the app.


Many very popular apps have yet to be updated, the result being either that run floating, banded by black at the top and bottom in a familiar-sized centre rectangle or – perhaps of more concern to early-adopters – fill the screen in unintended ways that look broken and in some cases are.

The updates coming in the next weeks will understandably focus on basic compatibility with iPhone X; ensuring apps fill the screen inoffensively and behave as intended. While the potential innovative uses for the new found real-estate won't be realised for months to come, the X certainly has injected a healthy dose of enthusiasm back in to the iOS community and I'm looking forward to seeing what my fellow developers and I can come up with.

If you're looking for a good iPhone X review try Matthew Panzarino's one over at TechCrunch, he's had his review unit longer than most.