I was cleaning out my workshop a while back and came across my stash of old
hardware. In the pile was a perfectly serviceable
iPad 2.
Now I say serviceable, but the reality is that while it powers on and works it
is stuck at iOS 9.3.5 (so good luck finding App Store apps that will work),
and is pretty slow (well, it's a dual core Cortex-A9 @ 1GHz but that is slow
these days). Thankfully XCode still supports targeting iOS 9.3 so I set about
writing an app to put this thing to use. About the only thing I could think
of that I would actually use this thing for is... a digital picture frame.
That is a more palatable use than just recycling it though.
Small Rant
Now, about a year ago I wrote a rant about the development experience on Apple iOS devices, so I'll eschew most of that this time. I will however say that one of the points that I failed to think about that time was a lot of this is contributing to the prevention of mobile devices actually becoming the next generation of computing. If you look at the history of the digital computer, one of the things that heralded the mainstream usability of 'the next wave' was the ability to develop software directly on that hardware. The early days of each generation relied on developing software either on the previous generation of hardware, which meant that you needed to have access to and knowledge of both platforms. At the moment there is no technical reason you couldn't write software directly on a mobile device, it really is all business decisions.
In fact, on Android there are in fact efforts to make it possible to build Android directly on device. Sadly the reality is that Apple has decided to lock out any hope of getting there on iOS. Maybe we'll see some changes if the antitrust lawsuit goes anywhere but honestly I'm not holding my breath.
The other point I forgot to make was the fact that everything is a black box and locked down to only things Apple wants us to touch, there is basically no way to verify that the assertions they make about the security and trustability of the platform...
(Also, I am old enough to find a Commodore 64 based phone amusing.)
End of Small Rant
Now, moving along from all of that, here is what I ended up thinking about and designing around.
- Loading files on iOS is hard and sucks so lets get files from the Internet since that is easy.
- I'd like a clock, that seems useful.
- I really don't want to learn Objective-C, it looks scary.
- Let us also try to use Interface Builder as little as possible.
The result, which I'm calling iPictureFrame is available over in a git repository. I have it working on the aforementioned iPad 2 running iOS 9.3.5. I wrote it in Swift, with no external libraries, and I wired up the HTML/JavaScript version of xdaliclock to provide a nice animated clock over top of the picture being displayed. The application can be configured to fetch a JSON file from an arbitrary URL and cycle through the listed pictures. As an example, if you had https://www.example.com/frame/ setup, and https://www.example.com/frame/manifest.json looked like this:
[
"StockSnap_D30GWQGAIO.jpg",
"StockSnap_5Z56VEKLQY.jpg"
]
The app would fetch https://www.example.com/StockSnap_D30GWQGAIO.jpg and https://www.example.com/StockSnap_5Z56VEKLQY.jpg, cache them locally and start displaying them. There is also a timeout slider in the settings. It defaults to 30 seconds but can go all the way up to 5 minutes in between image changes.
If you want to run this for yourself you will have to clone the git repository, open the included project in XCode, update the signing to your Apple Developer certificate, build it and install it yourself because I continue to refuse to pay Apple $100/year for the ability to write open source applications that will probably only ever run on my own devices.
That being said, if you end up using it I'd love to hear about your experience, so drop me a line via the comment link at the bottom of the page.
🍻