Developing a SharePlay Game

During the week of WWDC I kept wondering to myself if it would be possible to create a multiplayer game using SharePlay, aka GroupActivities. Apple advertised the upcoming feature of iOS 15 as a way to watch movies and listen to music with your friends on a FaceTime call, but after looking at the API I saw that it supports custom activities that can be used for sharing any activity you can imagine.

Like many others, I played quite a few multiplayer games over video calls with friends and family during the bulk of the pandemic when we are all desperate to connect with people that we couldn’t visit in person. I knew that, although far from a perfect substitute for in-person interactions, being able to see and talk with friends while competing in video games together was still a really fun experience. So I set out to see if it would be possible to create a fun, engaging, multiplayer game that was designed to play along with a FaceTime call once WWDC was over.

I spent the whole summer, and then even more time after SharePlay was delayed until iOS 15.1, building a prototype and slowly getting all of the pieces working reasonably well enough to prove to myself that it could be done. I released SharePlay Guessing Game on October 25, 2021, the same day that iOS 15.1 and SharePlay were released to the world.

Along the way I learned the ins and outs of the SharePlay API in a way that few others have (based on the relatively small number of SharePlay-enabled apps on the App Store) so I thought it might be interesting to share some of the things I learned about SharePlay.

What is SharePlay?

For those who may not already know, SharePlay is a new framework that Apple introduced in iOS 15.1 which allows people on a FaceTime call to watch movies or listen to music together. One person initiates the SharePlay session and everyone else on the call is invited to join. Once everyone has joined, the movie or music is automatically synced up for everyone in the session, which includes pausing and seeking the content. Since you’re on a FaceTime call you can see and hear everyone else on the call while you watch the movie or listen to the music.

If you use Apple’s built-in audio/video player in your app then implementing SharePlay is trivial. If you have a custom player, then you just have to handle callbacks for play/pause/seek in your media playing app. However, there is a third ‘custom’ mode available which has endless possibilities as it allows your app or game to share data with each other through the FaceTime connection.

This post won’t be a coding tutorial on implementing custom SharePlay experiences. Apple has a code sample and lots of documentation on this. Instead I just hope to share some interesting observations and issues that I encountered when creating my SharePlay game.

How To Share Data Between Players?

When you first dig into the SharePlay API, you will notice that there are two different ways that you can share data between the participants. How do you know which method to use?

The first way that data can be shared is through the struct (or class) that you create that implements the GroupActivity protocol. You can put anything you want in this entity and it is Codable and automatically shared among all participants, so it might be tempting to store state in it, but I recommend storing the minimum amount of data possible in it. It is better just to store mostly immutable properties that you need to start the activity on each device, such as the movie to watch or the settings for the current game. I first attempted to store game scores in it, for instance, but I found that if multiple participants are constantly updating the stored data in the GroupActivity, it will be continuously copied and sent to all participants and while it will eventually converge, there will be times where some participants have inconsistent views of the data. And you don’t want participants to all have their own unique view on the current state of the game.

The second way to share data is through peer-to-peer message passing. This is the preferred way to send data to other participants because it gives you more control over exactly what you are sending and to whom you are sending it. In my game, I use message passing for keeping all of the game state up to date: when each round is started, when a question is answered correctly, every drawing stroke, etc. The one downside to using message passing rather than sharing state in the GroupActivity entity is that the GroupActivity is stored in the SharePlay session so it persists as long as the FaceTime call is still going. So, theoretically if the game scores were stored in the GroupActivity and my game hit a bug and crashed for all participants, they could just rejoin the activity and the scores would still be there. In my case, though, my game is super casual so if the scores are lost and a new activity has to be restarted it’s not that big of a deal.

No Server Required: A Double-Edged Sword

When designing a new app, I spend an inordinate amount of time thinking about the tradeoffs of building a back-end for it. Most of the time the back-end will cost you more money as it scales. What if this freemium app takes off and the server costs bankrupt me because the business model doesn’t work? Or what if I build it on a service that goes away next year (remember Parse?) and I’m forced to reimplement the whole thing?

One of the nice things about SharePlay is that you don’t necessarily need to run a server in order to create a multiplayer game. But SharePlay being peer-to-peer presents its own complications that you should be aware of. The biggest complication is that there isn’t one arbiter of truth like you would have with a server-based game engine that keeps track of the game state, scores, etc. So you have to run the same game on all of the devices and synchronize them through message passing and shared state and make sure they all agree on what is going on.

Figuring out how to make different instances of the game all agree on the same game state and scoring was the most challenging part of making the game for me. How do you progress from one round to another for everyone at the same time? What happens if two players guess the answer at the same time? How does everyone agree on the scores? This post is intended to be an overview of SharePlay development, but if you would like to hear more details about how I solved these issues, I can go into more details in a followup post. Let me know if you would be interested in that.

Needless to say, it takes a different mindset to figure out how to coalesce a shared game state instead of having one single game state contained within a server. However, the benefit of not having to provide your own back-end in order to provide a multiplayer game or activity is a huge win.

Handling the Chaos

Another interesting aspect of the peer-to-peer nature of SharePlay is the fact that anyone on the FaceTime call can initiate or replace a shared activity at any time. And anyone can drop out or come back at any point. This adds a special kind of chaos to a multiplayer game, which I think lends itself more to a casual game than a more serious one. If you keep track of scores, but in the end they don’t really matter that much, then the stakes are much lower when some joker on your call starts sharing a new episode of Ted Lasso and your game comes to an abrupt end. Conversely, imagine what would happen if any of the 100 participants in a Fortnite Battle Royale game could just end the game for everyone playing on a whim.

All of the chaotic actions a group of people on a FaceTime call can initiate makes for lots of different strange edge cases that can be difficult to debug and subsequently reproduce. What do you do if a new player comes in half-way through? What if you have a Guess The Drawing game and the person drawing leaves before the round is over? What happens if everyone leaves the activity at the same time? The best way to cover all possibilities is to test with multiple players as much as you can, which brings me to my next topic.

SharePlay Testing is Hard

It’s never easy to test new APIs on iOS betas, but the difficulty is increased to nightmare mode when you need to have multiple people and devices all on the new half-baked iOS beta in order to test a multiplayer game. You can use iOS simulators to see how the UI functions on different devices, but since SharePlay requires an active FaceTime call, it is not possible to test everything on simulators.

Trying to test on two devices by yourself is also difficult because you have to mute and turn the volume down on all but one of the devices to avoid brain-searing audio feedback issues. Luckily my son, like all tweens his age, is borderline obsessed with video games, and so he was always up to help me test my game as long as it didn’t count against his carefully allotted screen time.

Now that iOS 15.1 has been released to the general public, you likely won’t run into the problem that I had initially. Not only did I have to find people to help me test that were on the iOS 15.1 beta, but they had to have friends who were on the iOS 15.1 beta as well. And the more people you have testing simultaneously, the more chaotic things get, which is great for testing edge cases, but is not great for being able to properly log any discovered bugs. Special shoutout to the iOS Folks Slack #sf-coffee crew who spent many evenings doing a very good job helping me break the game in so many different ways.

Conclusion

Hopefully this post gives you some idea of the benefits and challenges of adopting SharePlay for your app or game. Despite the limitations and difficulty in debugging and testing, overall I found the framework to be quite powerful and relatively easy to use once you understand its properties. The ability to create custom shared activities has tons of potential to open up very interesting shared interactions over FaceTime. I’m excited to see what other ideas developers come up with to utilize this new framework.

Please let me know if you would like to see more detailed posts about how I solved some of the issues mentioned in this post. Feel free to add a comment here or find me at @gregggreg2 on Twitter.

Launcher 5 now available on the App Store

Cromulent Labs is thrilled to announce that the latest major version, 5.0, of their popular Launcher app is available for immediate download on the Apple App Store. This update is our biggest update ever and brings Launcher’s powerful widgets directly to your iPhone Home Screen on iOS 14!

Launcher 5 allows you to customize your Home Screen like never before.

With just one touch you can:

  • Call, message, FaceTime, or email a contact.
  • Get directions to a location.
  • Start playing any artist, album or playlist in Apple Music.
  • Quickly access your favorite websites.
  • Launch actions within apps like Compose Tweet or Run Shortcut.
  • Turn Wifi, Bluetooth, Low Power Mode, DND, Cellular Data, and Airplane Mode on and off.
  • Launch any app on your device.

Please note that we have decided to add a new Launcher Premium in-app purchase that unlocks many of these features for new widgets to help recoup some of the development costs. You can get one large and one medium sized new iOS 14 widget for free to try them out and see if you think they are worth paying for or not. If you have previously purchased the Pro Version or Multiple Widget features in Launcher, these features are still unlocked for all classic pre-iOS 14 widgets and you will also receive a significant discount on Launcher Premium as a thank you for being a loyal Launcher customer.

Launcher Widgets also have many customization options you can’t get with normal home screen icons (some require the Launcher Premium upgrade):

  • Customize your icons and backgrounds.
  • Change icon size from tiny to huge.
  • Remove icon labels for a cleaner look.
  • Style with background colors.
  • Stack widgets for better space utilization.
  • Unlimited number of new iOS 14 widgets.

Any widget can be configured to change its icon set automatically based on day, time, and/or location! (Premium Version only)
This allows you to set up specific icons to show based on:

  • Morning, day, evening.
  • Home, work, gym.
  • Weekdays, weekends.

And Launcher 5 contains many more powerful and useful features while keeping the same user friendly widget setup. Including:

  • Existing “classic widgets” can still be used in the Notification Center.
  • Recently Launched and Most Launched widgets update automatically based on usage.
  • Launcher triggers: Get a notification to launch an app at set times or locations.
  • Great accessibility for the sight-impaired.
  • Siri Shortcut support. Run launchers with your voice.

Please download Launcher v5 today and give it a try. We think you’ll find the new iOS 14 widget on the Home Screen to be a game changer.

Launcher v4.0 now available on the App Store

Summary

Cromulent Labs is thrilled to announce that the latest major version, 4.0, of their popular Launcher app is available for immediate download on the Apple App Store. This version contains the following features:

  • Shortcut Launchers: Utilize the power of the Shortcuts app without the complication
    • Settings launchers are back. Launch the Settings app to specific screens.
    • New launchers to turn Wifi, Bluetooth, Airplane Mode, Low Battery Mode, Cellular Data, and DND on or off with one tap.
    • Launch any app on your device — no more limits.
  • Support for iOS 13. Launcher widgets will now automatically follow system light or dark mode.
  • New Jumbo Size Launchers: easier to tap when you are on the go.
  • Web Launchers can optionally be opened in Google Chrome, Firefox or DuckDuckGo.
  • Over 1000+ new glyphs in Create Your Own Icon.
  • New Option: Pin launchers to the bottom of the screen where they are easier to tap (app only).

Shortcut Launchers

As you may know, Apple places many limitations on third-party apps like Launcher, but because they own and develop the Shortcuts app, it is allowed to perform many functions that our users have been requesting over the years. However, with Shortcuts’ power comes complication as well, and setting up shortcuts is not nearly as easy as setting up new launchers in Launcher. Therefore, it made sense to add a tighter coupling between Launcher and Shortcuts to allow our users to take advantage of the power of Shortcuts without all of the complication, especially now that the Shortcuts app is built-in to iOS 13.

Settings Launchers

shortcuts2

One of the most popular Launcher features were the Settings launchers that were added shortly after Launcher was originally released. It is cumbersome to navigate the Settings app to choose a different Wifi hotspot or connect to a new Bluetooth device, and some settings are buried deep within the app. So having one tap access to frequently used screens within the Settings app was a huge productivity boost.

Sadly, Apple made me remove the Settings launchers back in 2017 and they ended up removing the ability for third-party apps to open those screens in iOS 11. However, in iOS 13, the Shortcuts app has the ability to open the Settings app to any screen, so we have added shortcut launchers that open the most popular and useful screens within the Settings app in Launcher v4.0.

Please note that because this feature is currently approved by Apple, they will sometimes force developers to remove features they have previously approved. So I can’t guarantee that they won’t force me to remove the Settings launchers again in the future. Apple could also remove this functionality from the Shortcuts app at any time, which affect the shortcut launchers as well.

Shortcut Utility Launchers

shortcuts1

One of the features that our users have requested the most over the years has been launchers that can toggle important system settings like Wifi, Bluetooth, Cellular Data, Low Power Mode, Airplane Mode and DND. Recently the Shortcuts app added the ability to toggle these settings, and so we have added shortcut launchers in Launcher v4.0 that can perform these functions as well. Note that the Shortcuts app will be launched in order to accomplish these functions.

Launch Any App

applist1

Due to limitations in iOS, Launcher can only launch apps using the app’s “custom URL scheme”, which is something that an app’s developer has to add to their app. For years our users have requested apps to be added and we have added tens of thousands of apps to the Launcher app database. However, not all apps have custom URL schemes, which means we haven’t been able to launch every app out there until now.

Shortcuts has the ability to launch any app on your device, so as long as Launcher can run a shortcut, you can now launch any app on your device using Launcher. You’ll see in the new Launcher app list that there is an option to search the App Store and in the list, any app that has the Shortcuts icon can now be launched with a shortcut launcher. We don’t have shortcut launchers for every app in the App Store yet, but so far we have almost 500,000 shortcut launchers and we are adding more every day. If you see an app that you want to launch that hasn’t been added yet, just tap on it and we should add it within 24 hours.

Caveats

While the new shortcut launchers are much easier to set up in Launcher than setting up shortcuts in the Shortcuts app, there is some added complication in setting up shortcut launchers that cannot be avoided.

Firstly, before you create shortcut launchers, you have to enable a global setting in the Settings app to allow Shortcuts to import shortcuts from other apps. The steps required to enable this setting are listed in Launcher the first time you attempt to set up a shortcut launcher:

shortcuts-import

Once you have enabled importing of shortcuts, you will not have to do this again. However, for every shortcut launcher you add, there is a second step of importing the shortcut into the Shortcuts app. This will happen automatically when you save the shortcut launcher. Just make sure that you always tap the “Add Untrusted Shortcut” button in the Shortcuts app or the launcher will not function properly.

And lastly, every shortcut launcher will need to first open the Shortcuts app when it is launched before it can open the target app. We feel this is a minor inconvenience that is worth the functionality that it enables.

Conclusion

The addition of shortcut launchers adds long-requested functionality and makes Launcher once again the most useful and powerful launcher on the App Store. With multiple widgets that can show or hide based on time or location, folders, and tons of customization options including 5 different launcher sizes, the Launcher widget is a far superior way to launch shortcuts than the Shortcuts widget or any other widget on the App Store.

Please download Launcher v4.0 today and give it a try. We think you’ll find the more powerful Launcher even more useful than it already was.

Voice Copilot now available on the App Store

We are proud to announce our latest app is now available for free on the App Store for iPhone and iPad.

Voice Copilot is an app that can be used entirely with your voice to find directions to any location. It is very powerful, yet incredibly simple to use. You can search for a location and Voice Copilot will list the possible matches to you out loud and allow you to choose the one you want with your voice. You can even add a stop along the way. It will then launch your favorite mapping app with driving directions to your destination without you needing to touch or look at your phone at all.

voice_copilot2_x

Voice Copilot features:

  • Get directions to locations safely by using the app entirely hands-free.
  • Ability to add a stop along your route.
  • Entire app can be navigated and manipulated using just your voice.
  • Launches directions using your favorite app: Google Maps, Waze, or Apple Maps.

All functionality is available for free with some premium features available via an in-app subscription.

Voice Copilot premium features:

  • High quality speaking voices.
  • Google Maps place search and driving ETAs.
  • Remove ads.
  • Support further development.

Download Voice Copilot today and start driving more safely.

Warning: Google Ads Location Targeting Is A Dark Pattern

With Google’s ad revenue growth slowing while their traffic acquisition costs continue to increase, we see them pulling more and more dirty tricks to keep investors happy. No wonder they dropped their “Don’t Be Evil” motto years ago!

Remember when sponsored links in search used to be very clearly labeled with a different background color? Now every year like clockwork they reduce the difference between sponsored and organic results and they are now nearly indistinguishable. On mobile, where they struggle with lower CPCs, they keep increasing the number of sponsored results and they now completely fill the first two screens of even the largest phone displays.

And despite increasing antitrust investigations from both the EU and US, Google shows no signs of stopping questionable behavior as long as it results in more ad revenue.

This is a story of just another evil way that Google is trying…

View original post 1,234 more words

On Upcoming Changes in iOS 11

UPDATE Sep 13, 2017: Apple released the final version of iOS 11 to developers yesterday and I am sad to report that none of the issues in this post were fixed, so all of these problems will remain when iOS 11 is released to the public on September 19. Hopefully feedback from users will encourage them to fix some of them in future iOS 11 releases.

Intro

iOS11 is currently still in beta and it’s impossible to know what the final product will be until it is released in mid-September, but based on the most current beta, I wanted to let Launcher users know about changes that will likely come with this new version of iOS if and when you choose to upgrade to it.

Here is a quick summary of the changes coming in iOS 11 so far that will affect Launcher (I will explain them in more detail below):

  1. Settings launchers will only launch the Settings app and no longer direct you to a specific screen like Wifi or Bluetooth settings.
  2. Several Apple built-in apps can no longer be launched. That list is: Camera, Clock, Contacts, Phone (can still launch phone calls, just not the app), Stocks, Voice Memos and Weather.
  3. Tapping on a launcher to make a phone or FaceTime call now prompts the user every time to make sure that they really want to make the call.
  4. Pulling down the notification center shows the Notifications screen every time even if the last time you had it open to the Widgets screen.
  5. Apps won’t launch properly the first time they are launched from the Notification Center due to a bug in iOS 11.

I don’t expect the first two issues to change in the final version of iOS 11, but I am hopeful that there could be some change in the last three. Continue reading for more details on each change. I plan on updating this post if anything changes in upcoming versions of iOS 11.

Settings Launchers

Back in March when submitting a bug fix, Apple App Review told me that I had to remove the Settings launchers from Launcher within one week or they would remove it from the App Store. This was unfortunate since the Settings launchers are extremely useful and were one of the most popular features of the app. I’ve received countless emails from users upset about their removal, but sadly it is out of my hands.

The silver lining was that even though I had to remove the ability for users to create new Settings launchers, existing Settings launchers still continued to function properly. Unfortunately, in the latest beta version of iOS 11, the Settings launchers will only launch the Settings app and they no longer take you to a specific screen within the app. I suspect that this change was intentional and that this will be the case when iOS 11 ships in September.

Many people have asked why Apple would want to get rid of this very useful functionality. The only reason they have given me is that the URLs used to get to specific screens within the Settings app are “private APIs” and shouldn’t be used. The App Store has always banned the use of private APIs and while a URL is not technically an API, App Review claims to be enforcing this part of the App Review Guidelines [2.5.1] in this case. From what I can tell this comes down to the fact that Apple engineers don’t want to bother with publishing a public API that can be used to get into specific screens within the Settings app, like they do in macOS. They created a way to do it on iOS with URLs, but they only wanted to use these internally for themselves and didn’t want third party developers to use them. Presumably they don’t think this is functionality is worth spending the time maintaining going forward so it’s just easier for them to ban its usage.

Un-launchable Apple Apps

As they did in iOS 10, Apple has again made it not possible to launch certain built-in Apple apps via their custom URL schemes. The list of affected apps are: Camera, Clock, Contacts, Phone (can still launch phone calls, just not the app), Stocks, Voice Memos and Weather.

In iOS 10, a workaround was discovered for this change and for the last year Launcher users have been able to launch these apps. However, in iOS 11 Apple has fixed it so that the previous workaround no longer works. I don’t expect to find another workaround for this problem, so it seems that it won’t be possible to have launchers for these apps going forward.

Note that you can launch most of these apps from the new Control Center in iOS 11, so not all hope is lost. But it is a hassle when you want to launch an app and you have to remember if it can be launched from Notification Center or Control Center.

Confirmation Required on Every Phone Call

Starting in iOS 10.3, Apple added a security “feature” that required a user to confirm every phone call initiated from a third party app. Most Launcher users didn’t notice this change since they usually initiate phone calls from Launcher widgets and this new feature only affected phone calls initiated within apps. Starting in iOS 11, Apple has extended this “feature” to widgets as well.

It makes sense that Apple doesn’t want nefarious app developers tricking users into making unwanted phone calls. However, they have implemented the fix for this issue without regard to its impact on user experience at all.

Starting in iOS 10, Apple added a confirmation prompt the first time a third party app launched another app. You see these pop ups now in Launcher when you tap on a newly added app launcher that says “Open in AppName?”  They are annoying, but at least they only pop-up once and don’t show again for the launched app once you confirm by tapping the Open button.

I filed a ticket with Apple asking them to update the implementation of this new phone call security feature in a similar fashion — only prompt the user the first time they make a phone call to a specific phone number. Once a user confirms that they really want to make that phone call, then don’t prompt them again. So far Apple has ignored this request and I don’t know if they will fix it before iOS 11 is released.

I have hopes that Apple will actually make this fix more user friendly if they receive enough feedback from users complaining about its impact on user experience. So, if you are running the iOS 11 beta, please send Apple feedback in the Feedback app telling them how the implementation of this feature needs to be improved.

Notification Center Always Opens to Notifications

As you may recall, Apple changed the behavior of the Notification Center in iOS 10 to always open to the Notifications screen which means that to get to widgets you now have to swipe down and to the left every time. It had previously always opened to either the Notifications or the Widgets screen based on which was the last one open. Thankfully, Apple reverted to the older behavior in iOS 10.2 and fans of Launcher, heavy users of widgets, rejoiced.

For some reason Apple has decided to always open the Notification Center to the Notifications screen again in iOS 11. Maybe they’ll change their mind again or perhaps this time it will stick. Feel free to send Apple feedback in the Feedback app complaining about the extra required swipe to get to widgets if you are running the iOS 11 beta.

App Launches Fail the First Time

When you add a new app launcher for a third party app, iOS will pop up a dialog and confirm that you want to launch it. This dialog says “Open in AppName?” and if you tap “Open” then the app launches and the dialog doesn’t pop up again for that app. However, this behavior is broken for widgets in the Notification Center and on the Lock Screen in iOS 11 (but not in the widgets you access by swiping right from the Home Screen for some reason). When you tap “Open” in the dialog, nothing happens and that app doesn’t launch. The workaround is to launch it again from the widget and the dialog won’t pop up again and it will launch properly.

iOS 11 is easily the buggiest iOS that Apple has released in years, possibly ever. I filed 9 different bugs with Apple that affected Launcher in iOS 11 and they fixed 3 of them. Some easily reproducible crash bugs were completely ignored. Luckily I was able to work around most of the unfixed bugs in the upcoming Launcher version 3.1. However, there is a bug that I cannot work around because it occurs outside of the Launcher app and widget. I hope that Apple will fix it soon and if you send them feedback letting them know of this bug, that may encourage them to finally get around to fixing it.

Conclusion

So far every change in iOS 11 that affects Launcher is a negative one. In previous iOS upgrades they at least added some useful new functionality along with new restrictions, but so far I don’t know of any positive changes for Launcher in this coming iOS version. As always, the only way to avoid these negative changes is to to stay on iOS 10 as long as you can.

On Upcoming Changes in iOS 10

UPDATE October 7, 2016: We’ve discovered a workaround for the issue with the un-launchable system apps in iOS 10 and a fix is now out in Launcher v2.2.3 now. Please note that this is just a workaround, it doesn’t mean that Apple changed their mind on the issue. In fact, it is quite possible that they could release a new version of iOS 10 that breaks this workaround, so beware when upgrading iOS 10 versions. We’ll try to keep everyone up to date if we discover that a new version of iOS 10 breaks the workaround.

UPDATE September 8, 2016: Apple has released the iOS 10 final candidate and they did not restore this functionality and these system apps are still not launchable. This is disappointing, but it is still possible that Apple could restore this functionality in an update to iOS 10 in the future. If this is something you would like to see, please send them feedback. Details on how to do this are in the original post below.

The only way currently to launch these system apps is to either remain on iOS 9 or downgrade your device back to iOS 9. However, you will only be able to downgrade back to iOS 9 until September 19, 2016 or so. Here are instructions on how to do that.

As some of you may have heard, Apple has made changes in iOS 10 so that some system apps can no longer be launched from third-party apps like Launcher. Namely, the apps that were previously launchable in iOS 8 and 9 from widgets, but can no longer be launched in iOS 10 are: Settings, Clock, Weather, Contacts, iCloud Drive, Voice Memos, and the Phone app (just launching the app is affected, you can still make phone calls).

Obviously the removal of this functionality is as disappointing to me as it is to you. In particular, Settings launchers are very popular because of the tremendous utility of being able to directly open specific screens within the Settings app without the burden of navigating to them when you want to quickly toggle a setting.

Several users have asked me if this loss of functionality is going to remain in iOS 10 once it is out of beta and only Apple knows the answer to that question. There is a precedent of Apple removing functionality in iOS betas only to add it back before the final version is released. Apple removed the ability to lookup the device’s Wifi SSID in iOS 9 betas only to have the functionality restored once iOS 9 was released.

This is where I need your help. I’m not sure that Apple understands how many users are relying on this functionality, and I hope that if enough users contact them to let them know how useful it is and that they don’t want to see it removed, perhaps Apple will change their mind before iOS 10 is released in September.

If you have the iOS 10 beta installed on your device, you can send them feedback using the installed Feedback app. If you don’t have iOS 10 installed yet, you can send them feedback here. Please remember that calm, well-reasoned justifications will go much farther than yelling and screaming.

The following is a good example of the proper feedback to send. Feel free to use it as a template for forming your own feedback.

Dear Apple,

Since widgets were introduced in iOS 8, certain system apps like Settings were able to be launched via their custom URL schemes from widgets. However, this functionality has been removed in iOS 10 as the “prefs” custom URL scheme no longer works. The ability to have a button to go straight into the Bluetooth screen within the Settings app to quickly and efficiently connect devices is invaluable to me and the loss of this functionality greatly diminishes the utility of my iPhone. Therefore, I would like to ask you to either revert this change or create an alternative way to allow the Settings app to be launched from third party widgets in iOS 10.

Thank you for your consideration.

Launcher v2.0 now out

We are thrilled to announce the the next major version of Launcher is out on the App Store today. It took by far the biggest development effort so far to get this version complete and out of the door. A special thanks to all of our great beta testers for helping test all of the great, new features.

The new features in v2.0 are:

  1. Multiple Widgets! This greatly increases the number of launchers you can have in your Notification Center and helps the organization of your launchers. Each widget can be configured to show or hide based on time, day, and/or location, which is functionality never before seen in the App Store. Set up widgets for home, work, the gym, morning, weekdays, or whatever you can come up with so that you always have relevant launchers at your fingertips.
  2. iCloud backup and restore of launchers to make your life easier when you install Launcher on multiple devices or upgrade your device.
  3. More icon customization including circular icons and the ability to create your own custom icons to help personalize your launchers.

iPhone6-WidgetScreen1-Framed

Enjoy!

Explanation of canOpenURL changes in iOS 9

Update 12/2/2021:

As of iOS 15, LSApplicationQueriesSchemes is now limited to a maximum of 50 entries, which effectively limits using canOpenURL to only check if up to 50 total apps are installed. This was largely thought to be the limit imposed by iOS 9 which led me to writing this blog post explaining in more detail why this was not the case. Now 6 years later, the point is moot. Launcher and many other apps are suddenly less useful and the reason for enforcing this limit is still unclear. Perhaps there were some bad actors taking advantage of this and profiling users based on installed apps and instead of punishing those responsible Apple decided to just remove a very useful feature for everyone. I’m leaving this blog post up for posterity’s sake, but if you link your app against iOS 15 or higher, it is no longer helpful to understand its explanations.

Intro

Since iOS 9 has been out for almost 4 months, I realize that this post is a bit overdue, but since I still see a lot of misinformation on the subject bandied about on social media, I figure it is better late than never.

Here are some examples of misconceptions I still hear propagated by developers about the changes Apple made to the canOpenURL call in iOS 9:

“You can now only call up to 50 unique custom URL schemes in an app.”

“Apple made this change to kill app launching apps.”

In this post I will try to explain the changes made in iOS 9 that affect the canOpenURL call as clearly and concisely as I can in order to quell any remaining fear or false information out there on the subject. And then I’ll probably discuss more of the mundane details for developers out there with too much time on their hands.

Continue Reading

Music Launcher now available on the App Store

We are thrilled to announce that we have a new app with a useful widget live on the App Store!

music-launcher-widget

Music Launcher allows quick access to play your favorite songs, playlists or podcasts from the Notification Center. Download it today!

Version 1.1 has already been submitted and we hope it will be out later this week. It includes music controls in the widget for pro version users and the ability to view and edit the tracks from the launcher edit screen. These are two critical features that normally would have been included in the initial version, but since there was a really good chance that the app would be rejected and never released, I could only put the absolute minimum functionality into version 1.0. Unfortunately this is the position that Apple’s App Review policies and lack of clear guidelines has put developers in.

For those keeping track of my struggles, Music Launcher was submitted to Apple in early December and was initially rejected with the reason given being “Shortcuts are not allowed in widgets.” I appealed the rejection asking what that meant exactly and informing them that Music Launcher doesn’t launch any apps, it just calls the Music API. I figured I would just get the same terse response that I got with all of the various Launcher appeals saying that the rejection is final. However, to my surprise they overturned the rejection and allowed me to re-submit. So I did just that and it is now live. And since this went through the appeal board, I have high hopes that it won’t get taken down after the fact like Launcher was, but you never know on the App Store.

A Quick Note Regarding Launcher

For the Launcher fans out there still keeping up hope, I actually submitted a new version of Launcher Standalone (see my previous post if you don’t know what Launcher Standalone was) that I called Launcher Configurator which doesn’t launch any apps at all since even that appears to now be forbidden (at least for me), but can still be used to add/edit/remove the same launchers that the widget uses. The main point of Launcher Configurator is to allow users who downloaded the original Launcher to upgrade its widget to the Pro Version (I still get emails from users asking for this almost daily). It also works around the bug where iPhone 6 Plus users had trouble adding launchers when a row was filled up.

Initially Launcher Configurator was rejected with the reason being that it looks too much like the home screen (this was a new rejection reason I never received on Launcher or Launcher Standalone). So I changed the look and feel of the launchers (in the Launcher Configurator app only, the launchers in the original Launcher widget would remain the same) and resubmitted. It was rejected again with the reason being that it requires another app to be installed first, which is a violation of App Store guidelines. I have appealed that rejection with the explanation that it doesn’t actually require another app to be installed, it’s just not very useful without that other app. I’m guessing that the rejection will be confirmed on appeal since Apple is taking a really hard line on Launcher and anything close to it. But you never know. I do have one successful appeal under my belt now.

Update 01/07/2015: Just got the official call that the appeal was upheld and there definitely will not be any way to get anything close to Launcher out on the App Store anytime soon, if ever. Oh well.