Skip to content →

Tag: Apple

WebPDF 3.0 Is Now Available

WebPDF 3.0 is now available for free. This is a major update to one of my oldest apps.

I originally built WebPDF in 2014 for my kids’ elementary school. The school needed a simple way for parents to save emergency contact information from its website to their phones. At the time, there was no easy way to turn a webpage into something durable and easy to keep offline, so I quickly put together WebPDF.

Since then, the app has continued to evolve. What started as a small utility for saving a webpage as a PDF is now a much more capable tool for keeping important web information available when you need it.

With WebPDF 3.0, you can save webpages directly from the app or send them to WebPDF from Safari and other apps using the Share Sheet. You can choose between full-page and reader-friendly captures, and control paper size, orientation, margins, and background options before saving.

The PDF library has also been completely redesigned. You can search saved documents by title or PDF text, organize them into folders, switch between list and thumbnail views, rename files, merge PDFs, edit page order, remove pages, and share documents with other apps.

WebPDF also includes a built-in browser with bookmarks, history, find-in-page, and an option to open the current page in Safari.

Existing documents are brought forward when updating, so longtime users can keep their saved pages while gaining the new library and capture options.

WebPDF 3.0 is a much bigger update than the original app, but the purpose is still the same: make it easy to save useful information from the web and keep it with you.

Comments closed

SwiftTip 1.5 is Now Available

SwiftTip 1.5 is now available on the App Store for free.

What’s new in SwiftTip 1.5

  • Customize up to seven quick tip percentages, or enter any custom tip from 0% to 100%.
  • Choose Exact, Round Tip, or Round Total with clearer controls.
  • Split bills between up to 20 people while keeping the full tip and total visible.
  • See refreshed themes, stronger contrast, and a redesigned Settings experience.
  • Use improved support for larger text and VoiceOver, along with more reliable currency calculations.

I originally created SwiftTip in 2015 for two reasons—and both are in its name.

First, I wanted a quick, free way to calculate a tip. Most tip calculators felt clunky and slow, so I built one designed for just a few taps and swipes. The goal was to calculate a tip swiftly and get back to your meal.

Second, SwiftTip was one of my first chances to build something with Apple’s new Swift programming language. It was a practical way to learn the language while making an app I would actually use.

Over the years, SwiftTip has remained both a useful utility and a small experiment. I’ve updated it to try new Apple APIs, Swift language features, operating-system capabilities, and evolving iOS design patterns.

This release continues that dual purpose: a modern, fast tip calculator—and a chance to keep exploring what’s new in Swift and iOS.

Learn more about SwiftTip or download it for free from the App Store.

Comments closed

Me 3.1: Share Your Contact, Your Way

Me 3.1 is now available for free. This release makes it easier to keep your contact details close at hand—and more importantly, to share the right version of them with the right person.

What’s new in Me 3.1

  • Saved sharing profiles let you create reusable choices such as Personal, Work, or Networking.
  • QR contact cards let anyone scan your selected details, including people using Android.
  • Send to Myself adds a Share Sheet extension for quickly moving files into a new email to yourself.
  • Widgets, Siri, and Shortcuts put your preferred contact details one tap—or one voice request—away.
  • A refreshed sharing flow, onboarding experience, and new app icon round out the update.

A small app with a long history

I first created Me in 2009. At the time, its purpose was simple: I wanted a fast way to pull up my own contact information whenever I needed it. No digging through Contacts to find my phone number, email address, or mailing address.

Over time, Me became more useful as a way to share my contact information. My contact card has a lot of data, and I do not always want to give all of it to every person I meet. Me made it possible to share only the specific fields I wanted: perhaps a work email address and phone number, but not a home address or other personal details.

Apple has since brought selective contact sharing into iOS, which is genuinely useful. In a sense, Apple “Sherlocked” one of Me’s best features. But sharing is still contextual, and Me 3.1 improves on that idea with saved sharing profiles. I can now set up a Personal profile, a Work profile, or any other combination of contact details, then choose the appropriate one without rebuilding the selection each time.

Beyond AirDrop

AirDrop is a great way to share a contact between Apple devices, but it does not help when the person standing in front of you uses Android. Me 3.1 adds QR contact cards so you can share your selected details with anyone who has a QR code reader. They scan the code, add the contact, and you stay in control of what was included.

The underlying idea has not changed since 2009: your contact information should be easy to reach and easy to share. Me 3.1 simply gives that idea more useful, more private, and more flexible ways to work.

Lean more about Me or Download Me for free on the App Store.

Comments closed

iPhone Development Helper: Fill up your Address Book

AddressBookFill is a simple application which populates your address book with contacts. This is useful when developing for the iPhone and working on the emulator.

On many occasions, I’ve spent quite a bit of time adding contacts to the emulator to test something. Then when I change emulator version, they all get erased. This is very frustrating. So I put together this simple application which allow you to programatically fill up your address book.

Currenly the address book is populated with U.S. Presidents. Values are set for:
* first name
* last name
* photo
* phone number
* birthday

I’ll make it more robust in the future. But you may find this useful for now. The code might also be interesting if you’re learning how to program the address book.

Download: addressbookfill-10.tar.gz

Comments closed

ASIHTTPRequest – Uploading Photos

Recently I used ASIHTTPRequest to upload images and other data from an iPhone application to a web server. I search around and looked at all the different options and this was best and easiest to use. It’s open source and comes with lots of good examples. I was particularly impressed with the network queue.

The one thing I did not find, was sample code for was posting an image to a server. Here is some sample code:


// Initilize Queue
[networkQueue setUploadProgressDelegate:statusProgressView];
[networkQueue setRequestDidFinishSelector:@selector(imageRequestDidFinish:)];
[networkQueue setQueueDidFinishSelector:@selector(imageQueueDidFinish:)];
[networkQueue setRequestDidFailSelector:@selector(requestDidFail:)];
[networkQueue setShowAccurateProgress:true];
[networkQueue setDelegate:self];

// Initilize Variables
NSURL *url;
ASIFormDataRequest * request;

// Add Image
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataPath = [documentsDirectory
stringByAppendingPathComponent:@”myImage.jpg”];

// Get Image
NSData *imageData = [[[NSData alloc]
initWithContentsOfFile:dataPath] autorelease];

// Return if there is no image
if(imageData != nil){
url = [NSURL URLWithString:@”http://myserver/upload.php”];
request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
[request setPostValue:@”myImageName” forKey:@”name”];
[request setData:imageData forKey:@”file”];
[request setDidFailSelector:@selector(requestWentWrong:)];
[request setTimeOutSeconds:500];
[networkQueue addOperation:request];
queueCount++;
}
[networkQueue go];

Note: It’s not necessary to use a queue here because I’m only uploading 1 thing. But in my application I’m uploading many things and a queue was helpful. It also runs in the asynchronously in the background, which prevents the UI from getting locked up.

Note 2: When sending large files you should use “setFile” instead of “setData”. Files are then read from disk instead of memory. Here is an updated example. Thanks again to Ben Copsey for this library and his useful comments below.

NSString *imagePath = [documentsDirectory
stringByAppendingPathComponent:@”myImage.jpg”];
url = [NSURL URLWithString:@”http://myserver/upload.php”];
ASIFormDataRequest *request =
[[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
[request setPostValue:@”myImageName” forKey:@”name”];
[request setFile:imagePath forKey:@”photo”];

More info on streaming here: http://allseeing-i.com/ASIHTTPRequest/How-to-use#streaming

Comments closed

MacOSX user Disappeared & Restored

The other day, I opened my MacBook Pro a few hours after closing the lid and putting it to sleep.  It wouldn’t wake from sleep.  I tried several things to get it to try and wake up, but had no success.  This has happened a couple times in the past, and I usually just hold down the power key to restart it.  So that is what I did.

When it started back up and loaded the login page, I noticed something strange, my user was missing.  I have 4 user’s registered on my computer and now only 3 of them were showing.  So I logged in as one of the other users who an admin.

Upon login, I could see that my user’s account still existed on disk:  /Users/doug  When I went to the System Preferences, I did not list my user.  I wasn’t sure what was wrong.

I began searching through the file system and found there is a file for each user in /var/db/dslocal/nodes/Default/users/  Example:

/var/db/dslocal/nodes/Default/users/doug.plist

I opened up doug.plist and found that it was a binary file.  I could read some of the text in there and saw some mention of “Kernel” and other thing that suggested a stacktrace or dump.  I opened up the plist for another user and found that it was standard XML.  

So I copied the doug.plist from my Time Machine backup and replaced it with the one on my laptop.  I rebooted and my account was restored.

I’m not exactly sure what happened, but the moral of the store is:

  1. Create a Time Machine Backup
  2. Have at least one other Admin user on your computer you can login to if all fails.
Comments closed