Thanks for the sample code. In my sandboxed app I too had the problem of savepanel.url returning nil. After some experimenting, I thought I’d try passing the same URL to both arguments of the migrationController in makeDocumentWithContentsOfURL like this:

if ([migrationController migrateURL:url toURL:url error:outError])

And it worked! No savepanel needed!

I should also mention that is being discussed on the Apple dev forums.