Ok, this is getting ridiculous.  First the removal of the ‘I Am Rich’ application (which whatever your thoughts on the app itself, it didn’t violate any rules, just that the powers that be at Apple didn’t like the pricing scheme), and now others are being prevented from joining the AppStore.  Here’s the latest two I’m aware of:

Podcaster

Podcaster is a native iPhone app developed by someone in the Apple developer program and not using anything that isn’t permitted in the terms and conditions of the SDK.  It provides the ability to search/add/download podcasts from your iPhone without having to have any software on a desktop sync for updated downloads.  The developer, Alex Sokirynsky, has let the world know of the reason his app was rejected by the AppStore:

“Since Podcaster assists in the distribution of podcasts, it duplicates the functionality of the Podcast section of iTunes.”

Actually it provides more functionality, Apple…is that your problem with it?  That users are able to add new podcast subscriptions from their iPhone and not wait to get to their iTunes sync machine because you don’t allow guest syncing from iTunes?  And so what if it duplicates the podcast section of iTunes?  This is an iPhone app, not an iTunes extension.

MailWrangler

The latest to get hit is MailWrangler, a native iPhone app that enables access to GMail accounts.  The developer submitted the app on July 17th and received a reply more than 30 days later indicating:

“…Your application duplicates the functionality of the built-in iPhone application Mail without providing sufficient differentiation or added functionality, which will lead to user confusion…”

There was also other feedback given to the developer, Angelo DiNardi, that seemed appropriate (no way of editing the account) to which he agrees and seems like open to fixing.

So the problem seems to be duplicity of features according to these two rejections.  Really?!  So all those calculator applications (currently over 30 doing a search on ‘calculator’) don’t duplicate the built-in calculator functionality?  What about the 10+ weather applications that seemingly provide the same features as the built-in Weather application?  What about the StockWatch app ($2.99) that provides what looks like identical functionality of the built-in Stocks application?

      

C’mon Apple, this is getting ridiculous.  Your are letting the likes of “DaysTo Christmas” in the AppStore ($0.99 by the way in case you can’t look at a calendar), but not allowing me to choose if I want to use a different mail app or download podcasts wirelessly?  This is getting absurd.

Are they violating the terms?  I don’t think so.  A look at the iPhone SDK Terms shows no restrictions on the types of applications that can be built (except for real-time route guidance/automation) only noting that applications “…may only use Published APIs in the manner prescribed by Apple and must not use or call any unpublished or Private APIs.”  Neither of these applications do that!  It seems there is a conflict in the SDK Terms and the AppStore Terms…which I haven’t seen – anyone have a link to AppStore-specific terms that might indicate that no duplicate functionality can exist?  I’m guessing it isn’t there.

Apple – either enable alternate distribution channels for iPhone applications, or stop rejecting my choice as a consumer because it might be better functionality than you are providing.  Guess what, that’s what developers do – find ways to increase the value of the platform.  You shouldn’t have a developer program if you think people aren’t going to find ways to implement new functionality that may compete?  What gives Apple?  Why are you deciding what I can/can’t install when all other things being equal (i.e., not violating any terms of any SDK))?!  I can’t believe there is no developer outrage beyond these two developers. 

Apple is increasingly falling out of favor with the hi-tech crowds by doing things like this without explanation.  I only see this increasing.  Someone in Steve Jobs’ organization needs to get a wake-up call and start making some changes.  I think the easiest change for the AppStore would be to enable other distribution channels (and not just the beta-tester channel they finally opened up for app developers) so that anyone who has a native app built with the SDK can provide me, the user, the choice to decide what may “lead to user confusion” or what might be better functionality!

Wake up Apple…seriously.

While you can do a lot within Silverlight with effects, as demonstrated by techniques used like seen in Shine Draw, you may also want some helping hands to implement these.  It’s not always fun to write some code for when you just want to be able to drop in an effect on your application.  You want to concentrate on your application logic and get assistance in creating some of the visual effects.

If you didn’t know, there are some libraries out there that can help.  I’ll highlight two of them here (if you know of more, please post in the comments).

SvLite Effects from Cellbi

This library from Cellbi provides various effects in their library that you can see on their demo site.  Included are:

    • Carousel
    • Wipe effects
    • Tweens (easing, bounce)
    • and some bonus effects/controls (modal window for example)

They are pretty interesting and you should check them out.

Silverlight.FX from Nikhil

Don’t know who Nikhil is?  Well for one he’s wicked smart.  He’s a principal architect at Microsoft working on a lot of different things and his work is seen in a lot of ASP.NET.  He’s implemented some effects into a library he calls Silverlight.FX.  Included effects/transitions are:

    • Fade
    • Highlight
    • Shake
    • Pulse
    • Spin
    • Resize
    • Move
    • Composite
    • Cross-fade
    • Blinds
    • Slide
    • Flip

You can view these in action on Nikhil’s sample page and read about the framework as well as download it here.  I’m always amazed at the stuff he comes up with.

So two pretty good effects libraries you can play around with.  Have fun!

Saw some posts today over at Don’s site about Surface.  The Surface SDK is starting to get more visible whereas before it seemed a little black-boxish to me.  Turns out (as we all knew) it really is just WPF with some unique Surface-like behaviors in the SDK.  Take this quick demonstration from a program manager on the SDK.  With using the same concepts that we use in WPF and Silverlight for data binding, etc. you can come up with a quick application using the inherent gesture support from a Surface device:

Pretty cool huh?  Same XAML concepts we apply in current work today, but instead of StackPanel, you add a ScatterView and boom, you get some of that simiplistic gesturing support.  Now I know we aren’t all running out to create a photo album viewer to stretch photos, but it’s a good demonstration of some of the simplicity in the SDK.  I kinda wish the ScatterView was actually a Silverlight control :-)

Regardless of your views on politics, here’s an implementation of Surface that MSNBC is starting to use in their newsroom.  I think this is a great use of the device and SDK…it shows a great use-case scenario (and the guy seems to be having fun with it)

Anyhow, I thought these were some great examples of the SDK and a non-entertainment/media) app in use.

So you want H.264 support in Silverlight?  So do we.  In fact we will be showing a preview of H.264 and AAC support in Silverlight at the International Broadcasting Conference (IBC) this week in Amsterdam.  Scott Guthrie comments on this saying:

At IBC 2008 we will be demonstrating a technology preview of H.264 video and Advanced Audio Coding (AAC) audio playback support in Silverlight, and H.264 authoring using Microsoft Expression Encoder and Windows Server 2008 for delivery. Until now, Silverlight has supported the SMPTE VC-1 and Windows Media formats, as well as MP3 for audio, enabling customers to take advantage of broad support across the Windows Media ecosystem, including third-party tools, service providers and content delivery networks.

We’ve always wanted Silverlight to support a variety of formats, so today we’re announcing that H.264 and AAC support will be available in a future version of Silverlight, which will offer content owners greater flexibility and choice to deliver video and audio.”

One thing that I didn’t know was that Microsoft has been an active member in the standardization of H.264.  Microsoft’s Gary Sullivan was the chairman of the Joint Video Team (JVT) which developed the H.264 standard.

This is exciting news for the future of Silverlight.  I hope that this is good news to the implementers of media and Silverlight.  You can find out more information about the IBC here and a full Q&A with ScottGu here which also gives some great information about the results of viewing at NBCOlympics.com and where other uses of Windows Media Server were implemented (CCTV for example).

UPDATE: To clarify, this support will be in a future version of Silverlight.


This work is licensed under a Creative Commons Attribution By license.

Man, I feel like I’m constantly on this soapbox about creating a good non-installed experience.  I’m recently sparked again by reading a recent post from Pascal Leloup entitled “Silverlight – It’s too damn complicated to setup.”  These are the times that I wish I could sit next to every developer at the moment they experience this frustration.

Part of the time it can be dealing with beta software (as is the case in one of Pascal’s scenarios here), and others I think just take some time to understand the why behind certain things.  Let me take a stab at some things here for Pascal’s (and hopefully yours too) benefit.  While his specific example was around a media player, some of these concepts go far beyond that.

ASP.NET Media Control

If you use the ASP.NET Media Control (<asp:MediaPlayer/>) you get some ease of being able to just drop it in, attach a media source (WMV/WMA/MP3) and you get a player.  One thing to note though is that the output is a Silverlight 1.0 application, not a Silveright 2 experience.  The scripts and templates for the ASP.NET Media Control are embedded resources.  You can certainly supply your own skin, but have to create it.  The documentation for the control are available here where you can see how it can be used, how you can use Javascript to program against it, and how you can use various MediaSkin files or create your own.  In my honest opinion, this is a good start, but will not likely get you to a customized user experience for the media playback experience.  Additionally, you can customize the ‘not installed’ experience as it exposes the PluginNotInstalledTemplate property that you can put whatever you want there.

Pascal says:

“…they have to make sure the Media player ASP.Net user control continue to be updated or maybe put it back to the Ajax Control Toolkit as an open source project, to be sure the community can improve it.”

I will be honest and say I’m not sure if the skin thing with using Javascript will be changing by Silverlight 2 timeframe…but the necessary scripts, etc. are continually being updated.  As I’ve said (sorry ASP.NET team), I think if you are looking for a highly customized experience, this may not be the control for you.

Silverlight.js

I’m assuming that Pascal probably is a Firefox user and the initial use of the script was continuing to show the install badge logo.  Based on the comments, it sounds like really outdated tools.  The script available on MSDN (which is the latest) has the proper install links and also fixes the problem with Firefox 3 detection.

Keep in mind though this is just a script.  It isn’t going to automatically do everything for you.  It should be considered an SDK tool and help you do some detection and provide alternate content to the user if the plugin is not installed.

Silverlight control

I assume here Pascal means the <object> tag and thus a Silverlight 2 application.  It looks like for the most part he got this working (with some media problems that I’m happy to try to resolve; oh and Pascal the media stretch fix has been checked in to the Codeplex project).  As to the Firefox 3 ‘official’ support…Silverlight 2 is still in beta and we’ve already said that we’ll be supporting Firefox 3.

Pascal comments:

“The other matter is to get a much cleaner way to implement easily Silverlight 2 on an ASPX page. Why not doing something like the Listview, with a template part where we can put our own installation links?”

Actually you can.  There are two ways you can do this, but let me show you a snippet, first using the ASP:Silverlight control:

   1: <asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/_SilverlightApplication1.xap" 
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   2:</span>         <span style="color: #ff0000">MinimumVersion</span><span style="color: #0000ff">="2.0.30523"</span> <span style="color: #ff0000">Width</span><span style="color: #0000ff">="100%"</span> <span style="color: #ff0000">Height</span><span style="color: #0000ff">="100%"</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   3:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">PluginNotInstalledTemplate</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   4:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span><span style="color: #0000ff">="http://go.microsoft.com/fwlink/?LinkID=115261"</span> <span style="color: #ff0000">style</span><span style="color: #0000ff">="text-decoration: none;"</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   5:</span>             <span style="color: #0000ff">&lt;</span><span style="color: #800000">img</span> <span style="color: #ff0000">src</span><span style="color: #0000ff">="http://go.microsoft.com/fwlink/?LinkId=108181"</span> <span style="color: #ff0000">alt</span><span style="color: #0000ff">="Get Microsoft Silverlight"</span> <span style="color: #ff0000">style</span><span style="color: #0000ff">="border-style: none"</span><span style="color: #0000ff">/&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   6:</span>         <span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   7:</span>     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">PluginNotInstalledTemplate</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   8:</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">asp:Silverlight</span><span style="color: #0000ff">&gt;</span></pre>

Which essentially would be the same as:

   1: <object data="data:application/x-silverlight," type="application/x-silverlight-2-b2" 
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   2:</span>     <span style="color: #ff0000">width</span><span style="color: #0000ff">="100%"</span> <span style="color: #ff0000">height</span><span style="color: #0000ff">="100%"</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   3:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="source"</span> <span style="color: #ff0000">value</span><span style="color: #0000ff">="ClientBin/_SilverlightApplication1.xap"</span><span style="color: #0000ff">/&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   4:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span><span style="color: #0000ff">="http://go.microsoft.com/fwlink/?LinkID=115261"</span> <span style="color: #ff0000">style</span><span style="color: #0000ff">="text-decoration: none;"</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   5:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">img</span> <span style="color: #ff0000">src</span><span style="color: #0000ff">="http://go.microsoft.com/fwlink/?LinkId=108181"</span> <span style="color: #ff0000">alt</span><span style="color: #0000ff">="Get Microsoft Silverlight"</span> <span style="color: #ff0000">style</span><span style="color: #0000ff">="border-style: none"</span><span style="color: #0000ff">/&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   6:</span>     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span></pre>

<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   7:</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">object</span><span style="color: #0000ff">&gt;</span></pre>

So you can see that ASP.NET does provide a method for putting Silverlight applications there using the ASP:Silverlight control and also exposes the PluginNotInstalledTemplate object for you to customize.  In the non-ASP.NET example, you can see that the alternate content is provided after the last <param> tag in the <object> tag.  What will happen here is that if the <object> tag is not understood, it will render the HTML it can understand.  You can see more about this on this screencast.

“Big Huge Icon”

Pascal notes:

“They automatically put a big huge icon in your face without any explanation at all to tell your grandmother what the hell to do with this bluish Silverlight logo? Super.. what?  I’d loved to add my own touch, an help button, a new logo, no hope.”

On the last sentence of no hope to add your own touch, he couldn’t be further from the truth…more on that in a second.

On the first note: I couldn’t agree more!  I get frustrated when I see the Get Microsoft Silverlight install badge.  But the challenge is that it is the best default for people who aren’t customizing their experience.  We could have come up with a super creative, very descriptive image, but what if the Silverlight content is only 10x10px?  As it stands now, the default image wouldn’t look good in that scenario!

The point here is that the developer must own the install experience.  Silverlight isn’t on every desktop, let’s be honest.  The focus in the ‘not installed’ experience should be your content/company and not Silverlight.  It is important to keep the Silverlight branding at some level because once they click install it will show them the Silverlight installer and you want to keep continuity in the message of what they are installing.  Outside of that though, you own that space.  Maybe I should lobby to change the Visual Studio templates to add comment code instead of the default badge so that it reads:

   1: <!-- PUT YOUR CUSTOM PLUGIN NOT INSTALLED EXPERIENCE HERE -->

I’ve already written about some good examples of doing this.  It was even pointed out in the video player Codeplex project that I participate in, that we didn’t have guidance on that.  I cringed a little bit to even provide a sample, because I really believe the web site should own that experience…but I at least put a sample in the documentation.

When Silverlight ships we’ll be providing an updated installation guidance document talking about the various ways you can do this, with some clear samples of the SDK methods of detection of upgrades, non-installs, browser refresh/restarting, etc.  The one thing the document won’t do, however, and that is provide you that alternate HTML.  Why?  Because the non-installed experience is about your content, not Silverlight.  Imagine how you feel now when you see the “big huge icon” – it doesn’t make sense right?  Neither will it to your customers if you don’t provide them with information.  And don’t ask Microsoft to provide the samples…why would you want Microsoft to design/describe the content from your organization?

Summary

Sorry to keep repeating, but it’s about the content, not Silverlight.  Content is king.  If you are looking for a gallery of ‘not installed’ template experiences, stop looking – it doesn’t make sense.  Your brand in your application/site/organization is important and won’t be found in any templates.  Even other rich platforms don’t provide custom templates.

Be sure to take time to add this as a work item to your projects using Silverlight…don’t forget about it.  This is an important step in early adoption of your content in Silverlight and you should take time to nail that experience.  As I mentioned, we’ll provide updated guidance on any new settings/APIs that you can tap into to make the most out of that experience and minimize the impact to your end-user.

Related Resources:

    • Screencast: Install Experience Customization
    • <li>Blog: <a href="http://blogs.msdn.com/piotrp">Piotr Puszkiewicz</a></li>
      
      <li>Blog: <a href="http://timheuer.com/blog/archive/2008/03/25/creating-a-great-silverlight-deployment-experience.aspx">Examples of Install Experiences</a></li>