Application Loader – The document XXX could not be saved as YYY.itmsp. The file doesn’t exist.


If you’ve just tried the application loader, clicked ‘New in app purchase’, got to the end (or tried to save the configuration), you will undoubtedly see this confusing error message.

Of course the file doesn’t exist, we’re just creating it. What are you on about Apple?

Here’s how to fix it.

At the top of the window – you should see this:

Screen Shot 2015-06-13 at 18.36.31

Click on Untitled, and type the name in you wish to save as, here I typed xxx.

Screen Shot 2015-06-13 at 18.29.42

Now, the title bar looks like this:

Screen Shot 2015-06-13 at 18.30.35

You can now save the file.

Really annoying eh?

My first experiences with the iOS review process


In this post, I’m going to share my experiences of the iTunesConnect/AppStore review process, so that others can avoid the traps I fell into, and can go in eyes open into it.

To prepare you – you have a small pile of process to go through, and your app can be waiting in the queue for a review for 3-12 days. Every time you cancel your submission and resend it you are sent to the back of the queue. You can, however, request an expedited review to align with an event or launch party, and they will try their best! Please don’t use this facility if your job doesn’t depend on it.

To find out the current wait time  AppReviewTimes.com is an unofficial time-keeper. Please contribute! You can also see what the current burn rate is by Apple: https://developer.apple.com/support/app-store/ . Review times can differ during the year – and can get worse just after an iOS update where all those developers without dedicated beta devices panic to rush out any fixes.

Tip: You want to try and do everything Apple asks of you – because if you fail the review, they only tell you ONE thing that was wrong. They stop reviewing at the first fault.

Contracts:

Before you even get to review, or develop your code, one of the first stumbling blocks that you’ll hit is that you need to set up your banking and contracts, fill in all that dull information before you begin. Why? Well, because you won’t be able to test in-app purchases or hook up to iAds without having agreed to all the legal stuff. Don’t spend hours (like I did) thinking you were a bad programmer.

Screenshots:

Prepare yourself. You’ll have to provide all your screen shots in about 5,000 different sizes for review. Shame they don’t offer a simple downscaling service given a larger picture! Luckily the Simulator can oblige. You’ll also have to have app icons of different sizes and splash screens in your app. There’s no point in me telling you what sizes to use, as they’d be out of date. Even Apple’s help files are out of date. The easiest way to get it right is to upload any old picture and see what it complains about. Seriously!

EULAs, Privacy Policy:

If you think you’ll be sued, you need to re-base your legal jurisdiction so it’s closer to you, and create your own EULA and Privacy Policy that is compatible with laws and rights protections in your country. As a tip, choose a software company in your country, and use their wording as ‘inspiration’. In addition Apple requests that you maintain a number of clauses that protect them, include those words even if you don’t understand them to pass review seamlessly.

Support page

Apple require you to have a support page, that’s not just the front page of your website. I successfully got through this by just giving them a Facebook page.  e.g. http://www.facebook.com/TapPhrase.

Combining in app purchases into the review

You have to add the in app purchases to the build in the iTunesConnect page, otherwise you’ll get rejected. You have to get them into the correct state (I think it’s Ready For Submission) before you can attach them. Your IAPs have to be accessible via your App, so if you determine the list of IAPs at runtime from your own server, you need to tell Apple “You need the internet running before you launch the app to test out IAPs” or they will reject you. It happened to me.

Rejection alters state of IAPs

If you get rejected, watch out – the IAPs may be disassociated with your build and put into a rejected or awaiting developer action state. You’ll need to hook them all up again.

Following the guidelines

I mentioned before that you need to follow the App guidelines – I didn’t and forgot to include a ‘Restore Purchases’ button in my app. That was my first rejection.

Post release issues:

1. Your app won’t be searchable straight away, but you can use the ‘…’ button to get the link to the app page and download it – a great opportunity to try it out for real!

2. iAds won’t appear immediately, so don’t fanfare your release too early – wait a few days and the iAds start working.

Tip: If you know the app reviewer is wrong, and you’ve been rejected… Go to the resolution centre and clarify exactly what steps they have to follow and ask them to try again. My binary was red, my IAPs were red and disassociated, I told them they were wrong, and that they had to do x/y/z, (which I should have told them first), and within an hour they’d put my binary to Awaiting Developer Release!

Choosing iOS only – the rationale


Some of you may know I’ve been working on a mobile game in my evenings and weekends. A solo developer, with lots of help from an artist.

Some have asked why I’ve not chosen the hybrid route so I can target Android, Windows Phone and iOS, and even PC all at the same time.

Here are the reasons, behind a Windows Developer choosing a MacBook Pro, Xcode, Objective C and SpriteKit.

I have an iPhone

I also have an Android tablet, but I prefer to use my iPhone. I love it! So I wanted my game on it. That still doesn’t explain why I’ve not chosen a hybrid route. Apart from wanting a MacBook pro because they looked shiny…..

I didn’t set out to make lots of money

Let’s be clear. If your strategy is to make millions, then you want to hit as many devices as possible and be accessible, translate into many languages and support all those going forward.

I’m only one person

I’ve been in the business of software product development for over 20 years; I know how much effort is required to support another operating system or database back-end. In the last few years, I’ve had first hand exposure into what’s required to deploy a simple PhoneGap/Cordova app to Windows 8, Blackberry, Android, iOS and Windows 8 Phone. My gut feeling is about 30% additional effort per platform, and that feeling of treading in treacle every time you add a single feature. That covers development, testing and designing within the different experiences expected of those devices. You’ve also got to take into account all the configuration of the setup, accounts, certificates, end user agreements, policies, best practice. I’m only one person.  I want to release!

Technology cost

You may think simulators are mature enough now that you don’t need any physical kit. You’d be wrong. Yes they are getting better, but you’ll find things like Apple’s hosted in-app purchase content can’t be bought without a real device. You’ll find it easier to test how your app interacts with phone calls, current music or other apps that might interrupt yours. In the PhoneGap scenario where you are writing HTML and Javascript, you’ll find that individual phone companies ship slightly different internet browsers, that are set to the default. Yes, you tested against the Chrome that comes with Android, but that’s not necessarily the same browser chosen by the phone vendor, and that’s what your app will run in.We’ve had to run down the shops and buy a phone costing £500 just to resolve these types of issues.

Native code is always up to date

One thing that worried me is the rate of new versions of iOS, Android. If you use a 3rd party wrapper, you’re at the mercy of the black box with (sometimes) no easy way to change or intercept that behaviour to workaround it. You might be stuck waiting for an update to Unity or have to write your own PhoneGap plugin to work around issues.

Getting the full developer experience

Working with PhoneGap using Javascript, HTML and CSS may be aligned to your future career needs and keep you current, but it’s really hard work, it wasn’t designed to be a game engine. I find it a poor and slow experience because it’s so hard to debug, navigate and not type safe (unless you’re TypeScripting etc). There’s nothing like using code designed to be used on a platform, with a development environment that’s designed to use that code and platform. I’ve been a Microsoft evangelist and used Visual Studio 6 to 2013. Xcode isn’t perfect, but I wanted to know what it was like to breathe the mac eco system. Obviously cross platform/portable code debugging is moving very fast recently and getting better all the time, but  not only do I want to get the game released – I want to experience how Apple intended me to experience development, and it’s pretty fun. Most questions were already answered on Stack Overflow, and I managed to add my own Q&A’s that hadn’t been found.

Will I regret it?

I now know SpriteKit. I’ve done this all in Objective C. All new to me. That’s not bad. I’ll have released a game. That’s not bad either. But, my game may be a complete flop and I’ll have been glad I’d not invested 200% more effort, and taken more time to develop & test a cross platform solution. Having said that, If I was doing 3D, I’d have probably chosen Unity and C#, but still focused on one of iOS, Android or Windows. – If the game becomes successful, I’ll hire some testers and buy some devices and then rewrite the code in some generic portable way.  Which shouldn’t be too hard – because I followed many SOLID principles and also didn’t put all the code behind UI events, or did I…..? I think there’s a lot to be said for choosing a hybrid solution if you’re really confident in doing so,  are performant in that development environment, and you’ve got the devices, manpower and patience of a saint.  Live by the sword – die by the sword.

I’m sure others won’t think the same way, and will have perfectly good rationale why they chose a different path. All I know is that I find learning another language really easy, and just want to use the best language that enables me to focus on solving the problem, rather than fighting with my favourite language to solve a problem.

iOS SpriteKit – Font Loading Times of SKLabelNodes


The other day I encountered massive performance bottlenecks in my SpriteKit project, when setting the .text property of an SKLabelNode.

I discovered that I wasn’t alone.

After investigating many different techniques to pre-cache, thread and speed up font loading, I discovered the real solution was simply to load a very specific font. The documentation from Apple is somewhat poor, and leads newbies into the same trap.

If you’re experiencing problems with font loading speed it maybe because you’re loading the ENTIRE font family and all its variants.

If you want a font to load quickly, be explicit.
If I load “Chalkboard SE” it will take 4-6 seconds, and appear to work.

But if I load “ChalkboardSE-Regular” , it’s virtually instantaneous ~100ms or less.

To determine the exact font name you need, simply use a more specific font name from the list below, and pass it to your SKLabelNode constructor.

Here’s the code used to extract the list…

for( NSString* familyName in [[UIFont familyNames] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] )

{

NSLog(@"%@", @"\n");

for( NSString* explicitFontName in [UIFont fontNamesForFamilyName:familyName] )

{

NSLog(@"  %@", explicitFontName );

}

}

AcademyEngravedLetPlain

AlNile-Bold

AlNile

AmericanTypewriter-Light

AmericanTypewriter-CondensedLight

AmericanTypewriter-CondensedBold

AmericanTypewriter

AmericanTypewriter-Condensed

AmericanTypewriter-Bold

AppleColorEmoji

AppleSDGothicNeo-Thin

AppleSDGothicNeo-UltraLight

AppleSDGothicNeo-SemiBold

AppleSDGothicNeo-Medium

AppleSDGothicNeo-Regular

AppleSDGothicNeo-Bold

AppleSDGothicNeo-Light

ArialMT

Arial-BoldItalicMT

Arial-ItalicMT

Arial-BoldMT

ArialHebrew-Bold

ArialHebrew-Light

ArialHebrew

ArialRoundedMTBold

Avenir-Heavy

Avenir-Oblique

Avenir-Black

Avenir-Book

Avenir-BlackOblique

Avenir-HeavyOblique

Avenir-Light

Avenir-MediumOblique

Avenir-Medium

Avenir-LightOblique

Avenir-Roman

Avenir-BookOblique

AvenirNext-MediumItalic

AvenirNext-Bold

AvenirNext-UltraLight

AvenirNext-DemiBold

AvenirNext-HeavyItalic

AvenirNext-Heavy

AvenirNext-Medium

AvenirNext-Italic

AvenirNext-UltraLightItalic

AvenirNext-BoldItalic

AvenirNext-Regular

AvenirNext-DemiBoldItalic

AvenirNextCondensed-Regular

AvenirNextCondensed-MediumItalic

AvenirNextCondensed-UltraLightItalic

AvenirNextCondensed-UltraLight

AvenirNextCondensed-BoldItalic

AvenirNextCondensed-Italic

AvenirNextCondensed-Medium

AvenirNextCondensed-HeavyItalic

AvenirNextCondensed-Heavy

AvenirNextCondensed-DemiBoldItalic

AvenirNextCondensed-DemiBold

AvenirNextCondensed-Bold

BanglaSangamMN

BanglaSangamMN-Bold

Baskerville-Bold

Baskerville-SemiBoldItalic

Baskerville-BoldItalic

Baskerville

Baskerville-SemiBold

Baskerville-Italic

BodoniSvtyTwoITCTT-Book

BodoniSvtyTwoITCTT-Bold

BodoniSvtyTwoITCTT-BookIta

BodoniSvtyTwoOSITCTT-BookIt

BodoniSvtyTwoOSITCTT-Bold

BodoniSvtyTwoOSITCTT-Book

BodoniSvtyTwoSCITCTT-Book

BodoniOrnamentsITCTT

BradleyHandITCTT-Bold

ChalkboardSE-Light

ChalkboardSE-Regular

ChalkboardSE-Bold

Chalkduster

Cochin-Bold

Cochin-BoldItalic

Cochin-Italic

Cochin

Copperplate

Copperplate-Light

Copperplate-Bold

Courier

Courier-Oblique

Courier-BoldOblique

Courier-Bold

CourierNewPSMT

CourierNewPS-BoldMT

CourierNewPS-ItalicMT

CourierNewPS-BoldItalicMT

DamascusBold

Damascus

DamascusLight

DamascusMedium

DamascusSemiBold

DevanagariSangamMN

DevanagariSangamMN-Bold

Didot-Bold

Didot-Italic

Didot

DINAlternate-Bold

DINCondensed-Bold

EuphemiaUCAS

EuphemiaUCAS-Bold

EuphemiaUCAS-Italic

Farah

Futura-Medium

Futura-CondensedMedium

Futura-MediumItalic

Futura-CondensedExtraBold

GeezaPro-Bold

GeezaPro

Georgia-BoldItalic

Georgia-Bold

Georgia-Italic

Georgia

GillSans

GillSans-Italic

GillSans-BoldItalic

GillSans-Light

GillSans-LightItalic

GillSans-Bold

GujaratiSangamMN-Bold

GujaratiSangamMN

GurmukhiMN-Bold

GurmukhiMN

STHeitiSC-Medium

STHeitiSC-Light

STHeitiTC-Medium

STHeitiTC-Light

Helvetica-Oblique

Helvetica-Light

Helvetica-Bold

Helvetica

Helvetica-BoldOblique

Helvetica-LightOblique

HelveticaNeue-BoldItalic

HelveticaNeue-Light

HelveticaNeue-Italic

HelveticaNeue-UltraLightItalic

HelveticaNeue-CondensedBold

HelveticaNeue-MediumItalic

HelveticaNeue-Thin

HelveticaNeue-Medium

HelveticaNeue-ThinItalic

HelveticaNeue-LightItalic

HelveticaNeue-UltraLight

HelveticaNeue-Bold

HelveticaNeue

HelveticaNeue-CondensedBlack

HiraKakuProN-W6

HiraKakuProN-W3

HiraMinProN-W6

HiraMinProN-W3

HoeflerText-Regular

HoeflerText-BlackItalic

HoeflerText-Italic

HoeflerText-Black

IowanOldStyle-Bold

IowanOldStyle-BoldItalic

IowanOldStyle-Italic

IowanOldStyle-Roman

Kailasa

Kailasa-Bold

KannadaSangamMN

KannadaSangamMN-Bold

KhmerSangamMN

KohinoorDevanagari-Light

KohinoorDevanagari-Book

KohinoorDevanagari-Medium

LaoSangamMN

MalayalamSangamMN

MalayalamSangamMN-Bold

Marion-Regular

Marion-Italic

Marion-Bold

MarkerFelt-Thin

MarkerFelt-Wide

Menlo-BoldItalic

Menlo-Regular

Menlo-Bold

Menlo-Italic

DiwanMishafi

Noteworthy-Bold

Noteworthy-Light

Optima-Regular

Optima-Italic

Optima-Bold

Optima-BoldItalic

Optima-ExtraBlack

OriyaSangamMN

OriyaSangamMN-Bold

Palatino-Roman

Palatino-Italic

Palatino-Bold

Palatino-BoldItalic

Papyrus-Condensed

Papyrus

PartyLetPlain

SavoyeLetPlain

SinhalaSangamMN

SinhalaSangamMN-Bold

SnellRoundhand-Black

SnellRoundhand-Bold

SnellRoundhand

Superclarendon-Regular

Superclarendon-BoldItalic

Superclarendon-Light

Superclarendon-BlackItalic

Superclarendon-Italic

Superclarendon-LightItalic

Superclarendon-Bold

Superclarendon-Black

Symbol

TamilSangamMN

TamilSangamMN-Bold

TeluguSangamMN

TeluguSangamMN-Bold

Thonburi-Bold

Thonburi

Thonburi-Light

TimesNewRomanPS-BoldItalicMT

TimesNewRomanPSMT

TimesNewRomanPS-BoldMT

TimesNewRomanPS-ItalicMT

Trebuchet-BoldItalic

TrebuchetMS

TrebuchetMS-Bold

TrebuchetMS-Italic

Verdana-BoldItalic

Verdana-Italic

Verdana

Verdana-Bold

ZapfDingbatsITC

Zapfino

 

As for how I got here – Read my journey below!

 

See

http://stackoverflow.com/questions/20380954/delay-when-calling-sklabelnode

http://stackoverflow.com/questions/24478476/settext-is-slow-with-sprite-kit

http://stackoverflow.com/questions/23255143/sklabelnode-delays-app-start

Many workarounds are suggested in the attempt to prevent ‘stutter’ or pauses in the game, particularly during transitions between scenes where the font is used for the first time. The pause happens when the .text property is assigned (the font is obviously loaded on demand).

During testing, I noticed that keeping strong references to SKLabelNodes in a singleton cache doesn’t help – when transitioning to a new scene the fonts still re-loaded.

 

I decided to look at the differences in the time the thread is blocked loading the different font families.

There’s also a difference depending on if you’ve loaded another font beforehand.

The table – explained

The first timing is an average of 5 runs, where I simply iterated through all the font families installed on the device, and produced the time it took to load each without restarting the device.

The second set of timings show the cost of loading the font from cold (one run).

The third set of timings show the cost of loading the same font, having loaded Arial first (one run).

The final column shows the seconds potentially gained by loading Arial first – not including the time it took to load Arial.

 

Average time (s) over 5 runs loading all font family names  If Loaded First   If Loaded after Arial   Gain in doing so 
Academy Engraved LET

2.871

3.134

2.180

0.954

Al Nile

0.008

0.269

0.196

0.074

American Typewriter

0.015

0.039

0.007

0.032

Apple Color Emoji

0.015

0.257

0.213

0.044

Apple SD Gothic Neo

1.195

2.210

2.151

0.059

Arial

0.018

0.009

0.002

0.007

Arial Hebrew

0.006

0.226

0.180

0.046

Arial Rounded MT Bold

0.006

0.009

0.004

0.005

Avenir

1.421

2.165

2.154

0.011

Avenir Next

1.148

2.168

2.096

0.072

Avenir Next Condensed

1.195

2.409

2.234

0.175

Bangla Sangam MN

0.010

0.039

0.004

0.035

Baskerville

0.010

0.026

0.006

0.021

Bodoni 72

1.221

2.169

2.168

0.000

Bodoni 72 Oldstyle

1.261

3.046

2.508

0.538

Bodoni 72 Smallcaps

1.132

2.149

2.133

0.016

Bodoni Ornaments

0.004

0.006

0.004

0.003

Bradley Hand

1.252

2.192

2.066

0.126

Chalkboard SE

1.182

2.584

2.102

0.482

Chalkduster

0.008

0.021

0.004

0.017

Cochin

0.011

0.031

0.005

0.026

Copperplate

0.010

0.020

0.004

0.016

Courier

0.018

0.029

0.007

0.022

Courier New

0.002

0.023

0.006

0.018

Damascus

0.006

0.210

0.186

0.024

Devanagari Sangam MN

0.011

0.042

0.007

0.035

Didot

0.007

0.025

0.023

0.002

DIN Alternate

1.161

3.066

2.341

0.725

DIN Condensed

1.248

3.492

2.279

1.213

Euphemia UCAS

0.003

0.016

0.016

-0.001

Farah

0.003

0.237

0.215

0.022

Futura

1.174

2.185

2.317

-0.132

Geeza Pro

1.582

2.275

2.517

-0.242

Georgia

0.009

0.020

0.004

0.016

Gill Sans

0.004

0.036

0.035

0.002

Gujarati Sangam MN

0.008

0.016

0.007

0.009

Gurmukhi MN

0.005

0.013

0.005

0.008

Heiti SC

1.189

3.278

2.462

0.816

Heiti TC

1.191

2.474

2.179

0.295

Helvetica

0.001

0.023

0.007

0.016

Helvetica Neue

0.005

0.024

0.015

0.008

Hiragino Kaku Gothic ProN

1.275

2.939

2.229

0.710

Hiragino Mincho ProN

1.233

3.319

2.119

1.200

Hoefler Text

0.015

0.030

0.007

0.023

Iowan Old Style

1.246

2.151

2.281

-0.130

Kailasa

0.002

0.211

0.213

-0.002

Kannada Sangam MN

0.009

0.025

0.007

0.018

Khmer Sangam MN

0.013

0.011

0.006

0.005

Kohinoor Devanagari

1.166

3.374

2.112

1.262

Lao Sangam MN

0.003

0.009

0.005

0.004

Malayalam Sangam MN

0.007

0.015

0.005

0.010

Marion

1.432

3.151

2.494

0.657

Marker Felt

1.443

2.193

2.415

-0.222

Menlo

1.278

2.157

2.056

0.101

Mishafi

1.263

2.394

2.697

-0.304

Noteworthy

1.170

2.162

2.134

0.028

Optima

1.167

2.358

2.118

0.240

Oriya Sangam MN

0.006

0.017

0.006

0.011

Palatino

0.019

0.050

0.011

0.039

Papyrus

0.013

0.014

0.004

0.010

Party LET

1.177

3.299

2.140

1.159

Savoye LET

1.202

2.453

2.164

0.289

Sinhala Sangam MN

0.011

0.021

0.014

0.007

Snell Roundhand

0.010

0.064

0.006

0.058

Superclarendon

1.200

2.391

2.129

0.262

Symbol

0.002

0.181

0.226

-0.045

Tamil Sangam MN

0.008

0.016

0.004

0.011

Telugu Sangam MN

0.012

0.021

0.006

0.015

Thonburi

0.017

0.011

0.009

0.002

Times New Roman

0.018

0.034

0.007

0.028

Trebuchet MS

0.012

0.018

0.006

0.012

Verdana

0.010

0.026

0.006

0.020

Zapf Dingbats

0.002

0.263

0.255

0.008

Zapfino

0.008

0.063

0.011

0.053

Using threads

I also discovered a way of making the majority of the pause happen without blocking the main SpriteKit animation, and that was to invoke an NSThread in the background to load the fonts. This maybe ideal if you have other assets you are loading and you can then present a progress bar, or spinning loading symbol to help the user understand what’s going on. I’ve not looked into making atlases of my fonts or other tools like http://www.bmglyph.com.

In my first scene, I simply spawn a thread which loads the fonts.

[NSThreaddetachNewThreadSelector:@selector(cacheFont) toTarget:selfwithObject:nil];

And add a function which loads, and stores a strong reference to the label node to keep the font alive in memory. – I’ve not tested if that’s required, but S.O. mentioned it.

-(void)cacheFont
{
SKLabelNode* cacheThisFont = [SKLabelNode labelNodeWithFontNamed:@"Noteworthy"];
cacheThisFont.text = @"a"; // setting .text loads the font.

   // todo - possibly a strong reference to the node in a singleton or member on your app.
}

However this just feels wrong…

 

Scene transitions

I witnessed that having a bare NSObject singleton which kept strong references to the SKLabelNodes populated with text was not enough – subsequent scenes can still suffer a delay. I even tried using the [copy] message on the existing label nodes in the cache to speed things up, but that also demonstrated delays if the SKLabelNodes weren’t in any scene.

However, I did discover that keeping the SKLabelNodes as children in a scene, prevents the lengthy loading delay.

That means, that if you load all your fonts in scene 1 with a progress bar, you have to keep making sure that every scene you transition to has SKLabelNodes added to it.

In my architecture I lazy delete the previous scene on a timed action, which may be help keep the nodes alive between transitions.

However.. It seems odd to have to go to such trouble…

 

And then I discovered loading more SPECIFIC font names took no time at all….. Thanks Apple – for giving a bad code example!!!

 

‘Al-Quida Free Terror Nettwork’ Wi-Fi hotspot grounds plane


Licensing: Using 3rd Party/OSS software or images in your commercial product.


DISCLAIMER: I am not a lawyer, solicitor or trained in any legal profession. If you act on anything in this article, it is at your own risk. You should consult your own legal counsel before exposing your company to risks & liabilities.

 

Now to the article…

Most Software Developers just want to use free, software libraries, code or graphics to quickly get over a hurdle and sprint away from the problem. We typically just want to embed a small piece of it in products we’ve been asked to make. What we don’t want is complex licensing terms, restrictions, impositions and uncertainty. We’d rather find a less optimal component with lesser licencing issues if it meant we could get beyond our current impasse.

There is no single thing as an Open Source Licence. To me, Open Source is a paradigm where one develops software or other content such as images or documents with community help, feedback, and some kind of public use ideology. That is completely distinct from the way in which that content can be consumed, adapted and redistributed by companies or individuals; which is where we enter the licencing minefield. There is no one “Open Source Licence”, but many licences that Open Source Software is available under. Each has quirks, legacy, purpose and definitions.

To help that, I’ve compiled a list of software licences encountered in my travels, and provided my personal interpretation of those. Use at your own risk.

 

Licences

Here is a selection of popular licences I believe to be entirely compatible with “embedding software/images under those licences into a larger commercial product”. Typically that means you aren’t just bare-face selling what’s already been made by the OSS community, but creating an app that needs (for example) a bit of code for authentication, or some graphics for your buttons.

I typically look for a licence that:

  • Is relatively simple to understand
  • Allows you to make modifications to the source code/image with little impact on your processes
  • Allows royalty free redistribution of the code/image (particularly when embedded in a larger application)
  • Does not impose licence terms on the work you have created
  • At most, requires you to attribute or reproduce licences ‘somewhere’.
  • Does not require you to expose modifications of source code available back to the community.

Complexity is a subjective viewpoint of how much text to read and/or how complex the terms and conditions and caveats are.

 

Licence

Conditions

Complexity

BSD 2 Clause

Reproduce entire copyright ,licence and disclaimer in documentation or other materials.

Low

BSD 3 Clause

As the 2 clause, but you are not allowed to use the technology or names to endorse or promote your product without permission.

Low

MIT

The copyright notice and the permission notice need to be included
in all copies or substantial portions of the Software. ‘The software’ doesn’t mean ‘your software’, but the
original work.I would, however, attribute to be polite.

Low

Apache 2.0

Include/attribute the original licence in the installation media/documentation, typically this is as simple as reproducing the NOTICE file for that component in your documentation.

Medium

Has a lot of text to go through compared to BSD 3 clause.

Microsoft Public Licence (MS-PL)

You’re not allowed to use trademarks/name of the
originator.

You (pretty much) have to include the licence as attribution.

Distribution requires your licence to comply with MS-PL’s
licence, but doesn’t mean your licence has to be MS-PL, it just has to not
infringe on the original terms.

Low

Creative Commons PD (CC0)

Do not imply endorsement of the originator.

No attribution required.

 Low

Creative Commons CC BY 3.0

Attribute the originator & link to the licence.

Do not use the originator as an endorsement.

Clearly state if modifications of the original works have
been made.

“Work” means the original work, not your work – your work
is the “Adaptation”.

High – purely on word count and inappropriate / unclear
consideration for use in software products.

 

Licences which didn’t make the list

Mozilla Public Licence 2.0

This licence is just too wordy and in it’s own words “copy-left”. Be warned. It requires you to do more than you’d like to distribute a program that includes code from MPL. Yes, in the simplest case where the original is unmodified, all you have to do is make sure that the source code is available from the link you provide, or on request and made available in a reasonable time frame/by reasonable means. But to me, the extra conditions place on it, and the slightly scary ‘copy-left’ statement makes me walk away.

 

 

LGPL 3.0

You may wonder why the Lesser Gnu Public Licence hasn’t even made my list. Apart from doing its best to not use relevant technical terminology, it adds conditions to distribution (aka “convey”) of your end product “a combined work” that uses the library you’ve downloaded from the web.

The most alarming condition is 4d – that you have to allow end users to drop in replacement libraries and/or allow end users to relink your product to them – that could present s significant security and support issue. Clause 4b and 4c also elevate the licence to GPL instead of LGPL which is viral.

There is another GPL licence – the Gnu Public Licence. That’s definitely not compatible with a commercial software product unless all you’re selling is support & training and you don’t mind your competitors building and selling your software too without any kickback.

 

 

SIL OpenFont Licence

This was nearly in my list, but you have to be careful with naming any icons you’ve modified (derivative works) as there are conditions on the use of names.

The basic SIL font licence FAQ page indicates at the bottom that it is Share-A-Like, which makes my hair stand on end – and typically means (to me) you’d have to include the original font as a separate file for your end users to be able to use.

 

 

CC  BY SA 3.0

Share-a-like –  “ If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.” – scared me off. I don’t want my product or even a tiny part of it to suddenly become ‘Open’ because I’ve tweaked your broken icon.

 

Icon packs and existing trademark images

Typically your app will want to present a login button for using social media accounts, or buttons to share and tweet. But when it comes to using trademark or copyright images to represent these, alarm bells need to ring in your head.

Even if the icon pack licence file claims the icons are free to use or modify, you are not usually free to do so on such images. You need to check with the owner of the trademark image, and investigate what restrictions of use they impose on it. Typically this means not altering the colours or image.

Facebook’s DOs & DON’Ts

Twitter’s brand asset guidelines.

(Thanks to @IPWright for reminding me to add this section)

 

 

My SVG Notes


SVG (Scalable Vector Graphics) is pretty awesome, especially so for 2d flat-look icons in your applications, or as clipart in your presentations.

I’ve recently been doing just that, using SVG for flat icons in a mobile app; and compiled some personal notes and links you might find useful.

 

Compatibility

We are now at the point where you’d be hard pressed to find an Internet Browser that can’t do the SVG dance.

CanIUse.com shows us what’s compatible or not.

Basic Usage

Craig Butler wrote a nice short overview of the different ways you can embed Scalable Vector Graphics into your web page. I’ve provided some more links later in my blog which expand on those methods.

 

My notes on SVG-CSS backgrounds

If you find that you have to use SVG in a background you may be faced with a bit of a shocker – you can’t easily change the colour or rotation of the SVG element!

Luckily you can specify the background size (CanIUse, W3C).

.mybackgroundclass
{
background-image: url('xxxx.svg');
background-size: 24px 24px;
background-position: center;
}

However, the colour is taken directly from the SVG file. So if you need a different colour you either use an SVG editor (see later) or edit the SVG as a text file and fill in properties like stroke=”red” fill=”red” as attributes in the required element. See this tutorial for more details.

Rotation can also be a pain when using background SVG images. If the SVG image isn’t already rotated how you want it, you’d have to either

  • edit the SVG with an editor to rotate it and re-save,
  • rotate the HTML element that is used for the background SVG,
  • in the SVG file, add an attribute to the drawing element you require: transform=”rotate(-45 100 100)“, where the parameters are (degrees, x rotation point, y rotation point). See this example.

 

 

Editors

I’ve tried google’s on-line svg-edit, and for quick jobs it’s really handy, but a little buggy (had to press cancel while loading to get the SVG to load!)

I’ve not tried the following editors, but they looked very promising.

Inkscape

Janvas

http://www.smashingmagazine.com/2008/12/05/20-vector-graphic-editors-reviewed/

http://en.wikipedia.org/wiki/Comparison_of_vector_graphics_editors

Unless the editor already supports it, you may want to optimize your SVG afterwards.

 

More Tips and Tricks with SVG

http://css-tricks.com/using-svg/

Jenkov.com SVG tutorials

W3CSchools SVG reference

 

SVG Icon/Image Resources

Here are a selection of Icon packs with commercially permissive licences. Don’t forget to read licences carefully before using, and attribute the original sources in the manner they state.

 

Open Clipart

http://openclipart.org/may-clipart-be-used-comparison

http://openclipart.org/share

Batch

Custom MIT style licence, prevents re-hosting or selling the ‘set’ of icons.

http://adamwhitcroft.com/batch/

 

Zurb Foundation Icons

Has no explicit licence, but indicates free.

http://zurb.com/playground/foundation-icon-fonts-3

http://zurb.com/about

 

Icon Monster

This has a custom licence which is very permissive, but you can only use 50 icons.

http://iconmonstr.com/

 

ICOMOON

http://icomoon.io/app/#/select/library

They also do commercial packs http://icomoon.io/#icons-icomoon

 

METRIZE Icons

A MIT style licence

http://www.alessioatzeni.com/metrize-icons/

 

Open Iconic

MIT licence (svg and PNG)

Be careful, earlier versions of the Iconic packs were Creative Commons Share-a-Like which I believe the licences are ambiguous enough to not be suitable for commercial apps. There’s also a commercial version of this library. I found some scaling issues with these icons, and some required editing before they could be used.

https://useiconic.com/open/

 

A list of other Icon Packs

http://www.webresourcesdepot.com/30-awesome-and-free-flat-icon-sets/

 

Elusive-Icons Web Font

This is under the SIL OpenFont licence. I haven’t checked this licence thoroughly, but the intent is set right. However, I need to spend more time reading the specific EULA to ensure this is compatible with commercial software.

http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL).

http://scripts.sil.org/cms/scripts/page.php?item_id=OFL-FAQ_web#e71fabc0

http://shoestrap.org/downloads/elusive-icons-webfont/

https://github.com/aristath/elusive-iconfont/blob/master/README.md