Creating your own iOS Swift Package

Wednesday, August 28, 2019

During WWDC 2019 Apple announced that Swift Package Manager (SPM) now supports iOS projects. iOS developers had been waiting for a long time for this feature. In the past, only Mac projects has benefited from SPM. iOS developers have learned to use CocoaPods and Carthage but those tools are not perfect and SPM should allow us to replace any need in third-party dependency manager.

Many big companies separate their code into multiple internal frameworks and reuse them across their application. We have the same approach In the company I am working right now – IG. I have decided to try SPM for managing our dependencies.

There’s 2 kind of dependencies: third-party and internal. SPM supports both. It even supports complex dependency graphs with nesting. It sounded like ideal option until I started to hit some problems.

Starting is easy

It’s easy to get started, all you need to do is to add package.swift file to your project root directory. Open this file with Xcode 11 or newer and it will try to parse it. Xcode project file is no longer necessary and instead of projects you will work with packages. Select File > New Swift Package to create an empty package, you can use generated package.swift. Make sure you can build and test. You might need to fix some errors. For example, I had to add import Foundation to some of my source files. You also will need to specify location for your source if it’s not in default Sources folder. Other problems were much harder to fix.

Problems and limitations

The first thing I noticed is that not all third-party dependencies support SPM. If yours does, you are lucky person but if it’s not — there’s nothing you can do, besides letting them know or abandoning the dependency altogether. For example, I have managed to integrate with Alamofire and SwiftLint but not jazzy. If your dependency is closed source binary it won’t work with SPM at all! If you have something like name.framework in your project you won’t be able to wrap them in your own Swift package.

The second issue is lack of Run Script build phase. If you used to run SwiftLint every time you build your project, this won’t work with Swift package. Alternatively, you could use git hook based approach but this will require a lot of third-party code, and I couldn’t get it to work in a short time.

I also have noticed that you won’t be able to read local files through Bundle class. Following path is nil in Swift package:

let path = bundle.url(forResource: "filename", withExtension: "json")

That is caused by lack of Bundle in Swift package. If you want to read files locally use FileManager. You can separate code which only runs in Swift package with #if SWIFT_PACKAGE condition statement.

And finally, if you depend on any Objective-C code, you won’t be able to build it with your package. I was able to exclude some of my Objective-C code but I am not sure it won’t cause issues later.

Conclusion and benefits

If you can use SPM, you should do it, it’s easy to add a package with new Xcode GUI tool. If you providing a library, you should add SPM support for it. When it works it is great, it allows to set breakpoints and see errors in third-party packages, displays all third-party code (you will be surprised how many nested third-party projects your app depends on). It validates your dependency settings and allows you to remove Xcode project from your package.

Last but not least, before you migrate, make sure you are aware of all limitations.

Sleep timers

Monday, August 5, 2019

Podcasts and audiobook players have sleep timer feature. There’s many ways to express it. I prefer to have least amount of taps. iBooks and Apple Podcasts can work with just 2 taps, while Overcast app has more customised popover interface and needs at least 3 taps or often more.

Podcasts app shows standard alert controller and Overcast shows popover.

Overcasts starts countdown as soon as you begin configuring the interval, this adds unnecessary pressure.

iOS advantage

Thursday, July 11, 2019

From my own experience, I have noticed that people around me are more successful with iPhone than a Mac. Graphical user interface in pair with mouse is intuitive to an extent, but to use Mac comfortably you need to know and remember several fundamental concepts. Some of them I wanted to discuss today is double click action and concept of selected item.

I remember when I got Mac mini for my mom and we would spend some time together using it. With a little guidance she would figure out most of the stuff on her own. She didn’t know a lot, and when she had a question, she just asked me, and I would smile, and say yes, you are right. It was joy for both of us. Unfortunately, it didn’t go smoothly always. We stuck with one trivial task. She wanted to open a document. She needed my help to learn double click. Problem is, once she overcame a challenge and learned how to do it, she started double click everything — Dock applications, web links. Not a great experience.

Another time, much later, I happened to be a witness when someone wanted to save a document in a specific location. Very common thing you find yourself doing on a Mac. I have noticed an apparent problem which required my intervention — file did not save to the selected folder. Well that’s a problem. This made another person frustrated. Believe me, you don’t want to be a clever guy in this situation, this is UX failure. Why it didn’t save? Because you need to double click on a folder first!

iOS has some advantages over macOS. Both Mac and iPhone have a progressive disclosure of complexity which helps novice users get started, and also allows power users stay productive. However, entry barrier on iPhone is much lower. You can do everything on iPhone with a simple tap and swipe. It will take longer yes, but you don’t need to know about double tap, tap and hold, tap-hold and drag. That’s a great thing.

iPad works in the same way. Basic requirements, things you need to know to use it, are very low. It’s forgiving for a novice user. People can pick it up and do more without any help from their nerd friends. iOS and iPadOS have fundamental advantage over Mac.

Altershot 1.7

Wednesday, July 10, 2019

Today I am releasing update for one of my hobby projects. I’ve refined user interface and added support for latest Apple devices.

Altershot is the marketing tool for your screenshots. It simplifies Status Bar appearance to focus viewer attention on your app. Get it from the App Store. Altershot is free and contains no in-app purchases at this moment.

Full list of changes.

  • Added support for iPhone XS Max and XR
  • Added support for all new iPad models with iOS 12 look
  • Added support for new Apple Watch screenshots (Series 4)
  • Larger 1 to 1 screenshots preview
  • Improved Dynamic Type
  • Cut larger portion of the upper screen on iPhone X and newer to produce better looking screenshots
  • Updated About screen with small text descriptions
  • Improved user interface
  • Shorter file names for exported screenshots
  • Fixed issue when removing iPhone X status bar in Photos extension
  • Internal improvements to reduce application size in future iOS versions

Smartphone is great and not enough

Tuesday, July 9, 2019

Recently I have wrote about Mac and how I began to harness its unique power by using BBEdit, clipboard manager, Keyboard Maestro macros, custom launchers, modifying OS behaviour with BetterTouchTool, writing my own Perl and Swift tools.

This is all fine, as far as normal software developer concerned, macOS and its professional hardware gives us everything we need. We don’t want it to change in a fundamental way. We just need Apple to update it on regular basis. However, Apple can not stop on that. They need to empower even more people with technology.

Innovation to make Macintosh fully accessible with only a mouse instead of traditional keyboard was a great decision. This was copied by Windows quickly, so thanks to Mac, more people could use computers than ever before. Many years later, iPhone made computing even more accessible. Google had to start their own photocopiers, you know the story. Now even more people own and use computers (smartphones) daily.

So is there’s room for iPad? Can it compete with smartphone? I believe it can. You see, smartphone has replaced computer for many. But not replaced it completely. Smartphone is one of the greatest inventions of this century, and it’s not enough. Many people still have to rely on their unreliable PC computers to do the job smartphone can’t — access powerful web applications, work with multiple documents at the same time, access file system and connect external devices. This is perfect place for iPad. Assuming, it has third-party applications to support itself.

I wrote how iPad needs more professional applications back in 2014. Now it’s 2019, 5 years later, we have iPadOS with window managemnt, USB access and file system. We have Adobe making Photoshop for iPad and we have Catalyst and SwiftUI to help with native software on iPad and Mac. It’s a huge opportunity, and it’s going to attract new users. If you are developer, I would pay close attention to iPad.

So why would you think someone would replace Windows PC with iPad. I can think of some reasons.

  1. iPad is multi touch first. Irrationaly, it feels good to use it, and entry barrier is lower.
  2. iPadOS new features: window managment, mouse support, file system access, enables more profesionall use cases.
  3. It likely to get more professional apps in the next 5 years.
  4. Excellent battery life and mobility.
  5. iPad can compete on price.

I believe there’s market to be taken of people who didn’t use computers before or don’t really like them. This is people who own Windows PC laptop and looking for something better, faster and more powerful. I see the future where a lot of people would want to carry powerful iPad loaded with professional native apps with them — computer for everything, computer for the rest of us.

Mac is back.

Sunday, June 16, 2019

I have created my first web page, and, later my first program on the Mac, and now supporting my family working on the Mac. Even though I owned a PC before, Mac always going to be my first true computer. Computer which empowered, and gave me a choice to be someone I want to be. You see when I’m going with this. You can’t forget your first experiences.

Now-days I have much less time for myself than I did before. Much less, if almost none, when I am not careful. That’s why I have to spend my time well, I can’t afford any kind of compromise, I need the best and most powerful computer and software I can get. Recently I’ve been trying spend as much time with Mac as I can, perfecting my setup and learning new automation tricks. I feel like with Mac I can create with my maximum potential.

I cheered to meet new Mac Pro tower when it was unveiled at the Apple WWDC. Brutal and powerful, driven by its function. A perfect masterpiece, a culmination what personal computer can be at its extreme potential. This shows that Apple still cares about Mac platform, and all weird edge cases and needs some of us have. Apple still working hard, not just for its most popular markets, but also for individuals who would benefit from maximum computing power.

I don’t even need all this power, and certainly we can’t afford it. However I am glad Mac Pro is back, in its new compromise-free classic tower form. Mac Pro is my favourite Mac I never owned, because even idea of its existence gives my live reassurance in our bright future of personal computing. Everything Apple learned building Mac Pro will benefit next generations iMac Pro, Mac mini, and MacBook Pro.

Why I value native software

Saturday, June 15, 2019

When the original iPhone OS was introduced, many people loved it, and many developers wanted to be on the platform. iPhone OS 1 had break through Safari browser and Steve Jobs implied that third party developers could use power of WebKit to build and distribute their applications. However they were never “first class” applications. Apple didn’t use HTML, CSS and JavaScript for their own apps.

With iPhone OS 2 and iPhone 3G, Apple opened up some of their internal frameworks, like UIKit and Foundation for any third party developers. Now you can run applications which can compete with software developed in Apple itself. Like we always could do it with AppKit on Mac. It was the right and very successful decision.

During my software engineering career I preferred and prefer to use the same tools and technologies available to the OS vendor. It feels more fun to me, I tend to want more control over software I build. I value freedom in power to express any kind of idea, and I do not tolerate any kind of performance cost or compromise in user experience. I never cared about building something which is available to the largest group of people possible, but I always wanted to build the best kind of experience possible, and, most important, to deliver experiences which is better than alternatives. That’s a corner stone of my personal race to success, be better than others. Be different.

Apple Watch Generation 1 Review.

Monday, May 27, 2019

Apple Watch with UTILITY face.

In 2016 Apple released Apple Watch Series 1. I still wear them to this day, even at night. Here’s how this little computer improves my daily live.

Telling Time and Counting Seconds.

I love to wear a watch. I find analogue watch faces relaxing and much easier to scan than digital faces.

For the 60, 30 seconds timers, I look at my wrist and memorise Seconds Hand position. Two, three glances, and I’m done. I don’t need to launch the Timer app.

This also works with traditional mechanical watches and even with iOS Springboard. It’s very Apple-like thing, when you look at your iPhone, iPad, or Apple Watch with the Seconds Hand perfectly in sync rotating smoothly.

iMessage and Telegram Notifications.

Because I sometimes leave my iPhone behind, there’s always a risk to miss an important message from people I know. Both of this apps value my privacy and allow to reply right from the Apple Watch.

Breath App.

Such a wonderful lightweight app. I try to use Breath as much as I can. We even use it together with my son, it helps me to relax and it helps him to fall asleep sometimes.

Siri and Dictation.

It’s not the fastest device to access Siri, but it is much better than nothing, and it is always with me. I use it to text my wife, set reminders and add new items to OmniFocus.

Battery Complication.

The battery in my unit is old, so I have to charge it at least 2-3 times a day for at least 15-30 minutes at a time.

Sleep Tacking and Caffeine Logging.

My favourite thing about AutoSleep is that it works automatically and doesn’t require me to launch the app. When I do launch it, I find it a bit over-engineered.

For caffeine tracking, I have created Caffeine++. I use it every day. I find it fast and convenient.

UserDefaults In Practice. 🔗

Sunday, April 21, 2019

My favourite UserDefaults1 use-case is preserving User Interface states, one of essential items on the list of every good Mac and iOS application.

UserDefaults is one of most powerful examples why I love writing programms for Apple hardware. It is easy to get started, performant, and got even simpler2 over time. Just two-three lines of code and you wrote something to permanent storage. Which you can read at any time, so efficient, adding your own caching code would even hurt performance3.

David Smith wrote an excellent guide to UserDefaults for DS Coder. I have learned something new from the article:

Having an alternate code path for “no value set” is also generally unnecessary, as you can provide a default value instead.

Thank you David, for this excellent guide.

  1. Ommitting NS prefix, it doesn’t exist in Swift. 

  2. There’s no need to call synchronize() method any more. 

  3. UserDefaults optimised for reading. 

How to Get Bugs Fixed by Apple. 🔗

Saturday, April 13, 2019

Greg Scown, writing for Code Cook Read:

First and foremost, write good bugs. This is fairly easy to do, though it can be time-consuming. If you’re not already familiar with that’s the site for reporting bugs to Apple. When you create a new bug, Apple includes a template in the description for exactly how they want you to report your bug. Apple isn’t looking for you to create your own format or to report things entirely in prose. They also include a handy page of tips for reporting bugs which you should follow.

Greg’s article inspires to do a better job reporting bugs to Apple. Reducing the scope, if possible, and reading Apple manual is 2 excellent take aways. Whenever I get a reply on a bug, it’s usually asking for sysdiagnose report with PDF manual attached. I had no idea that yo can get all manuals in advance from the Apple tips page. Let’s write better bug reports, targeted to the cause and with as much information attached as possible.

Apple’s Game Changer. 🔗

Thursday, April 11, 2019

We all want Apple to buy Nintendo. But now it makes sense.

It doesn’t make sense. Nintendo is a hardware company as much as they are software company. Games published by Nintendo always released for a single platform, with physical controller included, while Apple Arcade is more about simpler games which can ran on multiple devices with or without a controller. Nintendo makes profit from every console they sell, not just games. And games they made take full advantage of hardware. Their hardware doesn’t need to be an everyday computer and can cost less, lowering entry barrier. Nintendo 2DS costs $80, Apple will never make an iOS device so cheap.

What really makes sense is Nintendo mobile games on Apple Arcade. Apple doesn’t need to buy Nintendo to make this happen. Super Mario Run playable without internet connection, that’s what we need.

Preventing RSI.

Wednesday, April 10, 2019

Why Now?

RSI1 is not a new issue, why I am writing about this now?

  1. Larger smartphone screen sizes.
  2. People love to spend time with Nintendo Switch.
  3. Many people started to use iPad as their primary computer.
  4. Apple introduced low travel keyboards in their laptops.

We use iPhone a lot. Larger touch screens force your fingers to stretch and work more in unnatural ways.

The Switch allows you to take one of the best games ever made with you, but it’s heavy and Joy-Con controls are tiny, if you have moderate or large hands, your fingers are crippled.

Like laptops introduced new ergonomic challenges, iPad introduces even more challenges, when working for an extended period time, we use elevation docks, external screens. iPad can be used in many more new ways and it’s your job to take care of your body, maintaining natural wrist position and healthy posture.

Not everything that happened brings more risks to your hands, there’s positive changes, like ever reducing keyboard travel time. I have a theory that newer quieter keyboards are ergonomically safer.

New thinner MacBook Pro/Air keyboards are not reliable, Apple gets a lot of criticism and rightfully so. However, smaller travel means that your hands have to do less work to press each key. RSI caused by micro injuries in hand muscles. More travel means more force. Each individual press is harmless, but when repeating it thousands times, it can accumulate to a big amount of force which your hands have to deal with. Loud typists are at greater risk, and new keyboard are all about quieter typing.


  1. Choose a smartphone with a small screen.
  2. Use large Pro Controller, give your Switch support while playing, reduce wrist strain.
  3. Use external keyboard and stands when working on iPad.
  4. Consider keyboards with lower travel time.

Also there’s some simple rules.

  • Type as light and quite as you can.
  • Move and shift your entire hands and shoulders.
  • Don’t rest your wrists while typing.
  • Don’t stretch your finger in unnatural positions while typing.
  • Use stronger fingers more, press larger keys with multiple fingers to reduce required force.
  • Position your keyboard flat.
  • Give your hands and body regular breaks.

Wrapping Up.

The most desired scenario is when you treat your hands with respect and don’t injure yourself in a first place. That’s the easier and healthier option. I am fortunate to have heathy hands so far, however I had experienced warning signs and I have not ignored them since. I am careful about my hands, particularly, how do I type and play. You should be to. There’s many kinds of RSI, but the one I am concerned the most is the one which injures you wrists to a point that you can’t type without a pain or can’t type and play any more at all. The only cure is time and full recovery is not guaranteed.

We don’t speak about RSI enough. It’s a life injury and it’s happening around us. Normally, only people who already experienced RSI taking measures and talking about it,2 while what everyone in software industry should do more, is to take preventing measures. I am calling for more RSI awareness among people in software.

Further Reading.

I recommend this book (Amazon), which is only available in print. Used price is not bad at all. If you know me in person, I will happily let you borrow it.

  1. Repetitive Strain Injury 

  2. I’ve heard this from John Siracusa and some of members. 

← Newer Page 1 of 8