Monthly Archives: April 2012

  • Successful Unlock of Two AT&T iPhones (iPhone 3G and iPhone 4S)

    iTunes Unlock Confirmation
    iTunes Unlock Confirmation

    Summary (TL;DR)

    This is a bit long but the short and sweet is that you have to:

    1. Get AT&T to go to a separate “iPhone Unlock” page before they send the unlocking email. The email is not connected to your IMEI unlock in any way. It’s just instructions.
    2. Put a non-AT&T SIM into the iPhone. T-Mobile prepaid works great for this
    3. Wait for iPhone to display “Needs Activation” message after it finds the foreign network
    4. Connect to iTunes (twice for me) to get the “Congratulations” message. I got an error the first time on each phone after inserting the foreign SIM.
    5. No backup/restore is necessary, contradictory to AT&T instructions.

    I was able to get a 3G and 4S unlocked.

    The Good News

    Last Friday, AT&T announced that they would begin unlocking iPhones that met any of the following conditions if the account was in good standing:

    • iPhone is out of contract (24 months since purchase)
    • iPhone has been upgraded to a new phone with AT&T upgrade
    • iPhone has been purchased with no-commitment pricing
    • iPhone contract has been terminated and ETF has been paid

    I have two phones that meet those conditions. One is an iPhone 3G I got when I signed up for AT&T. I then upgraded to an iPhone 4 when it came out in June 2010. I sold the iPhone 4 to an individual on Craigslist and then purchased an iPhone 4S from an individual on Craigslist who represented to me that it was not connected to any contract (no commitment pricing). Therefore, my 3G and 4S should be eligible.

    First Try

    I contacted AT&T Sunday morning to request an unlock on both. As I expected, they thought I was crazy and told me AT&T doesn’t unlock iPhones. I requested that they check with a supervisor or check online documentation. After a brief hold, they confirmed they were unlocking iPhones, but they’d have to connect me to another department. After waiting on hold with me for about an hour across two times they hung up on me, I got the second department.

    They took my IMEIs (the number that identifies a device on a GSM network) to verify eligibility. My 3G passed. My 4S, I was told, would not be eligible since I didn’t have a receipt and it wasn’t connected to any contract on my account. I appealed this and they spoke with a supervisor. AT&T was able to verify the 4S was not connected to any contract and therefore was eligible. The representative sent me a link to this PDF to explain the rest of the unlock and told me that both phones were unlocked.

    The gist of the PDF is that you must backup and restore the iPhone to get it to unlock in iTunes. I knew this was not the normal procedure for other countries that do iPhone unlocking, but I didn’t have enough information to question it yet.

    I tried with both iPhones, backing up and restoring, and got no message in iTunes confirming an unlock, like other people from other countries have been getting for years. I thought maybe it was unlocked and I just didn’t know, so on Monday, I paid $10 for a T-Mobile pre-paid MicroSIM so I could test it. Both phones said “Activation Required” and when I plugged them into iTunes, it reported that they were unsupported SIMs. In other words, the phones were not unlocked.

    Second Try

    Peeved, I called AT&T around 8:30pm on Monday night. I had to start over, and the tier 2 person at AT&T this time had no idea what unlocking meant and kept going to her supervisor who informed me I needed to jailbreak to use it on T-Mobile. I eventually got to this supervisor around 10:50pm (yes, those times are right; the hold to get to tier 2 and 3 was excruciating; they kept wanting me to hang up and call back but I refused), he reiterated the thing about T-Mobile and jailbreaking. I told him this is not how GSM unlocking works.

    What I kept explaining is that the previous representative read to me from her AT&T system that “After the ASR has verified the IMEI eligibility and submitted it for unlock”, to go to this other page to send me the previously linked PDF. The PDF is not in any way linked to my IMEI. So I kept telling everyone I spoke to that they were missing a step: in order to unlock the phone, they had to give Apple permission to unlock it, and that’s the part that they weren’t doing. The email itself did nothing other than tell me what would happen if they did unlock it.

    Resolution

    After arguing for about 15 minutes, since he didn’t understand unlocking but was genuinely trying to help me, Johnathan finally found a link in his system for a separate page that was titled “iPhone Unlock”, hosted by Apple. He put my 3G IMEI into this page after logging in and confirmed the IMEI with me.

    I connected the iPhone to iTunes; nothing. I backed it up and restored (no data on the 3G so this goes relatively fast); nothing. I put the T-Mobile SIM in, instead of an AT&T SIM and reconnected to iTunes. This time I got an error, and I forgot to take a screenshot, that said: “Unable to activate” or something like that.

    iPhone 4s on T-Mobile Screenshot
    iPhone 4s on T-Mobile

    Success

    I disconnected and reconnected, and suddenly I got the image at the top of this post, confirming activation. My iPhone 3G displayed T-Mobile at the top, and I got a text from T-Mobile welcoming me to the network.

    Johnathan and I followed the same process with the iPhone 4S, and I got exactly the same results. I didn’t do a backup and restore at all on the 4S. I just put the T-Mobile SIM in after he submitted the unlock to Apple, waited for it to display Activation Required, connected it to iTunes, got that error message, disconnected, and reconnected. I immediately got the “Congratulations” again. A screenshot from the 4S is at the right.

    I’m now very happy both phones are unlocked to work on any GSM carrier, even though it took a lot of my time and patience.


  • Zip File Classes Finally Available in .Net 4.5

    Right now .Net 4.5 is still in beta, but I noticed something that will make developers who must interact with zip files happy: .Net 4.5 will have native support for dealing with zip files. Up until now, the System.IO.Compression namespace only had support for GZipStream and DeflateStream.

    I, like many other developers, have been using the fantastic SharpZipLib library, but I don’t like to have dependencies in my projects if I don’t have to. In order to iterate through a zip file and list its contents while extracting the code looks something like this (SharpZipLib has a lot of one-liners to allow for extracting with events as well, but bear with me):

    private static void ExtractSharp(string zipFile, string extractionLocationSharp)
    {
        Console.WriteLine("Extracting with SharpZipLib");
        Console.WriteLine();
    
        using (var archive = new ZipFile(zipFile))
        {
            int readCount;
            byte[] buffer = new byte[4096];
    
            foreach (ZipEntry entry in archive)
            {
                Console.WriteLine("Name: {0}, Size: {1}", entry.Name, entry.Size);
    
                var extractedPath = Path.Combine(extractionLocationSharp, entry.Name);
                if (entry.IsDirectory)
                {
                    Directory.CreateDirectory(extractedPath);
                }
                else if (entry.IsFile)
                {
                    using (var zipStream = archive.GetInputStream(entry))
                    {
                        using (var outputStream = new FileStream(extractedPath, FileMode.CreateNew))
                        {
                            while ((readCount = zipStream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                outputStream.Write(buffer, 0, readCount);
                            }
                        }
                    }
                }
            }
        }
    
        Console.WriteLine();
    }

    I haven’t installed the .Net 4.5 beta on my work machine yet, but according to the MSDN documentation, it should look like this:

    I don’t know if this compiles in .Net 4.5. I don’t have it installed yet.
    private static void ExtractDotNet(string zipFile, string extractionLocationDotNet)
    {
        Console.WriteLine("Extracting with .Net 4.5");
        Console.WriteLine();
    
        using (var archive = ZipFile.OpenRead(zipFile))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                Console.WriteLine("Name: {0}, Size: {1}", entry.FullName, entry.Length);
    
                var extractedPath = Path.Combine(extractionLocationDotNet, entry.FullName);
    
                // I'm not sure if it will create the directories or not.
                // There does not appear to be an IsDirectory or IsFile like in SharpZipLib
                entry.ExtractToFile(extractedPath);
            }
        }
    
        Console.WriteLine();
    }

    As you can see, it looks a bit cleaner, but the nice part is having it built into the framework instead of relying on yet another assembly.

    As noted in the comments, I’m not sure how .Net 4.5 will handle the directory entries or if it ignores them as separate entries. I may be able to test the beta later, but feel free to comment if you know how this works.