Skip to content →

Tag: iOS

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

Xcode must be fully installed before you can continue. Continue to the App Store?

Are you using Xcodes.app and Expo and seeing this error when trying to run the app in the simulator?

› Opening on iOS...
✔ Xcode must be fully installed before you can continue. Continue to the App Store? … yes
Going to the App Store, re-run Expo CLI when Xcode has finished installing.

The problem is that Xcodes installs apps with a version like: Xcode-15.2.0.app. Where the App Store installs it like: Xcode.app

All you need to do is let it know when you Xcode is with the following command:

sudo xcode-select -s /Applications/Xcode-15.2.0.app/Contents/Developer
Comments closed

Managing where rows can be moved to in UITableView

In an app I was working on, I needed to prevent users from moving rows from section 1 to section 0. After reading the docs, I found Apple has just the API: Reordering Table Rows.

Here’s how I used the API. If the proposed destination section is 0, then return the current indexPath. As a result the user will be unable to draw a row from section 1 to section 0.


func tableView(tableView: UITableView, targetIndexPathForMoveFromRowAtIndexPath sourceIndexPath: NSIndexPath, toProposedIndexPath proposedDestinationIndexPath: NSIndexPath) -> NSIndexPath
{
    
    if proposedDestinationIndexPath.section == 0 {
        return sourceIndexPath
    }
    
    return proposedDestinationIndexPath;
}

My problem was simple, but this API could be used for all kinds of reordering problems.

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

How To Rename an iPhone XCode Project

I recent created a new iPhone XCode project based off of one of the samples provided by Apple. Beause of this the XCode project was called AppleSample.xcodeproj and it built an app called AppleSample.app. I wanted to rename the project and give it my own name. It’s not as easy as it sounds. Here are some instructions which are based off some instructions I found here (http://aplus.rs/cocoa/how-to-rename-project-in-xcode-3x/)

  • Copy/rename the folder into new name
  • Get inside the new folder and rename the .pch and .xcodeproj files. Example rename AppleSample.xcodeproj to MyCoolApp.xcodeproj — and — rename AppleSamplePrefix.pch to MyCoolApp_Prefix.pch
  • Delete the build folder. (Using the finder)
  • Open .xcodeproj file in text editor, like TextMate or TextWrangler. That’s actually a folder, which contains 4 files (you can also right-click and do Show package contents, which will reveal the files)
  • Open project.pbxproj in text editor and replace all instances of the old name with the new name. Be careful not to do a find an replace. Since the default name was AppleSample, there were several references to: AppleSampleAppDelegate.h and AppleSampleAppDelegate.m. You do not want to replace these unless you also rename that file.
  • Open .pbxuser where is your user name. Then repeat the previous step by renaming. I’m not sure if this is necessary. You may even be able to delete this file? But changing this file worked for me.
  • Load the project file in XCode, do Build/Clean all targets

After following these steps, I was able to open the project and build it to the simulator and the device.

I had one additional problem that I came across later that required a fix. When I finially built the application for “deployment” to the App Store, I had problems signing the code. I complained that it couldn’t find the Certificate for “Scott Anguish”. I looked in the build settings and couldn’t find reference to this name. So again I opened project.pbxproj inside of MyCoolApp.xcodeproj and found 2 instances of this line:

CODE_SIGN_IDENTITY = “Scott Anguish”;

I replaced both of them with the correct code signing identity and it worked!

UPDATE: Check out this bash script which does it for you automatically:
renameXcodeProject.sh

Comments closed