RSSAmplifier

Blog

Hawk iMedia

Recent content on Hawk iMedia

hawkimedia.comRSS feed ↗69 posts

Latest posts

Same site, new host

It’s hard to believe, but after 10 years at Amazon AWS and even more at Heroku, I’ve moved the entire hawkimedia.com infrastructure to Cloudflare: website, blog, everything! 
 It all happened in less than five days, and it wouldn’t have happened without AI. 
 Why the change? 
 An update recently to one of our iOS apps required updating the website with new…

SOLVED: Where are all my old sims, Xcode 11?

If you opened an old Xcode project in Xcode 11 and wondered where all your simulator versions before iOS 13 went, you may need to tweak the deployment target of your target. 
 Experienced Xcode users will be familiar with setting a deployment target for your project by clicking on the project file in the Navigator, selecting the project itself, and then changing the iOS Deployment Target here:…

SOLVED: macOS Mojave 10.14.4 system frozen every morning

Since upgrading my iMac to macOS Mojave 10.14.4 several months ago, I have found the system frozen every morning, with no smoking guns. After weeks (months?) of this, trying many different “solutions”, and even calling Apple for help, I finally found the “fix” that seems to have solved the problem. 
 TL;DR 
 
 The adjustment that finally solved the issue…

Your app does not comply

As Apple promised in September, it started sending out emails to developers warning that their apps would be removed from sale on the App Store unless updated. I received two such emails. I expected more. 
 It seems the criteria for selection had more (all?) to do with whether an app had seen any downloads recently than anything else, despite the stated reason being “We noticed that your…

A couple things...

We’ve got an update in the works to our popular app OuttaMyWay! - Personal Lights & Siren which includes some bug fixes, a couple new sirens, and some Siren Board improvements. 
 Thing 1: Be A Beta Tester 
The update has already had some early beta testing with some good feedback. We're hoping to get it out the door soon, but we'd sure love to get some more testing in. If you'd like…

Stop spammers at the gate: Don't blindly trust SASL authenticated connections

Recently a user’s email password was cracked. Not long after, she started receiving hundreds of bounce messages. My first thought was that these messages were back scatter, produced when spammers insert any random sending server address. So bounce messages are misdirected to that unsuspecting server. But the messages kept coming. So I started thinking she had a virus or malware on her…

A Precipitous Drop

I am at a loss to explain it, but I suppose it was inevitable. I have been observing a very long and slowly declining revenue tail for my best app for some time. 
 My most popular app, OuttaMyWay! - Personal Lights & Siren , has seen a remarkable drop in sales of late. Even a price reduction did not stimulate an uptick in sales. Could it be that the world’s appetite for an emergency…

Lockbox v3

Lockbox v3 is now available, sporting a vastly more robust yet less complex API for storing data into and retrieving data from the iOS keychain. 
 The basic premise of Lockbox has not changed: make it easy to store data securely in the iOS keychain, and make it easy to retrieve. 
 What has changed are the APIs. This is due to the fact that for anything but the most basic of (supported)…

Announcing FilterFresh v1.3

An update is available (as of yesterday) for FilterFresh , our filter maintenance and reminder app for iOS.This update has the usual minor bug fixes and improvements, of course. In addition, we’ve added the ability to more easily mark a filter as replaced or cleaned directly from the main filter list. Just swipe left on any row and the new action appears. 
 
 Tapping the action…

Same site, new host

If you subscribe to this blog, you received notice of a new post, cleverly titled “test post”. Oops. Sorry. We were making sure we could still create content because we’ve moved the blog, wholesale, to an Amazon AWS EC2 instance. This is partially an experiment, but also necessary as the previous hosting setup was getting old and slow. 
 So accessing this blog going forward…

OuttaMyWay v3 Available Today!

Nearly two years in the making, OuttaMyWay v3 is finally available today ! It’s a complete re-write, but the app retains all the familiar features users have come to love, plus a bunch of new things. 
 Supporting iOS8 and above, OuttaMyWay is now native on all iOS devices. That’s right: even iPad! We’ve worked hard to do this in a way that ensures a high quality visual…

Call for testers: OuttaMyWay! v3

Nearly 2 years in the making, OuttaMyWay! v3 is ready for public testing! This update supports iOS8 and above on both iPhones and iPads, and has a number of other enhancements and new features. Rewritten from the ground up, the app retains its familiar feel. The app is now universal, supporting all iPhone and iPad screen sizes natively. We’ve added more siren tones and more patterns. And…

RAID to the Rescue

Thank G-d for RAID! And I’m not talking about the bug spray. 
 I have a Linux server in my basement which hosts the family email, a few websites, and all our music and photos. I built this machine 5+ years ago. By modern standards it is woefully under-powered and under-sized. But it’s been running well all these years with nary a problem. Until recently…. 
 It all…

Dynamic & Interactive Launch Screens

I recently set out to re-write one of my apps. The app currently supports iPhone and iPod touch screens up to and including the 4" displays. There are a handful of “Default” launch screens to support essentially 2 screen sizes in 2 resolutions. When looking at also supporting iPhone 6, 6+, and iPad screens for the rewrite, the number of “Default” launch images gets crazy.…

Follow-Up: First Responders Day Promotion & Support

A few weeks ago we ran a promotion in support of National First Responders Appreciation Day . We lowered the price on our popular app OuttaMyWay! - Personal Lights & Siren for three days and committed to donating half the proceeds to the National Fallen Firefighters Foundation and the National Law Enforcement Officers Memorial Fund . 
 I’m pleased to report that we have made those…

Supporting National First Responders Day

Saturday, September 27th is National First Responders Appreciation day in the United States, a day set aside to recognize, remember, and thank all the brave men and women who daily put their lives on the line (or who have given their lives in so doing) to help someone else. Maybe you’ve witnessed or benefited from their efforts. Read on for a special promotion. 
 Hawk iMedia’s top…

FilterFresh: The Back Story

This week, with as much media “blitz” as an indie shop can muster, we announced our latest app, Filter Fresh , along with our completely revamped website . Filter Fresh is free and solves a simple problem: It reminds you when to change or clean your filters. (Think: HVAC or water or any other kind of filter you have.) As a bonus, you can order your replacement filter from within the…

Badged UIBarButtonItem

A new project (nearly ready to release; stay tuned) required some custom UI. One element was a badged UIBarButtonItem, for which I wrote a custom class, which I am releasing as open source here: https://github.com/granoff/FFBadgedBarButtonItem 
 
 So what’s the use case? You have a UIBarButtonItem in a navigation bar that you want to adorn with a badge, much like you might adorn an…

Caching +imageForURL: Results

About a month ago I wrote about the recurring but ever-solvable problem of loading images in the background without losing performance while say, scrolling a table view. While I would be pleased to ship that code today, there is an improvement that betters performance as soon as an image is requested more than once: Caching. 
 Consider an app where most of its content is fetched from the…

Endlessly Solvable Problems

There is no shortage of common engineering problems that have been solved over and over again, or just once. In either case, if a Good(tm) solution is found, it gets reused wherever it is needed. Others however, get solved over and over again. Not because they are hard or unsolvable, necessarily, but because they are interesting and pose an ever-intriguing challenge to developers. Background…

Look Back, Look Ahead: New Year Observations

Goodbye ‘13, Hello ‘14! This is the time of year where we all take stock of the year just ended, and think about what the coming year may hold. This is that post for me, a personal reckoning of sorts.Professionally, it was a good year. In December I celebrated one year at my day job, where I work with 5 other great iOS developers in the electronic medical records space. At times…

iOS7 UIPickerView Customization

The iOS UIPickerView is one SDK component that leaves little to the developer for customization. With iOS7 and its entirely revamped look and feel just around the corner (allegedly), you may think that you’ll be stuck with the new and improved UIPickerView chrome which for many may feel sub-optimal for existing or new apps that use this control. Help is just a delegate method away. 
…

The Next Thing

I debated about what to write about today, especially in the wake of yesterday’s WWDC ticket frenzy, the subsequent online screaming about it, and everything else. I think in the end, Apple will do what Apple does, and that’ll be that. Enough about that. On to the next thing… a new app to develop! 
 Some time ago I wrote several articles about Project X , a new app I was…

Standalone Delegate Objects

It is very common practice that an object like a view controller is the delgate (and perhaps datasource) for another encapsulated or included object, such as a table view. This affords easy access from the delegate methods to the delegate object. But when might you want to use a delegate object that is not your main view controller? And why? 
 The answers are: rarely and it depends. 
…

Unit Testing for Fun and Profit

How do you know if your code works? You test it of course. But, how do you test your code? Do you run it in the simulator? On your device? Is that enough? The simple answer is: No. How can we do better? Answer: Unit testing! 
 It is a well established software engineering maxim that any bug you find while still in development is less costly than a bug found in QA, which is still less costly…

Later Never Comes

What is the cost of expedience? Answer: Technical debt. How often have you had to solve a problem quickly, knowing that your solution was correct (i.e. it works), but not really how you’d have liked to do it? Sometimes the real world demands such tactics, and we think “We’ll fix it later.” But later never comes. 
 Eventually, you will have to pay the piper for your…

Agile By Fire

One of the features of my new day job is that the development environment is full-on Agile. It’s my first experience in such an environment, and while I’ve worked in plenty of places that used bits and pieces of Agile, an “all Agile all the time” development model is quite eye opening. I’ve had to literally learn and adapt to Agile on-the-fly – by fire, if you…

Annual Apple Shutdown Begins Now!

If you are an Apple Developer, you have no doubt been bombarded lately with reminders that Apple is shutting down its developer portal for Christmas beginning today Friday, December 21st, through next Friday, December 28th. What shall we do without our daily dose of download statistics?! 
 When I first experienced this annual shutdown my first thought was: Why? Isn’t this all automated?…

[self viewDidChange]; -- Wait. What?

No, that’s not a new and magical API in the title. Just an eye catcher… 
 This week I changed day jobs. So literally, my own view has changed. That is to say, the office I go to, the people I see, and windows I look out of past my new desk have all changed. 
 The new job is the next step on my evolution as an iOS developer. After two years at a local startup as the only iOS…

Pro Tip: Data Types Matter

I made a stupid mistake recently, which cost me more than a few hours of time to figure out. But I learned a couple things: Xcode will let you dig as deep a hole as you like, despite its “assistance”, and no amount of experience is a substitute for taking your time, especially when writing code. 
 I was implementing a custom view recently, with an embedded UITableView. No problem.…

Geofencing Followup

In a previous post I wrote up some discoveries I had made about using geofencing – region monitoring in iOS parlance – based on some testing I had done. I have since applied those experiments to a real world application and made some new discoveries, which follow. 
 Geofencing is where you define a virtual boundary around a given point, usually circular but it doesn’t have to…

Composite Images using Image Masks

In my last post about dynamic pattern images , I showed how to create images on the fly for use as background pattern images. As promised, today I’ll show how to create composite images with cutouts using masks. 
 Building on the sample project from last time , I have changed the background pattern image to a red diamond on a black square. This shows the effect of using a mask to create…

Dynamic Pattern Images with Core Graphics

The image handling capabilities available in iOS (and OS X for that matter) are pretty spectacular. Using only high level APIs, you can work with images quite easily. But lurking very close to the high level APIs is Core Graphics, where in the real power lies. 
 Background 
With the recent release of iOS6 and more importantly the iPhone 5, I began updating one of my apps to take advantage…

Reclaiming a TimeMachine Volume's Disk Space

A slight departure from the thing we all love doing (writing code) to a thing some of us may have to spend time on (system administration). We added a fourth Mac to our home network recently, and I wanted to get it backed up automatically. The solution was obvious: TimeMachine! I run a Linux server with gobs of storage. It runs Netatalk 3.0 and serves up (among other volumes) a 500GB TimeMachine…

Fast UITableView Scrolling with Network Image Load

This is an old and common thing to do in an iOS app. Doing it well – or at all – it turns out, is pretty easy, but perhaps not obvious. 
 The Problem 
You have a table view with table cells that each contain an image you retrieve from the internet. The problem is that for every image load, the table scrolling stalls or becomes jerky while the image is loaded because that…

Are Your (Older) Apps Ready for iOS6?

I would hope this is obvious to anyone who’s been around the iOS eco-system during an iOS beta period: Make sure your apps will continue to work with the new release! 
 Last week I tweeted this: 
 
 The message was clear: Now is the time to smoke-test your existing apps using the available (to developers) iOS6 beta and/or iOS6 simulator. 
 Of particular concern should be…

De-railed

Two things happened recently that have each, in their own way, de-railed me to some extent. The details of each instance should be interesting to iOS developers and Rails developers alike. 
 As I thought about what to write about this week, I realized I had had two recent experiences that were actually related (i.e. same project) and with which I could make a play on words (something I enjoy…

App Roundup

Since April I’ve delivered a surprising number of apps to the App Store, and I thought I’d give a brief summary of those projects and what made (or makes) them interesting. 
 
 Tivoli Radio 
As internet radio apps go, this one isn't bad. It's no Pandora or Tune-In Radio Pro, but then it's not intended to be. Tivoli Audio is actually in the business of selling real…

Interviewed by Beginning iOS Development blogger

Recently I was interviewed by Lee Shen Han for his blog Beginning iOS Development . That interview is now available here . Lee devotes a section of his blog to interviewing indie iOS developers so we can all learn from each others experiences. It was fun to be asked to participate and to answer the questions. Thanks, Lee!

The Last Word on Many From One

It turns out that building multiple targets from one source code base is both easy and hard, both simple and complex. It all depends not only on the ultimate products you want to create, but a bit on your workflow and how you like to setup and run your project. 
 In my last post on this topic I mentioned that the rubber was meeting the road on a project where we had multiple targets defined…

Many From One, Again

Several months ago I wrote about some tricks I was using to build many targets from one code base . The rubber is meeting the road on that project as we get closer to being ready to submit to Apple, and what I thought then was the solution is turning out not to be so. 
 In the original post, I basically suggested that this simple command lined would do the trick:

Achievement Unlocked: Git Ninja

The title of this article may be overstating my expertise with git slightly, but that’s how I feel having successfully tackled what is, I think, a fairly non-trivial task with git: managing changes across multiple branches and multiple remotes using a single working directory. 
 Of course, git is perfectly suited for complexity! But I don’t think people realize it, necessarily.…

Lockbox: Easily Secure Your App's Sensitive Data

It seems like there has been a lot in the “developer” news lately about the secure storage of user data in iOS apps, as well as related topics around securely replacing the venerable but now deprecated device unique identifier, or UDID. For the latter, more than a few replacement schemes have been offered up, most with a “secure” storage element. This all got me thinking…

Pulling in Many Directions

Sometimes there is no time to focus on just one or two things. No, sometimes things get busy and between day jobs, and night jobs, and family, and all those other obligations we have in our lives, there is time only to touch on a few things briefly. That’s what my development life has been like lately, moving from project to project to project. Read on for a cornucopia of stuff…

Geofencing: What do you do with it?

Location Services are one of the most interesting capabilities available in iOS. One interesting feature therein is “geofencing”, also known as “region monitoring.” I recently investigated how this works and what you can do with it. While easy enough to use, region monitoring alone isn’t enough to bring your user back to your app. 
 The idea of geofencing is…

Core Data Image Caching

It is a common pattern for an app to do something with data that is not local. Maintaining decent app performance while fetching the data is one challenge (and not the focus of this article). Keeping the data, and enough of it, for later use and to prevent having to get it again, is another challenge. There are obvious solutions, some easy and some not, and all with their own advantages and…

Animation Revelation

For the newcomer to iOS development, “animation” may seem like a daunting proposition. That’s how I felt when I wanted to animate a game board 90 degrees in my very first app. How could I possibly do that!? It must be difficult! And so off I went to see how to do it…. 
 Turns out, it was really easy! And it didn’t require much code at all. In fact, the iOS SDK…

OS X Lion + Oracle + ruby-oci8 Gem Solution

In my day job, we have need to interface with an Oracle database, from ruby. There’s a gem for that: ruby-oci8. The problem, since OS X Lion came out, is that installing the gem with it’s native extensions (i.e. compiled C code) fails. Why? Because the native extensions cannot be built using the default 64-bit architecture. 
 The solution? Build it for a 32-bit architecture!…

Project X Has Begun

In my last post, Something Old or Something New? , I talked about my own mental process for choosing what to do next that would be meaningful, i.e. worth doing and doing well, and ultimately profitable (for a reasonable definition of that word.) I am pleased to say: Work has begun! 
 I’ve always had a hard time knowing when the design of something was “done,” meaning that…

Something New or Something Old?

What’s my “Next Great App” going to be? No one knows, of course, since almost anything can be a hit, or not! I’ve experienced this phenomena with my own, current apps. And this leaves me with an ever-present quandary: Should I conceive and develop something new and (maybe) awesome, or update/re-implement something old? What to do, what to do… 
 For my own apps, I…