Solving the Facebook “No Internet Connection” Problem

Update 15-Aug-2011: This fix only applied to the new version of the iPhone Facebook app back in April 2011. Any problems after April 2011 is probably not the same as the one described here.

I recently upgraded to the latest version of the Facebook iPhone app, but I’m not sure if that caused the problem.

When you attempt to open your News Feed, it shows “Loading” for a while before showing “No Internet Connection“. But obviously this is not the case, because if you try other pages such as Friends or Places or Profile, they work perfectly fine.

It appears as if the app has lost the authentication cookie or something, so the fix is trivial.

  1. Tap on the menu at the top left (the icon with 9 squares) and tap the “Account” button (also at the top left) on the main menu screen
  2. Choose either “Help Center” or “Account Settings” from the popup menu
  3. You should see a login bar or login form – just fill up your details and login

That’s it! Logging in from within the app fixes the problem. Don’t try to select “Logout” from the popup menu – I tried it and it freezes the app.

It has been reported that this option may not work for everybody, but it did work for me.

Apple’s RAOP is Cracked

For a long time now, apps can stream high-quality audio to an Airport Express or an Apple TV using the RAOP protocol. However, the reverse cannot be done due to the fact that the protocol uses asymmetric encryption, which means the private key is baked into the firmware of the Apple (or Apple-licensed) device.

Finally, someone has done something about it. James Laird dumped the ROM of his Airport Express and extracted the private key. He posted the private key to the vlc-devel mailing list.

And now, the site on which he hosts his implementation called shairport is returning HTTP 500.

Update 13-Apr-2011: The link to shairport and his site is back up.

Publishing Services over mDNS in C

For some time now I’ve been looking into mDNS-advertised services. My aim was to advertise a service using mDNS in a C program.

Typically, doing this is really easy: call the Bonjour or Avahi APIs, and the system-wide daemon will do the rest for you. The problem arises when there is no system-wide daemon such as mDNSResponder (if you’re on a Mac or Windows) or Avahi (for the other OSes). This usually happens when you’re on an embedded system, like a router that runs Linux.

One way to solve this would be to cross-compile Avahi or Apple’s mDNSResponder for your platform. I chose another alternative – embedding a simple mDNS responder into the C program. Of course this implementation needs to be as lightweight as possible, meaning little or no external dependencies.

I thought it would be trivial to read the specifications and implement the mDNS protocol, but it turned out to be quite a bit of work. A few days into writing my own implementation, I found mdnsd written by Daniel Pelleg. I almost killed myself.

So here, I present my implementation that works – tinysvcmdns. To publish a service, you need only make 4 calls:

  1. mdnsd_start() to start the main thread
  2. mdnsd_set_hostname() to set the hostname and IP address
  3. mdnsd_register_svc() to register a service and begin an announcement
  4. mdnsd_stop() when you no longer need to respond to mDNS queries

It may be buggy, and it doesn’t do name collision detections, but it works. I hope to improve upon it as I use it in my project(s). tinysvcmdns is open-source, under the GNU LGPL “modified” BSD license (Update 2012-03-26: changed the software license).

mdnsd pretty much has a similar offering, but it implements features like name collision detection.

If you have the need to publish services over mDNS very simply, I hope you can benefit from this post, and will not re-invent the wheel like I did.