SwiftoDo Development Notes, September 2018

Files integration

In late August I released a version of SwiftoDo that added sync support for any cloud data provider, via integration with the Files app. I think that this integration can be improved in the future. For example, right now, you cannot create a todo.txt file in the Files app using SwiftoDo, and you cannot open an existing todo.txt from the Files app.

If I add those features, I may as well rewrite the app’s UI, so that you have to create or open a file upon SwiftoDo’s launch. I would also have to rewrite how preferences are stored, so users could define different preferences for different files they open.

Those changes would, I think, necessitate dropping the offline support features that currently exist—namely manual sync mode, and the failsafes in place for when automatic sync fails (typically due to network unavailability). I am actually not sure how other document-based apps on iOS handle things when network connectivity is lost or unavailable. I would assume they simply cannot work without a constant network connection, because they cannot access their file, but I am not sure.

I do know that a task list is not a typical document-based app, like a text editor. Users typically want it to be always available, rather than dependent on a constantly-available network connection. Because I would rather not remove offline features from my app, and because I currently have very little time for app development, I do not plan any big changes to the app related to Files integration in the near future. When they do happen, I would expect that the UI of the app would be changed pretty significantly.

iOS 12 Support for SwiftoDo

The current version of SwiftoDo runs on iOS 12 without incident. I have, however, compiled a new version of SwiftoDo on the iOS 12 SDK. It has no new features, but the SDK is newer, so it inherits upstream bug fixes from Apple, and I updated my codebase to Swift 4.2. I am dropping support for iOS 10.x, too, because iOS 12 will be released imminently, and it honestly makes no sense for anyone with an iOS device from the past four years or so not to upgrade to it (iOS 12 performance is that good). Because of the under-the-hood changes, and the dropped compatibility with iOS 10, I am bumping the version number to 3.0.0. (Don’t get too excited!)

macOS Mojave Support for SwiftoDo Desktop

I am running the MacOS Mojave beta, and have been testing out its new dark mode. I love dark mode, and it took me about two seconds to realize that dark mode support is not a nice-to-have—it is an absolute necessity. Therefore, have coded support for it in a new build of SwiftoDo Desktop. I will submit it to the App Store soon.

The next version of SwiftoDo Desktop will be compiled on the macOS 10.4 SDK, and will no longer support macOS versions lower than that. (If you are not going to upgrade to Mojave, you can continue to use the version of SwiftDo Desktop you are currently using, of course.)

Other than dark mode support, there are no new features. (Sorry!) Because of the under-the-hood changes, and the change in minimum system requirements, I am bumping the version number to 3.0.0, though. (Again, don’t get too excited, but be happy your app is being supported.)

The future of SwiftoDo Desktop

It is a weird coincidence that SwiftoDo and SwiftoDo Desktop will be on the same version number for a while, but it is only a coincidence. At present, they do not share any underlying code.

My long term plan is for SwiftoDo to resemble, and share tons of code with, the iPad version of SwiftoDo. The approach I would prefer to take would be to use the joint iOS/macOS framework that Apple said is coming next year. I will probably continue work on improving the iOS version’s codebase in preparation for eventual macOS support as well.

I am not sure if every user will want the iOS version on the desktop, but I know that I would. I have considered releasing the next-generation version, whenever it is ready, under a new name (SwiftoDo Desktop 2, maybe) and SKU, so owners of the current SwiftoDo Desktop could continue to use it until it no longer functions on macOS. I have not decided exactly what I will do just yet.

I do not expect that anyone outside Apple will learn anything about Apple’s new framework until WWDC 2019, which will be held in June. What I learn at that time will have significant impact on the direction in which I take SwiftoDo Desktop.

Altec Lansing M650 iPod Speaker Dock

After enjoying the Philips Revolution speaker dock for a while, I started to look for a better sounding iPod dock. I found that in the Altec Lansing M650, which is a 2.1 channel system (yes, stereo speakers plus a tiny, down-firing subwoofer!) in a compact, triangular case, with a 30-pin iPod/iPhone dock on a ledge in front.

I thought, and still think, that it sounds great. Its sound is warm, rich, and natural. While I wouldn’t consider the bass response to be very tight, or there to be any stereo separation at all, it does sound really nice, and can fill a small bedroom or a home office with a pleasant sound that I could listen to for hours on end.

I used one as my main desktop stereo system for a couple years while I worked from home. It replaced my Harmon Kardon Soundsticks, which sounded better for music, but were not as easy to connect to my iPhone. It sounds great for music, podcasts, and for TV—thanks to its line-in jack, I often plugged an iPad into it for better audio when watching baseball or Netflix. I liked this speaker so much that I bought another one for the kitchen, where it was a great base station for phone charging and playing internet radio for several years.

Unfortunately, while this speaker sounds great, its 30-pin dock is poorly implemented. After several months, both speakers emit annoying static from the 30-pin connector unless the iPhone is seated just right. I think I’m the only one in my house who knows how to fiddle with it until the sound clears up. Plus, of course, the 30-pin connector was made obsolete by Apple’s change to the Lightning standard.

I still use both of my M650s in my children’s rooms to play white noise while they sleep, and occasional music while they are awake, through our old iPhone 4 and 4S. It has gotten increasingly difficult to seat an iPhone on them without getting static through the 30-pin connection, but it is still possible. However, because the 30-pin iPhones that drive them are old and barely work at this point (software-wise), these speakers’ days as iPhone docks are numbered. They have a line-in jack in the back, however, and are prime candidates to pair with an Amazon Echo Dot (or something similar) sometime in the future.

Philips Revolution Motorized Portable Speaker Dock for iPhone/iPod

The iPod had a monumental impact on how people listened to music. Not only did it turn people onto digital music downloads, rather than CDs, better than any preceding product; it also made listening to playlists and to shuffled music simple and extremely popular. The iPod’s 30-pin connector had a huge impact on home speaker systems as well. Suddenly, it became the default connection option for a bevy of home speakers. In stores, many speaker systems were repealed by iPod speaker docks.

While I had iPods since the first iPod Mini was released, shortly after I got married, I got an iPod Touch. It came for for free with my wife’s first MacBook Pro, and she had no interest in it. Of course, as a non-iPhone-owner, I found the iPod Touch to be an incredible upgrade from my iPod Nano. Around the same time, I got my first iPod speaker dock for free as well, in exchange for writing a review. It was a Philips Revolution speaker dock that looked somewhat like a boombox, could be driven by a bunch of D-cells or a power cord, and had a rotating dock that could accommodate (in portrait or in landscape mode) every iPod created to date and the first generation iPhone.

For sound, it was perfectly adequate. I liked it a lot at the time, but I thought of it like a boombox rather than a room-filling speaker system. It lacked a subwoofer, and thus had lackluster bass, but it was small, battery powered, and brought music into places in our apartment that it previously didn’t reach. My wife and I enjoyed using it with the iPod Touch for streaming music—mainly Pandora or streaming radio from WNYC—in the dining room while we ate dinner. I really enjoyed using it for background music during meals or for news radio, for which having the richest and best audio quality was not terribly important.

In the same way that my computer, once I got a CD-ROM drive, supplanted the stereo system as my main music player, this speaker system solidified the iPod’s (and later the iPhone’s) prime position as the source for music in my house. It also got me into the habit of streaming audio into the house, rather than only playing previously downloaded (or ripped) music. My wife and I used it in our kitchen for years to stream WNYC news and music. When the iPhone changed from the 30-pin connector to the Lightning connector however, this speaker dock’s days were numbered. And when that original iPod Touch’s software support was dropped by Apple, this speaker dock’s days were done.

Harman Kardon Soundsticks II Speaker System

In my mid 20s, I decided to move from boring (but nice) suburban Connecticut back to the Boston area where I went to college. It was a chance to reinvent myself, which is something I really needed to do at the time.

In the process, I replaced a lot of my belongings—cheap things or hand-me-downs that I had since my college days—with newer, better versions. I replaced nearly everything I cooked with and ate with: dishes, pots and pans, and small appliances. I bought a new wardrobe and got rid of my ratty old T-shirts and jeans. I traded up from a slow and struggling Dell tower PC to a sleek, fast, white MacBook (my first Mac!). I also traded up from my old, busted Altec Lansing computer speakers to the cool, futuristic Harman Kardon Soundsticks II that I saw in the Apple Store.

The Soundsticks’ clear plastic construction made them almost invisible. Their clear, light-up subwoofer looked like a bioluminescent jellyfish floating atop the tangle of wires under my desk. Their capacitive touch volume control was futuristic, too, but really hard to control; I mainly relied on my MacBook’s volume control instead.

In my cool, urban apartment, I played music through these cool, stylish speakers for hours and hours each day as I worked on my new MacBook (and on my work laptop, side-by-side). They sounded much better than my prior Altec Lansing computer speakers, but mostly they just looked better. I found that, at loud volumes, they didn’t really fill the room how I would have liked them, but I rarely played them that loud anyway, considering they were sitting on the desk I was working at.

During this time, I stopped buying CDs and started buying music online. I got into indie rock very heavily, mainly because I could get their tracks at great prices (25 cents per track) though eMusic. I first heard Okkervil River, Spoon, The Avett Brothers, The Apples in Stereo, Bright Eyes, Rilo Kily, Rainer Maria, and many, many other artists through these speakers.

I happily used these speakers for five years or so—even after moving from my hip, urban apartment to the suburban house I live in now—but I eventually tired of the mess their wires made atop and beneath my desk, and moved them into basement storage. Someday I hope to find another use for them, perhaps as a bookshelf system driven by a Raspberry Pi, but I would need to figure out a way to hide all the wires, so the great looks of these speakers shine through.

Altec Lansing Computer Speakers

Over winter break, during my sophomore year in college, I bought my first new computer: a beige Dell tower with an Intel 486 processor. When pricing out systems—and this was done over the phone back then, rather than over the internet, because my parents did not have internet access in 1997—I configured nearly identical systems from Gateway and Dell at the same price. The only difference between them was in the peripherals: the Gateway came with a 19-inch monitor, rather than a 17-inch monitor, and the Dell came with a USB-connected, 2.1 channel Altec Lansing speaker setup. I bought the Dell, to get the better speakers.

At the time, I thought the trade-off was completely worth it. The speakers were tiny, stylish, had some fancy USB connectivity (USB was brand new then!), and came with a subwoofer, which I had never had before. The subwoofer added a new dimension to my music that I had never experienced before. It could shake the room if I wanted that, or just add some sub-bass dimension to the music. Its presence inspired me to pair this speaker set with my old, 2-channel Altec Lansing computer speakers, to create a 4.1 channel setup that I used to watch DVDs in my dorm room in 1999 and 2000. I had to upgrade my sound card to a Sound Blaster Audigy to get that to work. (I think that is the last dedicated sound card I ever bought!)

Their USB connection was not all I had hoped for, however. It did not carry the audio signal; it only allowed you to control the volume and EQ from a Windows menu bar application. It was pretty sophisticated for the time, but it was superfluous, and, I discovered after a year or so, the drivers that made it work caused Windows to crash all the time. So I disabled the USB feature and continued to use them for about 10 years, through college, grad school, and beyond. Eventually they wore out so badly they could no longer play at a proper volume. By that point, though, I had moved onto using an iPod for most of my music playback.

My first computer speakers

I got my first computer when I was in seventh grade. It was an IBM AT/XT that we upgraded several times over the years. By the time I was in high school, my dad bought me a SoundBlaster sound card and some 6-inch computer speakers. I actually do not remember who made them: it was either JBL, Creative, or Altec Lansing. What I do remember is that they were the generic beige color of all PC hardware of the era, the right speaker had knobs for balance and volume, and, as a pair, they could go very, very loud. No one else I came across had computer speakers that large or that loud.

Sound quality-wise, however, they were not great. Back then, in the late 1980s and early 1990s, it was still rare to hear any sounds at all coming out of a computer. It was enough to be able to hear the beeps and blips coming from my DOS-based productivity software and games.

Due to lackluster sound quality, and the fact that CD-ROM drives were too expensive for me to buy until the mid 1990s, these computer speakers never replaced my CD system’s speakers as my main playback system. They are important to me, however, because they enabled me, for the first time, to use the computer to record and mix music.

Sony CFD-510 Boombox

A week before I left for college I bought a Sony boombox to use as a bookshelf stereo. It had detachable speakers, so you could actually achieve stereo separation, and, of course, “mega bass”, which was pretty much mandatory for good sound in such small speakers.

I chose this particular model because it had an analog 3-band equalizer, as opposed to several genre-specific settings; I relied on the EQ to pick out guitar and bass parts I would transcribe. As a bonus, it didn’t have a crazy light show like the many of the other boomboxes on sale in 1996.

I don’t remember very well how it sounded, to be honest, because I wasn’t able to use it that much. My freshman year roommate and I did not share musical tastes, so I had to play my music through my computer using headphones. (My computer’s CD-ROM drive actually had a dedicated “play” button and its own headphone jack.) I didn’t realize it at the time, but all those hours listening to music over headphones (the cheapest headphones possible, I’d say) in my dorm room were the very beginning of my headphone-centric music listening preferences.

My first speaker system

My parents bought me my first CD player at the JC Penney Outlet. It was a damaged, open-box, no-name system that resembled a single, tall unit. It contained, from top to bottom, a turntable (though the clear cover was broken off and missing), an AM/FM radio, a five band equalizer, a dual deck cassette, and a single cd player at the bottom. The only reason I asked for it, and thought my family could afford it, was because it was damaged and was being sold at a steep discount. I also told my parents I would listen to classical music on it, which was my intent, but didn’t actually happen too often.

It came with two bookshelf speakers with RCA inputs that plugged in the rear, that I set up about ten feet away from the receiver. I couldn’t tell you how good or bad the sound was. All I knew at the time is that it was amazing compared to what I had at the time: my mom’s 20-year-old transistor radio, and a cheap, toy-like boombox with a dual cassette deck. The most important upgrade, of course, was upgrading from records and tapes to CDs. CDs didn’t have tape hiss, had high dynamic range, and didn’t wear out over time or get eaten by the plater sometimes.

I blasted music through this no-name system for hundreds of hours through middle school and high school. I measured my school papers by how many album listens it took to write them. I used it to practice singing, to transcribe songs with my guitar, to play back 4-track recordings, to lie back on my bed with CD liner notes while my favorite new song played on repeat.

I amassed an enormous CD collection, mostly through the Columbia House and BMG Music clubs, and partly through weekly trips to my local record store (which is long gone now).

Now that I’m a parent, I am amazed that all my loud music playing didn’t drive my parents crazy. They never complained to me about my music blasting from 3 PM to 10 PM every day. My kids are too little to listen to music on their own, but I’m already thinking about which headphones to get them, so we can all coexist in the house.

I have no idea where this system went or who made it, but, based on it being my first CD player, it is probably the most important speaker system I have ever owned.

Speakers over the years

I love music, and I love headphones, but, oddly enough, I have no special love for speakers. The reason, I suppose, is that, since I was a broke teenager living with my parents, I have never had the opportunity to listen to loud, room-filling music at my home. Roommates, sleeping children, and close neighbors have always prevented it. That said, my love of music has always depended on speakers, and, as I got older, they got a little better over the years.

I’m going to publish a short series of posts about the various speaker systems I’ve had over the years. After that, I will post a short series of posts about all the headphones I’ve had, and loved, over the years, as well.

SwiftoDo Development Notes, July 2018

I took a break from SwiftoDo development to build a new app, Simple Call Blocker, which I posted about earlier this week. Building it was a fun diversion, and I learned a lot in the process, too. If you’re reading this, you’re probably wondering what’s up with SwiftoDo, however. I have been working on it this summer, too.

Since this spring, I have been promising everyone that I’m working on iOS 11+ Files app integration. This feature will let SwiftoDo open files from any cloud service provider that ties into the iOS 11+ Files app. That includes Dropbox, Box, NextCloud, OneDrive, Google Drive, and many others. Adding additional data providers to SwiftoDo has been a long time coming.

Some background on SwiftoDo data providers

I designed SwiftoDo data providers to be plugins that could be swapped out, which would allow me to support numerous cloud storage providers. I have had so much trouble getting the Dropbox data provider to be solid and stable, however, that I was loath to create more data providers. My thinking was that I was liable to cause more problems for my users (and myself!) than I would solve. Therefore, I concentrated on fixing up the Dropbox data provider code, which is now, after three or four rewrites, pretty solid.

(The Dropbox data provider code has always worked, but it had a rare but nasty crashing bug for some time, and some issues related to stability, ability to handle spotty network connections, and ability to handle, gracefully, Dropbox “rate limit exceeded” API responses.)

iOS 11’s Files app, which I did not anticipate being available when I first wrote SwiftoDo, obviates the need for additional “native” data providers. I just wasn’t sure if SwiftoDo would be able to tie into it.

Can Files integration be used for SwiftoDo?

I have been under the impression that integrating with the Files app would require a rewrite of major sections of the app, or would simply not work well due to sandboxing limitations. I thought this because all Files-based iOS apps that I have used follow Apple’s “Document-based app” template very closely: Think “Microsoft Word” rather than “Reminders” in terms of user interaction patterns. They open to a file browser, you open a document (typically a single document), work on the document, save it (automatically), and close the app. The life cycle of a document is fairly limited: after the app is killed, your file is closed and does not reopen on load. Most of these apps don’t work offline at all, unless you’re working with local-only files, because they can’t open your file.

In contrast, SwiftoDo works a lot differently. It manages your task list locally and syncs it to an external file. It lets you archive completed tasks to a second external file. It keeps the opening and choosing of files down to a minimum. Most users set up their todo.txt and archive files once and never touch those settings again. It lets you work offline (primarily in “manual sync mode”, but also when the network is unavailable) and sync your changes to the cloud on demand.

Integrating SwiftoDo with the Files app, without giving up anything, seemed like it might be a considerable challenge.

A “Files” data provider

To my surprise, implementing a “Files” data provider has not been as challenging as I thought it would be. Accessing documents via the iOS document picker and restoring them after the app is killed, via secure bookmarks, is actually pretty easy. It took me only a couple hours to set up a data provider that would upload and download to iCloud Drive and even Dropbox through the Files app.

That is not nearly enough to ship the feature, though. There are still some issues regarding stability and error handling that I have to work through.

Adding this feature also prompted me to display file names in Settings (rather than 2 screens deep in Settings) and atop the task list in the main view.

What is next?

After I finish the Files data provider work, and the new Xcode and iOS versions are officially released, I plan to build SwiftoDo on the iOS 12 SDK and drop iOS 10 support. I’ve been thinking of bumping the version number to 3.0 at that point, to mark the change in iOS compatibility.

I will also consider the future of Files integration in SwiftoDo. It temping for me to remove the entire “data provider” layer and just make SwiftoDo a normal iOS document-based app. That would be a big deal, and I would not make that change unless I understood fully what that would mean for users. I also have to consider how long I will continue to support the existing Dropbox data provider, as it will be somewhat redundant.

After that, I will have the opportunity to simplify the codebase quite a bit. It is tempting for me to rewrite some or all of the UI layer, to incorporate the new techniques I have learned since coding version 2, over a year ago. Any changes to the UI code will probably be related to new features or a minor redesign of the sorting/filtering interface that I have been thinking about.