Ben Norris

iOS 10 and my apps

After consuming much of WWDC last week, I wanted to take a few minutes and consider how my apps could be affected by the new announcements. Since I mostly sat in my office at home and watched live session videos, some effort is required to make sure that the videos can translate into action and improvement. I thought I would take each of my active projects in turn, or rather active and semi-active projects, and consider the state of the app, and how I might incorporate some new technologies. Most of this will be “thinking out loud” so that I can try and process some of what I learned.

Align

Align is a new app that I am helping create in my day job at Tanner Labs. Our focus is to make managers better by leveraging the one-on-one. The tool will start out simple, as a way for managers to track one-on-ones and help them prepare, execute, and follow up. We will be launching this with both an iOS app and a web app, built on Firebase as a back end.

SiriKit

One of the first thing that I thought of is the possibilities of integrating with Siri. As Apple expands Siri to be integrated with third-party apps, they are starting with six domains: messaging, voice/video calls, payment, ride sharing, workouts, and photo search. Of those, I think that messaging could potentially be a good fit.

Comments

One of the keys with a one-on-one is the comments that can go back and forth between the manager and team member leading up to the meeting. That can help the team member to feel engaged and empowered to affect the content of the meeting, and to avoid anxiety or the “called-to-the-principal’s-office” feeling. Part of the challenge with integrating with SiriKit would be identifying which one-on-one to add comments to, so I think I would either have to default to the next one coming up, or consider scheduling one through the interaction. This kind of experience is not exactly what Apple seemed to have in mind, so I will have to explore it more and see how it might feel.

Coaching Items

An interaction that we have considered for Align is the ability for a manager to create a coaching item for a team member. This would be essentially a note that the manager creates to follow up with the team member on some point, whether to praise and recognize or to provide correction. The idea is that it should be an extremely quick interaction to capture something that would then be discussed later with the team member. This was actually one of the first things that came to my mind with SiriKit and Align, but as I think about it more, I think that it might not be the right fit. For the messaging domain, Siri is expecting to get a recipient from the user. The voice prompt would be something like, “Tell John using Align that…” The problem that I see is that the resulting action would be to create a coaching item for the manager to discuss with the employee later. It makes sense as a use case, but we will have to see if the interaction feels natural.

iMessage App

Making Messages into a platform allows for much richer interactions that start while messaging with someone, and never leave that experience. I anticipate that some of the best implementations of this will be collaborative experiences, where the participants can go back and forth on something before it is finalized. This seems like it might be a great fit for preparing for a one-on-one. It would allow for a manager to send a team member the proposed agenda and other details for the one-on-one, and for the team member to have an easy way to provide input, or make suggestions to the agenda. This kind of interaction would require the team member to have the app as well, so we may or may not want to pursue this, but I think it could be powerful.

Notification Service Extension

With iOS 10, notifications are now a powerful interaction point, and I want to make sure that we take full advantage of this. We will need to think through the design of a custom UI to show with notifications. We will have different kinds of notifications that users will receive, and each will have to be considered separately. One of the main things that should be featured in our notifications is the images of the team members involved in the notification. That will make it easy for a user to connect with the information and to encourage a personal approach.

Search

In iOS 9, Spotlight integration was added, and this is definitely a feature that we should take advantage of. It should be simple for a user to find their one-on-one information by searching on the phone. With the addition of app search integration into Spotlight, this becomes even more compelling. As we build search into the app, I need to make sure that we do it in a way that we can easily facilitate this powerful interaction.

watchOS 3

I have been planning on building some kind of Apple Watch app, although I am not sure exactly what the focus should be. However, with some of the changes in watchOS 3, I think the focus is much clearer. Since apps will stay “active” for eight minutes after launching them, it becomes much more feasible to have a Watch app be a reference point. If you are in a one-on-one, it could be powerful to have your agenda easily glanceable on your wrist so that you can be checking as you go to make sure that you both stay on time with the meeting, and cover everything you intended. A natural complication would be to see the next or current one-on-one, and that would make it easy to launch the app and be ready to execute the one-on-one. An implication of that interaction could be to make the agenda points completable, so that you could check them off as you go, in order to remember what is left. We will have to see where that goes.

Final Thoughts

Many of the system-level integrations in iOS 10 are focused around location- and communication-type apps, which does not exactly fit Align. For example, it would not make sense for Align to become the preferred messaging app for communicating with someone, and so I would not want to provide that information to Contacts. I need to make sure that I appropriately tag any input fields so that I can get meaningful Quick Type suggestions for things like people, contact information, or locations. I should also take advantage of the Universal Clipboard, and make sure that I am a good citizen there. I think that is about it for Align. Good stuff!

Pointedly

Pointedly is actually my first app released to the App Store, and continues to be one of my favorites to work on. It is a simple app to keep score in board games, or card games, or anything else that could use tracking. In many ways, it has served the purpose of being a playground for me to try out new technologies as they make sense for the app. It is currently a stand-alone app on the iPhone with the data not synced or shared in any way.

CloudKit Sharing

This is huge for me. I have been wanting to build a back-end syncing mechanism for Pointedly so that you can easily track all of your games across your devices, but I have not implemented one yet. Part of the reason was that I wanted to be able to share games, and had not decided on the easiest way to do that yet. This feature is exactly what I was hoping for in CloudKit, without even thinking of it as a possibility. I had wanted to explore different options for collaborating on a pointcard, such as having it be public, and allowing anyone to join, or sharing with an individual. From the session explaining this, I think that I can accomplish exactly what I want while keeping the data private and only shared as needed. You can either share with a specified individual, or else anyone with the link so that you could post the link in some place like Slack for anyone to join that had access. There are still a number of things that I need to think through here, like how to share the players that are involved in a game, but this is definitely the answer for me.

iMessage App

I am not completely sure about this yet, but I have been thinking that it would be fun to send someone a pointcard in Messages, and collaborate with them that way. It seems that there are a limited set of scenarios when this would make sense, and most of them would probably be better served by using CloudKit Sharing from within the app, but it remains an intriguing possibility. This is also a technology that I want to understand better, so in some ways I want to explore adding this just to gain experience with it.

watchOS 3

Now that Apple Watch will have directly CloudKit support, and I will probably be adding CloudKit, this makes more sense. Combined with the enhancements to keep the app running for longer, using your watch to quickly enter the score for a game feels like a great feature. The crucial thing would be to figure out how to allow for a score entry that can easily be done in under two seconds. You have to select the player and input the score in the way that makes sense and then easily get an overview of the game progress. I will have to decide about creating a pointcard, and whether to allow that on the watch, or to require the iPhone for that. It seems like it would make more sense on the iPhone, but if I can find a fast way to do it on the watch, that would be nice. Finally, I think I would definitely want to use Handoff and encourage the user to go back to the phone to share the results at the end of the game.

tvOS 10

No customers have asked for this, and it would not make too much sense to invest a lot of time in developing this, but again, since tvOS supports CloudKit, it should be fairly simple to create a version to run on the Apple TV. I would have to possibly rethink some of the interactions to make them simpler, and consider having different views for the TV. For example, it might make more sense to have the Apple TV version be a display of the score that is entered from people’s iPhones or Apple Watches. But since they would all be getting their data from the same place, this could be compelling. Maybe I could develop simple charts that show the progress of the game in a meaningful way, or simply have a fun visualization of the current status of the game. It is at least something to consider.

Final Thoughts

Most of the newly announced technologies in iOS 10 are not a great fit for Pointedly. One of my goals is to keep the app extremely focused and avoid letting it become bloated by trying accommodate everyone’s needs or adding features gratuitously.

Whimmy

Whimmy is an app I created together with Stotion to make it easier to get together with the people that matter in your life. You can send an invite with a fuse that fills up once the capacity is reached and avoid the back-and-forth of text or email. The app is on iPhone, Apple Watch, web, and an Android beta.

SiriKit

I was so excited to hear some of the details for SiriKit because I knew it would be a great fit for Whimmy. You would not necessarily use Whimmy as your preferred messaging app to contact someone because it is more focused around events. We designed it from the beginning to streamline the process of creating and responding to invites, and integrating with Siri is a natural extension of that. My only concern is honing the experience to get all of the right information through Siri. Currently, an invite includes recipients, message, location, capacity limit, and an expiration limit. That feels like a large number of data points to capture through Siri, so we will have to see how it feels.

One of the features that we have been thinking about adding to Whimmy is the ability to comment on an event. That would make for a powerful and quick interaction to use Siri to reply to an invite, or continue the conversation. Part of the challenge would be correctly identifying the correct invite for the comment from Siri, but that is something that we could hone through testing.

Notification Service Extension

The ability to add custom UI to a notification when the user views the details is extremely exciting. For Whimmy, this would give us the ability to provide rich information when a recipient receives an invite, such as the people attending, potentially a map view of the location, and a visualization of the time remaining to respond. I love the challenge of figuring out how to build the designs that Stotion comes up with, and this would be another prime opportunity.

Custom Notification Responses

One of the demos with the advances in notifications included a user responding to an invite. The actions for the notification were: Accept, Decline, and Reply. In the Reply action, the user could send a textual reply. One of the advances this year is that in addition to the text, I could build UI to allow the user to also accept or decline the invite. This is definitely something that I want to take advantage of with Whimmy as we build the commenting feature.

iMessage App

If you already have a group message going with your friends, integrating Whimmy to create an event is a logical next step. As I mentioned earlier, we are planning to add comments to an invite, but that feature would not be needed in the context of the iMessage App version of Whimmy. You would already be chatting with your friends in Messages, and Whimmy would serve as a way for you to create an invite and easily allow your friends to respond.

It could make sense to send an invite to an individual person as well through Messages. You would want to be able to send the same invite to multiple people, so you would have to be able to choose from existing invites, or to create a new one. In some ways, this could easily feel redundant. Whimmy already allows you to send invites to people, even if they are not users of the app. I think we would need to do some user research to see how people would want to use the app.

SpriteKit

This is not a new technology, but it is newly available on the Apple Watch, and something that I think we could take advantage of in Whimmy. With the expansion of SpriteKit to be on all iOS-based platforms (iOS, watchOS, and tvOS), this is a technology that I want to become more experienced with, even in UIKit-based apps. There are a number of animations that we use in the Apple Watch app of Whimmy, particularly in notifications, and we could convert those all to SpriteKit, and expand them to the rest of the app with good results.

Final Thoughts

Whimmy has not been under active development for quite some time, but the potential is huge. I love the concept and believe in the purpose of getting people together more. It also serves as a great playground for me to experiment with different technologies and push myself as a developer. It does not make sense to invest a ton of time and effort into this app, but it is one that I really enjoy working on, and plan to consider for many of the announced changes.

Recite

Recite is an iOS app to facilitate memorizing scriptures, quotes, and other short passages. It is currently an iPhone app with an Apple Watch app, again with completely local data.

CloudKit Sharing

This is another app for which I have wanted to add some kind of syncing. I built the app for my family to use in our morning devotional, and it has worked really well for that, as long as I am home. However, since it cannot be shared, my wife is not able to use it if I am not there, and I have wanted to fix that. So I think CloudKit Sharing will be a great fit here as well.

I am currently storing content packs as downloadable in-app purchases through Apple, and have been thinking that I might change the business model a bit. If I do, the public CloudKit database might be the right place to store the data to make it easily accessible to everyone. I want to think through this more, but I feel like CloudKit will play a large role in this app moving forward.

Summary

iOS 10 and watchOS 3 provide some great opportunities for me to enhance the apps that I am working on already. It is probable that I will not be able to implement all of the ideas that I have had in this post, but this has been an extremely helpful exercise for me to consider each app in turn and think through the possible implications. I look forward to mastering some of these new technologies and adding them to my toolbelt so that I am ready to make use of them as I continue to create new apps.


📖 Leverage Point

By Gerald N. Lund


📖 Life and Death

By Stephenie Meyer


WWDC 2016 Sketchnotes posted on @sketchnotable

WWDC 2016 sketchnotes

UHEA 2016 Sketchnotes posted on @sketchnotable


Fixing local problems with a Carthage version number

As I discussed previously, we are using Carthage and Git submodules to manage our dependencies. Since many of the frameworks that we are pulling in are frameworks that we are writing, we sometimes run into an issue where we have changed the version number of a release for a framework to be the same as a previous version. This does not happen often, but can happen if you have made a release, and then later deleted the release and the tag and made a new release pointing to a different commit.

The problem is that when you update a framework via a Carthage dependency, a local cache of the repo is saved, along with the version number tags. If you change your Cartfile to reference a version number that was previously downloaded, Carthage will use the locally cached version instead of getting the latest update from GitHub.

Solution

  1. Using Terminal, navigate to the Carthage cache.
  • cd /Users/[username]/Library/Caches/org.carthage.CarthageKit/dependencies
  1. Remove the directory matching the framework that you need to force to download.
  • rm -rf FrameworkName/
  1. Back in your project directory, update again from Carthage.
  • carthage update --no-build --use-submodules
  • Edit: carthage checkout works better for this. Thanks Tim Shadel!

Summary

Your framework will download from GitHub at whatever version number you have specified, and you should be set. This is mostly a reference for myself for the next time that I need to remember how to do this, but hopefully it can help you as well.


Using Carthage to add third-party code

In almost every project that I create, I bring in frameworks and libraries. After trying a number of different approaches to make this easier, I have landed on a system that uses Carthage, and Git submodules. The system basically comes from a post by Bart Whiteley, but I wanted to record all of the steps so that I have them in one place for my own reference.

The advantage of this system that you have all the control of submodules, while having the ease of using Carthage to keep dependencies in sync. You can easily change the version number of the dependencies in Carthage, and then commit the update to the submodule, making it easy to work across teams.

Pre-requisites

  1. Create a workspace with your project included.
  2. Set up a Cartfile with your dependencies.
  3. In Terminal, run the command carthage bootstrap --no-build --use-submodules.
    • Make sure that you have carthage installed (documentation).
    • This will clone or fetch all of your dependencies, and check them out as git submodules in your project
    • Note: You only need to run bootstrap once in your project. After that, you will run carthage update --no-build --use-submodules.

Bringing in a dependency

  1. Find the FrameworkName.xcodeproj file for the dependency in .Carthage/Checkouts and add it to your workspace.
    • Make sure that you drag the project to the far left so that it becomes a workspace project instead of a subproject under an existing project.
  2. In the General tab of your app target, add the framework to “Linked Frameworks and Libraries” by searching in the workspace.
  3. The framework should show up in your Project Navigator. Drag it to a folder according to your project organization.
  4. Add the same framework to “Embedded Binaries” in the General tab.
  5. This will probably create a duplicate entry in “Linked Frameworks and Libraries” which you should remove.
  6. Select the framework in the Project Navigator, and change the Location to “Relative to Build Products” in the File Inspector panel on the right.
  7. Edit your project file (ProjectName.xcodeproj/project.pbxproj) in a text editor.
    • In the PBXFileReference section, find the entry for your framework.
    • Edit the path property to be simply FrameworkName.framework. You will probably be removing a long, absolute path reference.
    • The sourceTree property should be set to BUILT_PRODUCTS_DIR.
  8. In the Build Settings tab of your app target, find the “Framework Search Paths” option. An entry pointing to the framework in .Carthage/Checkouts has probably been added, which you should remove.
  9. Build the project and make sure there are no errors.

Additional information

When someone else checks out the project, it is not necessary to run any carthage commands. Instead, they will update the submodules. This can be done in Terminal, if needed, using git submodule update --init.

Conclusion

It is always a challenge to find the best way to incorporate third-party code in a consistent, repeatable way that works well for individual developers as well as automated build systems. This has worked well for us, and hopefully will help you and your team as well.


🎥 Captain America: Civil War

with brothers-in-law


The Luxury of Launching into Obscurity

As I was getting my blog ready, there was a large part of me that wanted to hold back until I had something meaningful to contribute. But there was another part of me that realized that at this point, it doesn’t matter. When I launch my blog, no one will notice. When I write a new post, I will be the only one that will care. If there are problems, or if there is something with which I am not happy, I can change it easily, and no one else will ever know.

This feeling of obscurity is simultaneously intimidating and empowering. I have already considered some of the empowering consequences, and now want to explore more of the intimidating aspects. When you know that almost no one will consume what you create, there is little incentive to deliver quickly. It can be extremely hard to build the discipline to start shipping.

So how do you conquer this?

One thing that I have learned in shipping my apps is that when you focus on creating something that is meaningful, people appreciate that. My first app, Pointedly, was a project that was part of my path in learning iOS development. I worked on it together with my 7-year-old son, and we used it often as a family, and my wife and I made decisions together about the business side of the app. Every time that we had a trade-off between making a solid business decision for ourselves or improving the user experience, we focused on the users. One example was the business model. Many people counseled me to either have a paid app, or require an in-app purchase to access all features. We decided instead to make the app completely free, and add in-app purchases to allow users to support the app with a tip. We have been pleasantly surprised that many people have been willing to give tips, and have left positive reviews.

I know that this isolated example will not hold true in all circumstances. But the lesson that I have taken away is that a focus on users will often be rewarded. Pointedly is not in a position to build a business on, and I am definitely not ready to support my family on the income from the tips, but it is a first step. The piece of the app that I hope will be the foundation for my business is a focus on users first. I firmly believe that when a business focuses on users and their needs above the needs of the business, the business will be more successful in the end.

To tie this all back together, even when you have no audience to receive your work, do your best work. Focus on improving the experience of your users, and when faced with a decision, choose your users. Start shipping, and as you ship, make sure that what you ship is work of which you can be proud. Allow the empowering effects of obscurity to drive you forward. Take advantage of the time you have to launch into obscurity, because there will come a day when you no longer have that luxury.


Finally getting started

Back in January of 2016, I had a discussion with my manager and made some goals for the year. One of my main goals was to start blogging. I have been heads down on coding for the past year and a half, and had always meant to start recording some of thoughts and contributing back to the community, but just hadn’t started yet.

Part of me felt that I needed to gain more experience and learn more that was actually worthy of being shared. But then I noticed that many of the people that I was following, and that I respected most, were sharing concepts that they were just trying out, or that they were wanting to learn. I was especially inspired by Natasha The Robot, and her bite-sized posts that clearly explained different things she was figuring out.

As I continued to try new things out, and learn more about the craft of creating iOS apps, I started compiling a list of blog topics. Over the next few months, I hope to get in a habit of capturing my process, my goals, and my learnings along the way. At the very least, I will start building a repository of knowledge for myself to easily refer back to when I forget something that I have learned. Hopefully the things that I learn and that I share will be valuable to others as well.


📖 🛏 The Boys in the Boat

By Daniel James Brown


🎥 The Jungle Book

Date


📖 Pride and Prejudice

By Jane Austen


🎥 Batman v Superman

with brother-in-law


📖 The Sculptor

By Scott McCloud


🎥 The Good Dinosaur

with four older kids


📖 Shift

By Hugh Howey


📖 The Sculptor

By Scott McCloud


📖 🛏 John Adams

By David McCullough


🎥 Pride & Prejudice & Zombies

Date


📖 Wool

By Hugh Howey


📖 Tactics of Mistake

By Gordon R. Dickson


🎥 The Peanuts Movie

with four older kids


🎥 Star Wars: The Force Awakens

with three older kids


🎥 Star Wars: The Force Awakens

with Utah iOS Slack team