So first step into the plan: clone the project’s repo, and see what breaks.
Luckily, Shopster’s Podfile is pretty short:
platform :ios, '7.0' xcodeproj 'Groceries' pod 'PSAlertView' pod 'TestFlightSDK', '~> 3.0' pod 'BlockAlertsAnd-ActionSheets', '~> 1.0' pod 'FMMoveTableView' pod 'OHAttributedLabel', '~> 3.4'
First step to fix the Podfile then: remove old dependencies (TestFlight was acquired by Apple long ago!) and adopt the new syntax. The resulting
Podfilelooks like this:
platform :ios, '7.0' project 'Groceries' target 'Shopster' do pod 'PSAlertView' pod 'BlockAlertsAnd-ActionSheets', '~> 1.0' pod 'FMMoveTableView' pod 'OHAttributedLabel', '~> 3.4' end
This new Podfile has this warning:
[!] OHAttributedLabel has been deprecated in favor of DTCoreText. I’ll deal with that later.
I also removed
AskingPoint.framework. The project still fails to build. The
pch(remember those?) is including
<TestFlightSDK/TestFlight.h>, and of course, I’m initializing it in the
AppDelegateand using it in a reporter class. Removing these makes the project build!
Current state: Shopster runs on the iOS 10 Simulator, just like it runs on my iPhone. All the low hanging fruit has been taken care of.
No wonder why: the post is from May 2014, and Shopster is from June 2013. A testament of how can I change my opinion on tools usage in a year. ↩
For 2016 standards, the app has piled up on technical debt. It currently:
- Doesn’t dupport screen sizes larger than the 4’ iPhone 5.
- Is not using auto-layout.
- Uses several deprecated APIs.
- Has workarounds for several things.
And, of course, it’s 100% Objective-C, as Swift was not around by the time we wrote it.
So, what would be the motivation to keep investing in it?
- We like the app. We still keep it in our home screens and use it.
- It still has some users (iTunes reports about 100 active users per day).
- Is an app we like to showcase.
- We could try a new business model.
And finally, we got a ticket last week asking us to please, please, add support for iOS 10.
When we launched Shopster, we neglected to include a sync feature. We figured it was not that important, but our users kept asking for it.
By the time we had to make the call, the best choice was to roll our own syncing engine and incur in a monthly cost, knowing almost for certain, that we might not be able to afford it in the long run.
Fast forward a few years, and Apple shipped CloudKit and more recently CloudKit sharing, which would allow us to enable sharing of shopping lists at no monthly cost.
Will we do it?
I’m not sure. What I’ll sure do (and write about) is see the state of our app, and what’s the effort involved in bringing it back to life.
caffeinatefor a long time, but I found a new use today that prompted me to write about it.
For those you don’t know,
caffeinateis a command line tool that prevents your Mac from going to sleep. From it’s
caffeinate creates assertions to alter system sleep behavior. If no assertion flags are specified, caffeinate creates an assertion to prevent idle sleep. If a utility is specified, caffeinate creates the assertions on the utility’s behalf, and those assertions will persist for the duration of the utility’s execution. Otherwise, caffeinate creates the assertions directly, and those assertions will persist until caffeinate exits.
Let’s say you need to run a long task, like restoring a DB in postgres with
pg_restore. The way you use
caffeinatewould be to run:
$ caffeinate -i pg_restore database database.dump
But let’s say you forgot to run
caffeinateand your process has already been running for too long to cancel and restart. Before today, my approach was to use Caffeine to prevent the Mac from going to sleep. However, there’s a second way to invoke
$ caffeinate -i -w 12345
12345is the pid of the process you want to finish without the Mac going to sleep.
I just updated an old post with a sample code on how to use
UITableViewRowAction. The biggest new? I used an interactive Playground instead of the old sample code. When possible, I think it’s a much better way to share small projects for readers to try.