Today marks 2,500 days since Storm Spotter first went on sale. I didn’t realize it then, but that day was a turning point in my career. I went from being a meteorologist to an app developer.
Unfortunately, Storm Spotter is no longer available on the store. It has been unsupported since I started working at WDT 4 years ago. It had small compatibility updates for iOS 6 and 7, but that is it.
The app itself still runs fine on iOS 10, but the server that it points to for radar data was retired by NOAA this month. At this point, modernizing the code enough to get it set for another release to change the radar server would take too much time. I was really surprised by the number of people who were still using it (based on support emails after the server went down).
Looking back at the app, I am embarrassed about some of my UI decisions in the app2. However, I am proud that the code runs just fine on iOS 10 even though the last OS it was actively developed for was iOS 5.
I hope the next 2,500 days of being an iOS developer are as fun and rewarding as the first.
Imagine standing in front of a stove with two pots before you. The pot on the left contains liquid that has been boiling for about five hours. The pot on the right also contains liquid but the burner was never on, and as such, is room temperature. Six minutes ago, the fire was turned off on the boiling pot. When this happened the liquid started to cool, however, it continued to visibly be boiling for another four minutes. So currently, neither pot has a fire under it and the pot on the left hasn’t been visibly boiling for two minutes.
Imagine placing your right hand in the pot on the right and your left hand in the pot on the left. Do you expect to feel a difference?
Continuous is a new app for doing real app development on the iOS using C# and F# written by the same developer who wrote Calca. The cool thing about it is that it has access to the built in iOS frameworks, so the app can be used to build real iOS apps right from your iPad1.
I don’t have much use for Continuous myself since I prefer to do my development in Swift, but I am excited to see more apps like this hit the App Store. Apps like Continuous and Pythonista (which also has access to iOS frameworks, this time in Python) show that there is a market for this type of app. People want to be able to use their iPads for development.
These apps show that it is possible to have a good IDE running on iOS2.
I listened to a podcast a few years back where the developer of Calca mentioned that the app was written in C#. I remember thinking it was a weird language choice at the time, but I have since learned that it is a relatively popular language to do iOS development in. Plus, I can’t argue with the results: Calca is an incredible app. ↩︎
One of the things Apple did with Xcode 8 was make the app take up a lot less disk space. It later occurred to me that part of the motivation for that could be to get it running on devices that don’t have as much storage space as most Macs. You know, like an iPad? ↩︎
RadarScope 3.1 is out today. There are a few small fixes1, but the big change is that RadarScope Pro is now an auto-renewing subscription. Switching to auto-renewing is good for everyone: customers will be able to more easily restore across devices and we will get an extra 15% commission when a user has been subscribed for more than a year.
Most apps are not able to take advantage of the new auto-renewing subscription policy changes until iOS 10 launches this fall, but weather apps are a special case and are able to use them now.
If you don’t want to automatically renew, you can subscribe and then go to your subscription settings and unsubscribe. You will still be able to use the subscription for the year it was purchased for.
My favorite is the new selected appearance of buttons on the map. ↩︎
Joe Groff put together a proposal to import any Objective-C interfaces that use
id to Swift as
Any instead of
AnyObject. This would basically allow Objective-C types to be bridged as value types more easily in Swift (and vice-versa).
The part that caught my attention the most was this.
Bridged value types with established bridging behavior, such as
Set, etc., should continue to bridge to instances of their corresponding idiomatic Cocoa classes, using the existing internal
_ObjectiveCBridgeableprotocol. The set of bridged types can be extended in the Swift implementation (and hopefully, eventually, by third parties too) by adding conformances to that protocol.
I am pretty excited about the idea of being able to bridge our own value types to different Objective-C representations. We are using Swift for all of our new code at WDT, but not all of our clients are. We have frameworks that both us and clients use that we are currently rewriting in Swift; but we cannot take complete advantage of Swift’s feature set because our framework needs to work in Objective-C too1.
I did a quick test and having our own value types conform to
_ObjectiveCBridgeable does let me transition them to Objective-C
NSObject subclasses automatically, but Joe warned me that using it could lead to bugs because the compiler is expecting a closed set up types to conform to that protocol.
The last official news that we heard on this subject was a proposal to open up the
_ObjectiveCBridgeable protocol being deferred from Swift 3. This new proposal does not include opening that protocol up yet, but it is a step in that direction.
Update 7/6: This proposal is in review here.
So basically no public
Justin Williams put together a list of what platform macros from
TargetConditions.h trigger each specific platform. The results are a mess. The worst one is that
TARGET_OS_MAC will target all of Apple’s platforms (macOS, iOS, watchOS, & tvOS) and
TARGET_OS_IPHONE is everything except macOS.
This is one of the most underrated improvements in Swift. Instead of
we can use something more like
The nice thing here that you don’t have to worry about if you are running on the simulator or not1.
Even better, starting with Swift 3 you can check for the existence of a framework. This is useful for frameworks that are supported on multiple platforms.
These are small improvements, but they make writing code that runs on multiple platforms a lot easier.
There is a separate check you can still make if you need to know that. ↩︎
I was prototyping a new app idea this week and I thought that it would be a great use case for Swift Playgrounds for iPad. This early stage of development usually consists of quick iterations and Playgrounds make that type of coding much faster because you can skip the compile and deploy steps.
Unfortunately, it seems that the performance of a Live View in the Playgrounds app does not have the same performance characteristics as that same view would have if run natively in a full application. In my case, it was an order of magnitude worse. The main thing I was iterating on in the view was performance, so not having a realistic view of how that view would perform in a real app was a non-starter. So it is back to Xcode on macOS in the meantime.
Hopefully this is something that improves as we get new iOS 10 betas over the summer.
It seems like every time a more experienced parent sees my little boy and asks how old he is, they always follow up with something in the vein of “Enjoy it now. He will be grown up before you know it.”
And here we are what after what seems like weeks after welcoming Oliver into our lives and he is already a year old.
In the first few weeks of his life, I remember holding him and singing to him while I rocked him to sleep in his bedroom. I knew then that moments like this would not last forever. I knew that and I was a little sad. “It does not get any better than this” I thought. “Enjoy this while you can.”
A few weeks later he would recognize Carissa and I and smile when we looked at him and played with him. Again, the same thoughts. It does not get any better than this.
After smiling came laughing. I would hold him in my arms and dip him down and quickly bring him up. He would smile and giggle uncontrollably. It does not get any better than this.
Next it was crawling. I will never forget the first time he saw me, stopped what he was doing, and crawled toward me. It does not get any better than this.
One of the most fun stages was eating. Carissa would put some spaghetti on the high chair. About half would make it into his mouth. The rest would be found scattered over his entire body, the wall, the floor, and the dogs. It does not get any better than this.
Now we are at the stage of walking. In the last few weeks he has really began to master it. He wants to walk and explore everywhere. But just like crawling, my favorite walking moments are when we sees me, giggles, and then starts walking so fast in my direction that he almost falls over1. It does not get any better than this.
During the first year, I was afraid of him growing up. I enjoyed the moments I was in is much that I failed to see that the next ones could be even better.
My days of thinking “It does not get any better than this” are over. I know better now.
Today Ollie walked up to me and put his arms around my legs and gave me a hug.
This is my favorite part of parenting yet.
Even though it has only been a year, I can barely remember what life was like before he came. I could not imagine going back to it.
Happy first birthday, bud. You mom and I love you more than you know.
The times he sees me, giggles, and starts walking as fast as he can directly away from me are fun too. That means that I am supposed to chase. ↩︎
Sho Baraka has been one of my favorite musicians since my early college years. He has an amazing ability mix in social and racial issues from our current society together with the teachings of Jesus and then present them a lyrically inspirited fashion. Listing to his music always challenges and inspires me.
His 2013 album Talented 10th (Apple Music, iTunes) is one of the best hip hop albums I have ever listened to1. I have been listening to his back a lot recently catalog recently and it had me thinking that it was about time to get some new music from him.
Fatherhood is a letter to two children (a boy and a girl) from a father (presumably him and his kids). Sho provided a great example of what Godly fatherhood looks like in today’s world. Since today is my first day being able to celebrate Father’s Day as a dad, his message is timely for me. The example laid out in the song is one I hope to follow.
Seriously. Go listen to it. ↩︎
The first day of WWDC 2016 is in the books. Now comes the fun part of analyzing everything that was announced and pouring over documentation and betas to find things that did not make the keynote1.
Instead of trying to cover everything, I just want to quickly discuss my favorite announcement as a developer, my favorite as a user, and a few things I was surprised to see that did not get updated.
Swift Playgrounds for iPad
This was the coolest thing of the Keynote for me. They took the Playground feature from Xcode and brought it to the iPad. It includes Swift 3 and a great code editing keyboard that uses gestures on the standard keys to insert common characters that are used while coding.
It was pitched as being a great way to introduce people (especially kids) to the concepts of coding. A few years ago, I led a small class teaching middle schoolers how to do some simple coding. Something like this would have made things way easier for both the kids and myself.
Outside of teaching, this app will be valuable for more experienced developers as well. Playgrounds on Xcode are already useful for trying with new APIs or building isolated components of an app. Because the iPad app has full access to all of the system frameworks like
UIKit, this type of quick prototyping can now be done on the iPad. It is not a full version of Xcode, but it is a lot closer than I think most people realize.
Messages for iOS
The changes to Messages for iOS were the consumer highlight of the Keynote. The list of additions is impressive.
- Message emphasis (like slam, loud, gentle, and invisible ink) and effects (like exploding backgrounds and confetti).
- Reactions for individual messages (like, dislike, ect).
- Apple Watch-like drawings and heartbeats.
- All Emoji-fiable2 words can be automatically converted from boring English3 to Emoji.
- Third party iMessage Apps + including a separate App Store to manage and discover them.
All of these things together make iMessage a much more viable competitor to some of the more modern chat apps to come out recently like Slack, Facebook Messenger, and Snapchat.
Some of the third party iMessage App ideas they showed during the keynote were already served by third party keyboards, but having these build right into Messages is going to provide a much better user experience.
The biggest problem of using a custom keyboard for things like animated gifs or stickers was searching. In a custom keyboard, you can not use the standard keyboard to do a search for whatever image or content you are looking for. So apps would either not include search at all or would build a half backed QWERTY keyboard into their extension that was never anywhere close to as good as the standard one. Since they can now be accessed from Messages4, I can still use my normal keyboard to do the search. This feature will pretty much kill third party keyboards for me.
I remember thinking that Apple was really falling behind in messaging after watching Google IO this year. With what they announced today, they have already passed Google’s new Allo app. They did not pass them by directly competing with them, but by allowing third parties to fill in gaps that Apple did not provide solutions for5.
One interesting side effect of iMessage Apps is that they basically rule out the possibility of iMessage for Android.
What We Didn’t Get
There are always some things that you hope get announced that don’t show up. While some of them are missing understandably6, some of them leave you scratching your head a little. The big ones that stand out for me so far are…
- Some system apps still do not support multitasking on the iPad7.
- The iPad multitasking app picker is still horrible.
- There was no mention of PiP on tvOS.
- Even though “OS X” was renamed to “macOS”, we are still using the “10.x” version numbering system.
I will go deeper into some of the other new things that were announced after I have time to read the documentation closer, go to some sessions, and play around with some code.
If you see me around Moscone or SF during the week, come say hi!
My favorite find so far is the ability to quickly unsubscribe from newsletters in the iOS Mail app. ↩︎
Or presumably other languages. ↩︎
Which was the only app I ever used them from anyway. ↩︎
The exciting this about this solution is that there is nothing that is preventing Google from putting some of Allo’s features right into iMessage. ↩︎
UIKitfor macOS. ↩︎
Thankfully, the new Apple Music app does. I’m sure I will have more to talk about for Apple Music, but I want to spend some time with it first. ↩︎
tl;dr — nope.
Welp. I got into my neighborhood pool for about 5 minutes yesterday with my iPhone still in my pocket. Once I noticed, I dried it off and shook as much water out of it as I could. When we got home I sat it in a tub of rice to sit overnight1. I would have preferred to let it sit longer, but I had to know soon if it was going to work or not since I am leaving for WWDC in the morning.
I had some hope that I would be able to get it working after watching this video of an iPhone 6s and a Plus that still worked after being submerged for 20 minutes. But for me at least, it turns out that the claims that the iPhone 6s line is more water resistant does not really hold water2. It looks like I will be dropping $330 on a replacement from the Apple Store tonight.
The worst part is that I had just taken what was probably my favorite picture of Oliver a few minutes before and that picture had not been uploaded to iCloud yet.
Since the main focus of this site will be Apple platform development, it seemed appropriate the first post should be about what I am expecting (and hoping) to see at this year’s WWDC. Plenty of other places have talked about what they want to or expect to see from a consumer standpoint, so instead I will try focus on looking at things from a developer’s perspective.
Xcode 8 and Swift 3
Since Swift is now open source, anyone can find out what is going to be included in Swift 3 just by looking at the activity on Swift Evolution. What we don’t know are how what (if any?) new frameworks will be announced and what new features we can expect form Xcode.
So here is what I am hoping we see.
- Swift web framework: There are third party open source Swift web frameworks available now1, but I think that this is an area that is too important for the future of the language for Apple to let this become fragmented by having too many competing standards. I think this framework is the primary reason that the first version of open source Swift included runtime support for Linux. Bonus points if they let you run host and run it in iCloud.
- Xcode support for Swift Package Manager: CocoaPods is a great tool that has helped create the iOS open source community, but having a dependency manager build directly into Xcode is the best path forward. It is ironic that the beginning of the end of CocoaPods comes right after they made it to Version 1.0.
- Swift refactoring: The
Edit in Scopefeature does a good job of changing a variable name within a single file, but being able to do it across an entire project like in Objective-C would be great.
- Faster Swift compiling: Title pretty much says it.
- Better Swift debugging: It is not uncommon for my variables to simply not show up when stopped at a breakpoint in Swift. Things improved quite a bit in Xcode 7.3, but we still have a ways to go. We need Twitter accounts like @jakesxcode to no longer be necessary or relevant.
Xcode for iOS
The main development related feature that I want is big enough to merit its own section. It is time for Apple to release a version of Xcode that runs on iOS.
Every time this topic makes it rounds, naysayers compare the iPad’s relatively tiny screen to that of an 27” iMac display. They claim that they could never get real work done working from a 12.9”2 display. People who use this argument are missing the point.
Xcode existing for the younger Apple OS will not make the Mac version go away. Even with an iPad Pro, I imagine I will still do 90-95% of my developing on the Mac. For me, the purpose of Xcode for iOS is to completely eliminate my need for a laptop.
When I travel to WWDC next week, I am going to have to take my iPhone, iPad, and a MacBook Pro. When I go to a coffee shop to get some programming done, I do the same thing. When I go on a trip and there is a slight chance that I may have to edit some code, I have to take my MacBook Pro.
I all of these scenarios, the only use of the MacBook Pro is for programming. My iPad is better for every other task that I used to use my laptop for (reading, writing, social media, web browsing, ect). A device who’s only purpose is using Xcode while I am away from my desktop is not a device that is worth keeping around.
Xcode for iOS does not need to be better than Xcode for Mac3, it just has to be a viable alternative.
iOS has become a robust OS in the last couple of releases, so there is not much low hanging fruit in terms of obvious features that I want to be added. With that being said, here is what I got.
- iCloud-powered reminders app: I want the Reminders app to get the same treatment this year that Notes got last year.
- System wide dark mode: A rumor that this is coming had been floating around for a while. I use dark mode in every app that supports it and most of the apps that I write are dark themed, so I would probably use this setting most of the time.
Inter-app notification API: This one is a little out of left field. I would like for apps to be able to register that they send certain types of notifications. Other apps (including apps from other developers) would be able to get a list of available notification types and register for them and execute a background task when that notifications fires.
An example of this would be Day One posting a notification when I finish a journal entry and Streaks seeing that notification and automatically marking my daily journal goal as completed. Things like this can already be done using the HealthKit APIs, but it would be nice to see them expanded to work across third party apps as well.
It would be even better if the notifications were posted across devices using iCloud so I could write my journal entry on my iPad and have an app on my iPhone respond to it.
This would allow all kinds of “if this then that” actions and automations.
- Instant apps: This is basically the same feature that Google announced for Android at IO a few weeks ago. From a technical standpoint, it would be a combination of three iOS technologies that already exist: deep links, app thinning, and app extensions.
- Embedded app extensions: App extensions inside third party apps are currently only only available through the action sheet. This leads to awkward interactions with things like 1Password where you have to present a share sheet with only 1Password visible. It would be much better for the app to be able to query for a particular app extension and launch it directly.
- Better phone call UI: Phone calls should have an option to have the same notification UI as a normal push notification. Taking over the entire screen while I am using my device (especially on my iPad) is obnoxious.
- Support for animated
MKOverlayson top of
MKMapViews: Having animated content (like moving radar) on top of Apple Maps is a hack job right now. I would like an official way to make it work. More on this in a future post.
iPad Specific Changes
While I feel like things are going well for iOS on the phone side of things4, I feel like the iPad needs some bigger changes.
Improved support for multiple apps: Split screen multitasking was the best feature in iOS 9, but it left some room for improvement. The app picker for the secondary app is, to put it simply, not very good. The team over at MacStories did a concept video a few months ago that included a great take how to make this better.
Other ways to improve multitasking would be to allow groups of apps to be saved together similar to full screen mode on the Mac instead of the app on the right being permanently pinned there.
To take things even further, it seem inevitable that iOS apps (at least on the iPad) will eventually be able to run in a full windowed mode5. Maybe 2016 will be the year.
Better external keyboard support: Like multitasking, this is an area that received some attention in iOS 9. I think that Apple should make it as easy to control an entire app with a keyboard as it is to add accessibility support to an app. I think they way they do it is to use
UIFocusEngine, which currently powers the interaction model of tvOS6.
Also, there should be a better way to bring the software keyboard up while a Bluetooth keyboard is still connected (other than toggling the Bluetooth switch in Control Center). This would be useful for pulling up alternate keyboards for GIFs or emoji or for when you grab your iPad to sit on the couch but it is still connected to the keyboard back in the kitchen.
Better notification UI: This is a small thing, push notifications on the iPad should not span the entire top of the screen. They should display in the top right corner similarly to how they display on the Mac.
The biggest mystery here is what they are going to call it. Not change anything and go with OS X 10.127? MacOS? macOS? Will it finally go to 11?
My favorite of the group is macOS 11, but my bet is MacOS 11. We will see.
On to the real stuff.
- Siri: I don’t care about using Siri on the Mac at all. As said I before, the primary place I use a Mac is at my desk at work where using Siri would be rude to my coworkers. I want this because it shows a dedication to improving Siri as a service. More on that in a bit.
- UIKit: This is probably my biggest wish for WWDC this year8. This would lower the barrier for creating a good Mac app quite a bit. More importantly, it would cut down on the number of apps that are just ported to the Mac as a wrapper around a web view. Ben Sandofsky had a post on how this could be achieved technically.
- iTunes: Burn it down and start over.
There a lots of things that I would like in watchOS, but most of them would require new hardware. I will try to focus on things that could be achieved with the current version of Apple Watch.
- Better graphics support: I would like to have access to
MetalAPIs from a watch app.
- Better Digital Crown support: We currently have indirect access to Digital Crown, but having a
Floatvalue of how much it changed would be more useful. This plus the graphics API access mentioned about would allow for some big improvements to the RadarScope watchOS app.
Less reliance in the phone: Most of these changes would have to come in hardware, but there are some API behavior changes that could be improved.
If the watch app needs something from the internet, the documentation tells us to use
WCSessionto open the app on the phone and then transfer the data to the watch.
The watch app has the ability to use
NSURLSessiondirectly, but it is really slow for even simple network request. In my testing, it is faster to open the app through
WCSession, make the request, and pass all the received data back to the watch than it is to simply make the request directly on the watch.
NSURLSessionon the watch should be made to work as fast as round-tripping to the phone through
WCSession9. This would let the watchOS and iOS app use the same API to make network calls and leave the implementation of who is actually performing the network request to the OS10.
It would also allow the watch to use the same code path regardless if it were connected to the phone or not11.
- Access to iCloud APIs: This is exactly the same as before, but insert “iCloud” everywhere you see
- Content aware Complications: Complications should have an API to determine if they have something interesting to show and allow other complications to take their place if they don’t. For example, my Things complication can go away and be replaced with Streaks once I finish all of my todos for the day. An ESPN complication can be set to only display if one of my favorite teams is playing.
- Third party watch faces: Because why not?
- Reminders app: I’m not sure how they shipped without this one.
Since this one just launched, I don’t have too much I want to ask for here. Most of my requests are more consumer based than developer based.
- API for HDCP: This is needed for third party apps to show copy protected videos on tvOS. I want it so the excellent Channels app would work with all my Cox channels, which would allow me to completely drop my cable box. More info can be found here12.
- Picture in Picture: This one seems obvious. Only a matter of time before it happens.
- Push Notifications: Severe weather, sports, and breaking news notifications seem right at home on the TV.
- Handoff > AirPlay: When wanting to play something from my phone on my AppleTV, I should be able to use Handoff instead of AirPlay to send it. AirPlay keeps it coupled to the phone too much.
- Games that require a controller: This was originally announced, but Apple changed their mind before shipping. This would go a long way toward more complex games coming to tvOS13.
Siri was looking pretty inadequate in comparison to what Google announced at IO this year and to what Amazon is doing with Alexa and Echo. Fortunately, a well-timed leak to The Information gave the Apple faithful a little bit of hope for WWDC. So here is what we can expect.
- Siri API: We have been waiting for this since Siri was announced. Luckily, The Information report said that it is coming. I have no idea what this is going to look like, but I image it would be some kind of app extension.
Stand alone Siri device: I am pretty excited about the idea of this. I have been intrigued by the Echo since it was announced, but I have never considered buying one because all of my music library is tied into Apple Music and iTunes.
I am hoping that this device is more than a speaker with Siri. On a recent The Talk Show episode, John Gruber speculated that it would have a camera and possibly even router capabilities.
For either once of those bullet points to have any real effect on Siri, the service simply has to get faster and more reliable. It has improved quite a bit since launch, so I have at least a little hope that it can continue to get better.
One More Thing
I thought that a fun way to end would be to leave with a semi bold prediction for what we will see next week. So here goes.
I expect Apple to announce their Siri Speaker with some type of Beats co-branding. The main version will include a Time Capsule, camera and cable modem14. The camera will be used in part for identifying who is speaking to it. A smaller satellite device similar to the Amazon dot will include a speaker and wifi extender. It will be available late summer, but every WWDC attendee will get a free one at the conference.
I don’t really see all of that happening, but I did say at the top this was a Wish/Guess list. File that squarely in the Wish category.
If you made it down this far, thanks for reading. I will be back early next week with some high level thoughts on the Keynote and State of the Union. Throughout the summer, I will dive deeper into some of the new things that get announced throughout the week.
If anyone reading is going to WWDC next week wants to say hi, ping me on Twitter at @rosskimes.
Or even worse: 9.7” ↩︎
Everything listed above is pretty minor. ↩︎
Again, Steve T-S with the scoop. He found that
UIFocusEnginewas added as a private API in iOS 9.1. ↩︎
I sure hope not. ↩︎
Although Xcode for iPad is right there with it. ↩︎
Possibly by using
WCSessionunder the hood. ↩︎
Google announced something very similar to this at IO this year. ↩︎
Which would of course be useful for an eventual LTE Apple Watch. ↩︎
A good first party controller wouldn’t hurt either. ↩︎
I can dream, right? ↩︎