Recently I have went through the process of adding support for the new watch face complication sizes on the Apple Watch Series 7. Previously, I have used PNG images for the various complication image providers, but with these two new device sizes (41mm and 45mm) things would get a bit out of hand – I felt like it’s time to do it better. In the end, I have spent over 4 days working on this – and in this blog post, I will try to share my learnings and propose what I think is the best approach for having pixel-perfect complications on watchOS 8.
As you’re probably aware, today is the day that iOS 11 comes out! Apart from ARKit, CoreML and the like, it brings one huge change: a completely redesigned App Store.
How it used to be
For the past 9 years, ever since the first App Store launched on iPhoneOS 2.0 in the summer of 2008, the App Store was evolving very slowly. Developers kept asking for changes but most of us were losing hope that anything will happen. But we did eventually get a lot of what we asked for, such as video App Previews in iOS 8 or the ability to respond to reviews earlier this year. That being said, the App Store remained mostly the same in terms of layout and the overall concept.
In the past two days, I’ve worked on and finished update of one of my apps for iPhone X. There were a few challenges along the way, and that’s where this post comes in.
First of all, make sure to watch these sessions if you haven’t already. They will get you up to speed:
In this post, I’ll try to share some of the less obvious things that I came across and how I solved them.
With auto-playing App Preview videos in iOS 11 App Store, it is now more important than ever to make your videos shine and stand out. If your app is heavy on interactive transitions and gestures, you might find it difficult to capture that in the video without resorting to some complex post-processing tools like Final Cut Pro and re-creating the interaction touches on a frame-to-frame basis.
It seems like a forever ago since I released my last open source code, and, it is. Today, I’m happy to finally change that. I built a small UIPickerView subclass that lets users pick time the same way as UIDatePicker in countDownTimer mode does, but allows you as a developer to limit the input. It wasn’t terribly hard to implement but it did take some time, and since I believe that limiting the input is something a lot of people need, I decided to share it. I’ve been itching to open source something for a long time, and this seemed like a good fit. You can find the code on GitHub here.
Just a few hours ago, Apple launched Search Ads. I was looking forward to them ever since they were announced shortly before this year’s WWDC. I think they will be a great way to get our apps in front of customers in the best moment – when they are actively looking for a specific app.
Since Apple has yet to send out official announcement email, it’s still very early to take out any learnings from it. I want this blog post to be a documentary of my experiments with Search Ads, and hopefully to bring something valuable to our app developer’s community.
App Previews were introduced at WWDC’14 as a new App Store feature on iOS 8 that will allow developers to include 30 seconds video showcasing their app in action, right on the App Store. I believe it’s a great way to really show off your app to your potential customers right in the moment when they are considering the purchase or download. In this tutorial, I will show you how to make those previews even better.
App extensions were introduced a couple of weeks ago during WWDC 2014 Keynote as a way to extend the reach of your app to some parts of iOS (8), for example by creating a widget that will show up in Notification Center, or a custom sharing action. It’s no doubt a huge opportunity for iOS/Mac developers, so if you have an idea for a widget/extension, I suggest you start working on it as soon as you can.
If you are a registered iOS/Mac developer, definitely watch the WWDC Sessions Creating Extensions for iOS and OS X, Part 1 and 2 here. You will have a pretty good idea of what extensions are, how do they work and what you can do with them. The first part briefly explains how you can share data between your extension and containing app using NSUserDefaults, but neglects to point out some ‘pitfalls’ that you need to avoid in order to get it working. That’s where this tutorial comes in.
Warning: as of writing this (end of June’14), the Xcode 6 beta 2 (that you need to use to build your extension) has some bugs that might cause you some annoyance, but you can generally track down and then avoid the certain actions/scenarios that make problems.
What are you going to build
We are going to build a simple Today extension (that’s the name for iOS 8 widgets in Notification Center) that shows a number that can be set from the containing app (and changes made in the app will be reflected in the widget in real time). We’ll use shared NSUserDefaults to accomplish this.
If you are in the Twitter circles of young iOS developers, you’ve probably seen at least a few videos of scholarship apps created by students that are applying for this year’s WWDC scholarship. So I thought it would be a good idea to show off my app too. I’ve tried to make it short and sweet, instead of big app with a lot of effects and tons of texts, as I don’t expect Apple reviewers to spend too much time with each individual app. But when I saw some of the others, maybe I made it too simple. Anyways, here it is:
(I am sorry for the shaking, I should probably get a tripod for the next time :P)
As you can see, there is a simple intro implemented using UIKit Dynamics with different elasticity for each letter, and then a parallax timeline with my history. What you probably didn’t notice – there is also a little effect that distorts the texts during scrolling and make the texts sharp when it stops. That’s done using an attachment behaviour, changing the anchor point in viewDidScroll, and observing center point of the attached view, where I calculate distance between the centre point and the scrollView offset, and set the textView’s shadowOffset and shadowRadius based on the difference.
If you are interested in what others did, you can take a look at this GitHub page. And if you applied for the scholarship yourself, make sure to submit yours there.
All applicants will be notified of their status by April 28, that means 10 days from now. I was lucky enough to get in last year, so fingers crossed for all the hard-working newcomers!
In today’s programming tutorial, I’ll show you how easy it is to use OpenStreetMap maps in your app instead of default Apple maps. There are many reasons why you might want to do this: for example, the OpenStreetMap project is being built by a huge community of contributors and therefore the maps are really detailed; or, you might just want to give your users the option to use whatever maps they prefer.
Prior to iOS 7, it was also possible to use different map tiles than those that MapKit provides, but it required fairly large amount of code and work. Luckily, the map kit team introduced a really simple way to do this in iOS 7: new classes MKTileOverlay and MKTileOverlayRenderer. If you are a registered iOS developer, I highly suggest you watch the session 304 of WWDC ’13 here (requires ADC login). The introduction of it starts at 22:09.
You probably came here to see the code, so I’ll skip the explanation for now.
And… here it is!