I received a mail from Apple 2 hours ago stating that version 1.3 has been approved, after 12 days. Version 1.3 is starting to show up as an update for existing 1.2 users. Be sure to grab this version as it adds program details and a nicer interface.
Once you have updated the app, hit the reload button on top of the Now Playing screen to fetch the extended data, which includes program details, if you have already launched the app today. Because Be Tv has already loaded & cached the data, the new version will by default just use the cached data.
Important: this version requires firmware 3.0 or newer. If you haven’t updated your iPhone yet, now is the time!
If you’re having issues with the new version, be sure to leave a comment. I already know of 2 (minor) bugs which will be fixed in version 1.3.1, so if you leave a comment, I might be able to squeeze it in the bug-fix version too. Suggestions are also welcome.
Having avoided the issue for a while now, I feel it is appropriate to air my take on push notifications in Be Tv. I have given this quite some thought and have come to the conclusion that I will not implement these in Be Tv, for one main reason.
Regardless of Be Tv, push notifications are indeed a nice feature and add some real value to applications in some cases. Yet using them to set a reminder for a certain program is in my opinion wrong. Push is intended to alert users when unpredictable things happen, a news app wants to push an earthquake news item, an instant messaging app alerts the user of a received message.
In the case of a tv guide, we know beforehand when the program is going to start and we know when to remind the user. I, as a developer, want to insert an event in the calendar and set an alarm for that. I, as a developer, do not want to setup a server pushing out reminders for something that could be handled a lot better if Apple opens up the calendar API. Push only works when the device has an active data connection, ruling out iPods (wifi isn’t a real alternative, as it isn’t available everywhere) & quite a few iPhone users without a data subscription. Calendar on the other hand is available on all devices, does not need a data connection which consumes precious battery power and is overall a better solution. It just makes sense to put it there, instead of (ab)using push notifications.
What this means for Be Tv is obvious, unless Apple opens up the calender API, there won’t be any reminders. I am aware that this decision will be met with some dissatisfaction, but feel it is the right decision. Taking into account Be Tv is a free service & I would like to keep it that way.
I hope this answers some of the questions users have asked in the last couple months. One last thing, regarding version 1.3, it’s still under review.
It took a while, but a new version of Be Tv has been sent to Apple for review. Be Tv has been available in the Belgian App Store for 6 months, nearing 30.000 downloads. Version 1.3 adds – as lots of people have requested – detailed program information, a freshened up interface & a few minor improvements. Nothing groundbreaking but a normal evolution. Here’s a small sneak preview:
All programs have a genre & most of them have extra information like a short comment and/or a long summary. Movies have a list of the main actors and series the episode name. There is however one huge issue which might be a showstopper for non-dutch speaking users. The extra information is in dutch, even when the interface is set to english or french. We unfortunately do not have access to translated info.
One of the small improvements is how long program titles are displayed. Long titles are cut off in version 1.2 & some of them are – even with holding the device sideways – not readable. Long titles are displayed over 2 lines in version 1.3, greatly improving the readability. Nothing earth shattering, but as said before a logical improvement.
Having said that, I think we’ve given a nice preview of version 1.3. As soon as the upgrade shows up in the App Store, I’ll post it on the blog & Twitter. One final word, for those wondering, Be Tv remains a free program.
Before I made an attempt at creating a mutant iPhone, which turned out pretty good, I had a go at assembling a Minty Boost. A Minty Boost is a homemade portable charger, designed by ladyada.net, which works with regular AA batteries and has a USB plug, it’s able to charge almost anything that can be charged with a USB cable. And yes, it charges iPhones, doesn’t that sound like music to your ears?
The website lists all the parts needed, several schematics and a walkthough on how to assemble it. All parts can be bought online or you can search for them at your local hardware/electronics store. I choose to buy 2 sets online, since I had a hard time locating the IC chip in Belgium. A set costs $19.50 and contains all the parts needed, including a custom made PCB board (big plus). I choose the cheapest shipping method ($6) and it took only a week to get to the other side of the big blue ocean. Customs did ask €10 for the parts though.
The actual assembly is pretty straightforward and can be done without any soldering experience. The only thing left to do now, is fitting it all in a little box. I’ll post some pictures of the actual finished product, once I find a suitable metal box.
One of the issues one can encounter when building a REST service with the .NET Framework 3.5 SP1 is the fact that when basic authentication is enabled, it defaults to authentication against Windows accounts in IIS. It’s not possible to specify your own handler/provider to authenticate against for instance a proprietary user database, nor is it possible to secure only a certain operation/service and leave the others unsecured.
Luckily there’s a open source project hosted on CodePlex called WCF REST Contrib which, besides adding a whole lot of other improvements, solves the aforementioned issues. The project provides a sample solution showcasing all the features, which might seem a bit overwhelming since it includes quite some configuration. I have attached a sample project with only the bare minimum configuration (using attributes) to enable per operation authentication.
Browse to CancerService.svc/request/skincancer to test the authentication, the browser should display a prompt asking for a username and password. The username is “tony” and password “clifton”. Don’t mind the rather questionable service and operation name, I had no inspiration at the time.
The original documentation failed to mention that the per operation/service authentication depended on the WebErrorHandler, which has been corrected.
A few months ago I received a first generation iPhone which had been in a car accident. The screen had been cracked and the aluminum case was in a bad shape, despite the horrible external imperfections it was actually working, well kind of. I was unable at the time to restore it to firmware 2.2.1 since it would hang at one specific point during the process. Luckily, with the advent of firmware 3.0, somehow I was able to restore it without the previous hang.
I used the device a few weeks as test device for my Emmer Inc related adventures, until I got my hands on Lemmy Van den Eede’s bricked iPhone which didn’t boot at all. In the end I combined the best parts of both iPhones to create one working mutant iPhone.
The internet is filled with movies and guides on how to disassemble an iPhone, but I thought I’d post a few lessons learned and give my own opinion on the process. Before I attempted the transplantation, I was unsure how doable it would be.
Removing the black antenna cover and the aluminum back casing is difficult. No matter how easy they make it look in the movies, it just isn’t. I used metal tools instead of the advertised plastic case openers, which I doubt will do the trick. I’ve read several comments stating that the plastic tools look good, but are useless at opening the case. Expect scratches and scuff marks on the case and slight bending of the aluminum casing! I highly doubt if anyone can open the casing for the first time without causing external damage.
Once the device is open, disassembling it is indeed straightforward, I was a bit scared that I might not be able to assemble it again. But as long as you don’t lose anything it is easier than one would think. Just take your time & you’ll be fine. The only “issue” I had when assembling it, was a latch which had to be connected to the motherboard, I thought it had to click, but you just have to slide it in the connector.
Removing the glass plate and the actual LCD from the inner case is rather difficult, removing the glass plate itself from the LCD is in my opinion nearly impossible without breaking your LCD. In the end I took the inner casing with the LCD and glass plate of the bricked iPhone and inserted the motherboard of the other iPhone.
While I was at it, I also desoldered the battery of the bricked iPhone and soldered it back in into the mutant iPhone. The battery is soldered to the motherboard with 3 wires, the wires are covered with glue which is a little tricky to remove. But it is doable, even with little to no experience soldering. Whatever you do, don’t let the red wire tough the white or black one, according to the disasembly guides. Put some tape over the red one.
And that was kind of what I wanted to document. Just take your time, watch the disassembly videos a few times and you should be ok. If you came to terms with the fact that your beautiful iPhone will look a little less perfect afterwards, that is.
While surfing the web and browsing through development related forums, I encountered a lot of questions regarding multiline UITableViewCells. Prior to iPhone SDK 3.0 this was not an easy feat and although it is very common in UIs, the work that is related to creating multiline cells is not proportional to how common they are.
Apple definitely made it easier with new SDK, since we can interact directly with the UILabel. I know it’s pretty straightforward, but I’m always surprised by how many developers disregard the documentation & turn to forums/blogs for help.
Creating multiline cells is now as simple as setting the numberOfLines property to 0 (or a predefined number) of the textLabel, which is in turn a property of the cell. Given the height of the cell is sufficient, behold a multiline cell.
cell.textLabel.text =@"Some long text...";
cell.textLabel.numberOfLines =0;
Change the height of the cell with the tableView:heightForRowAtIndexPath: delegate method of the UITableViewController, either by returning a fixed height or by calculating the height needed to show the desired text.
Note that the text property of a cell is being deprecated in favor of textLabel.text, more info on the new 3.0 predefined cell styles can be found here.
Almost 3 weeks after submitting the 1.2 update to Apple, it has finally been approved and can be downloaded in the Belgian AppStore as of yesterday June 17th. Apparently some minor event called WWDC & the release of a phone delayed the approval division of Apple. We weren’t the only victims, the UiTagenda update was approved after 3 weeks too & a new Facebook update addressing some specific 3.0 bugs is still in review after several weeks.
The main improvements of version 1.2 have been mentioned before and can be found here. This new update is fully compatible with firmware 3.0, but isn’t built for 3.0 specifically. Users with 2.x firmwares are still able to install & use Be Tv.
In the mean time I can announce that Be Tv has been downloaded more than 20.000 times and has never left the top 50 since version 1.0 was released almost 3 months ago. It is currently at position 43 in the general top free applications and at position 9 in the entertainment ranking.
Unfortunately the new release was hindered today by a datacenter problem. And as with most things, it wasn’t something we could do much about ourselves. A firewall was misconfigured at the datacenter causing traffic directed at the Be Tv server to be rejected for a timespan of 6 hours, which is of course totally unacceptable. This downtime had nothing to do with the new Be Tv release, nor with firmware 3.0, there is and was no need to reinstall the application. We have started the quest to find a new hosting partner, since our current partner hasn’t proven to be reliable & responsible.
The new Be Tv version has now been under review for exactly 1 week. It will probably be approved and released somewhere at the beginning of next week. If WWDC doesn’t slow the process down, that is.
We aim at releasing an update once every month, which we would have made, if Apple didn’t take so long for reviewing the application.
The main improvements of version 1.2 are:
The ability to reorder channels.
Caching of the data.
An improved Now Playing screen, showing a progress bar of the current program & the name of the upcoming program.
Here’s a short video demonstrating these features, a full size video can be found on Vimeo.
One of the constants in a developer’s life is seeing code and knowing you’re doing it wrong, but not really knowing how to fix it and get it right. Due to whatever reason: no time… My Facebook like loading indicator article was no exception, the way I loaded a specific view from a separate nib felt so bad. Yet I posted it since holding it back for another 4 weeks was no option either. A week ago I had a eureka moment and it all made sense at around 2am on a Saterday morning. Here’s the correct method to load a view from a separate nib file.
Instead of looping through the contents of the nib, the key are IBOutlets. Create a NSView IBOutlet in your controller class were you’ll want to use the view. Next step is to open your nib file which contains your external view and change the File Owner’s class identity to the controller class you’ve just extended with the IBOutlet for the view. Now just ctrl-drag from the File Owner to your view and select your desired IBOutlet from the list.
Now you’ve connected your controller and the external view, yet the IBOutlet will not be hooked up automatically when your controller’s created. This is a good thing because we can postpone loading the extra nib to when it’s really necessary saving resources for other, more important stuff. This is a practice Apple encourages, using multiple nib files and loading them dynamically when needed.
This is the code needed to load the nib, it’ll automaticall hook up your controller’s IBOutlet to your view.
Simple? Indeed, yet it took me a while to realize using an external nib is basically just the same as putting all your views in a single nib container. It’s all based on hooking up IBOutlets.