<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gamecraft</title>
	<atom:link href="http://blog.gamecraft.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gamecraft.org</link>
	<description>A blog all about the craft of making games.</description>
	<lastBuildDate>Sat, 28 Apr 2012 18:41:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Pretty Good Solitaire Mac Edition 2.34</title>
		<link>http://blog.gamecraft.org/2012/04/pretty-good-solitaire-mac-edition-2-34/</link>
		<comments>http://blog.gamecraft.org/2012/04/pretty-good-solitaire-mac-edition-2-34/#comments</comments>
		<pubDate>Sat, 28 Apr 2012 18:41:13 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Solitaire]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2537</guid>
		<description><![CDATA[A free update is now available. This week, Goodsol Development released Pretty Good Solitaire Mac Edition 2.34, a maintenance update that fixes a few bugs (introduced by yours truly) in the previous release version.  This is a free update for any customers who have purchased the downloadable version of Pretty Good Solitaire Mac Edition (ever).  [...]]]></description>
			<content:encoded><![CDATA[<h2>A free update is now available.</h2>
<p><a href="http://www.goodsol.com/mac/"><img class="alignright" title="Pretty Good Solitaire Mac Edition 2.34" src="http://blogger.gamecraft.org/pictures/pgs_icon.png" alt="" width="128" height="128" /></a>This week, <strong><a title="Goodsol Development" href="http://www.goodsol.com/" target="_blank">Goodsol Development</a></strong> released <em><strong><span style="color: #ff0000;">Pretty Good Solitaire Mac Edition 2.34</span></strong></em>, a maintenance update that fixes a few bugs (introduced by <em>yours truly</em>) in the previous release version.  This is a <span style="color: #ff0000;">free update</span> for any customers who have purchased the downloadable version of <em><strong><a title="Pretty Good Solitaire Mac Edition" href="http://www.goodsol.com/mac/" target="_blank">Pretty Good Solitaire Mac Edition</a></strong></em> (<em>ever).</em>  [This version is functionally equivalent to PGSME 2.33 from the Mac App Store.]</p>
<p>As a refresher, PGSME is a <span style="color: #ff0000;">Solitaire program</span> for Mac containing <span style="color: #ff0000;">350 different games</span>, plus <span style="color: #ff0000;">50 bonus games</span>, with over 2 <em>billion</em> deals of each.  It runs on Mac OS X 10.4 (Tiger) and higher, including both Intel and PPC systems.  You can <a title="Try it!" href="http://www.goodsol.com/mac/download.html" target="_blank">download a trial version</a>, and you can <a title="Buy Now!" href="http://www.goodsol.com/mac/orderonline.html" target="_blank">purchase a copy</a> for <strong><span style="color: #ff0000;">only $24.95</span></strong> US.</p>
<p>This is the latest product in a long series of upcoming game releases from Goodsol.  Next up:  Look for an upgrade to <em><strong><a title="Action Solitaire" href="http://www.actionsolitaire.com/" target="_blank">Action Solitaire</a></strong></em> (free to anyone purchasing the game between now and then).</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/04/pretty-good-solitaire-mac-edition-2-34/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pretty Good Solitaire 13.2</title>
		<link>http://blog.gamecraft.org/2012/04/pretty-good-solitaire-13-2/</link>
		<comments>http://blog.gamecraft.org/2012/04/pretty-good-solitaire-13-2/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 06:05:41 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Solitaire]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2527</guid>
		<description><![CDATA[Goodsol&#8217;s flagship Windows game gets even bigger. This week, Goodsol Development released Pretty Good Solitaire 13.2, the leading Solitaire program for Windows.  This new version now includes 780 (!) different Solitaire games, including all of your favorites, such as Klondike (a.k.a., &#8220;Solitaire&#8220;), FreeCell, and Spider, as well as many games not available anywhere else. Pretty [...]]]></description>
			<content:encoded><![CDATA[<h3>Goodsol&#8217;s flagship Windows game gets even bigger.</h3>
<p><a href="http://www.goodsol.com/"><img class="alignleft" title="Pretty Good Solitaire" src="http://blogger.gamecraft.org/pictures/pgs_icon.png" alt="PGS 13.2 for Windows" width="128" height="128" /></a>This week, <strong><a title="Goodsol Development" href="http://www.goodsol.com/" target="_blank">Goodsol Development</a></strong> released <em><strong><span style="color: #ff0000;">Pretty Good Solitaire 13.2</span></strong></em>, the leading Solitaire program for Windows.  This new version now includes <span style="color: #ff0000;">780 (!) different Solitaire games</span>, including all of your favorites, such as <strong>Klondike</strong> (a.k.a., &#8220;<em>Solitaire</em>&#8220;), <strong>FreeCell</strong>, and <strong>Spider</strong>, as well as many games not available anywhere else.</p>
<p><em><strong>Pretty Good Solitaire 13.2</strong></em> is <a title="Pretty Good Solitaire 13.2" href="http://www.goodsol.com/downloadnow.html">available for download here</a>, and it is a <strong><span style="color: #ff0000;">free upgrade</span></strong> for any customers who have purchased since version 12 (i.e., in the last 4 or 5 years).</p>
<p>The 10 new games in this update are:</p>
<ul>
<li><strong>Alloway Kirk</strong></li>
<li><strong>Five Pirates</strong></li>
<li><strong>Kettle Hill</strong></li>
<li><strong>McCarver</strong></li>
<li><strong>Open Peek</strong></li>
<li><strong>Pyramid Rank</strong></li>
<li><strong>Richard&#8217;s Patience</strong></li>
<li><strong>Undercover Aces Easy</strong></li>
<li><strong>Weddings</strong></li>
<li><strong>Yukon Two Suits<em></em></strong></li>
</ul>
<p>Aside from a little bit of play testing, I actually did <em>no</em> development work on this product; this is actually a triumph because our <span style="color: #ff0000;">GDcard playing card library</span>, which still runs the display of cards, symbols, and backgrounds, as well as the card animations, continues to work flawlessly.  <strong>Thomas Warfield</strong> (Goodsol) did all of the development work for this update.</p>
<p>Of course, now that Thomas has added yet another 10 games to the Windows version, it is now time for me to retaliate on Mac OS X, so look for a <em><strong><a title="Pretty Good Solitaire Mac Edition" href="http://www.goodsol.com/mac/">Pretty Good Solitaire Mac Edition</a></strong></em> update, with 400 games, coming soon to an internet near you!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/04/pretty-good-solitaire-13-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Where the Macgic Happens</title>
		<link>http://blog.gamecraft.org/2012/03/where-the-macgic-happens/</link>
		<comments>http://blog.gamecraft.org/2012/03/where-the-macgic-happens/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 07:55:40 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[office]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2512</guid>
		<description><![CDATA[A cozy Mac OS X and iOS development corner I thought I should give readers a little glimpse behind the curtain here at Digital Gamecraft, so here is a picture of my personal Apple technology desk on one of those unusual days during which a full complement of devices have gathered.  Usually, most of the [...]]]></description>
			<content:encoded><![CDATA[<h2>A cozy Mac OS X and iOS development corner</h2>
<p><img class="alignleft" title="See the Macgic!" src="http://blogger.gamecraft.org/images/macgic.jpg" alt="" width="450" height="600" />I thought I should give readers a little glimpse behind the curtain here at <em><strong><span style="color: #ff0000;">Digital Gamecraft</span></strong></em>, so here is a picture of my personal Apple technology desk on one of those unusual days during which a full complement of devices have gathered.  Usually, most of the mobile devices live in other places, but they occasionally come together for an ultra-local technology conference.  (In this case, they were all anxiously anticipating new provisioning profiles after the previous batch had expired.)<br />
This desk in the corner of the office is used for the bulk of primary development and debugging for <span style="color: #ff0000;">Mac OS X and iOS</span> products.<br />
<img class="alignright" title="Open Sesame!" src="http://blogger.gamecraft.org/images/macgic_key.png" alt="" width="150" height="200" /><br />
Here you see a <span style="color: #ff0000;">simple key</span> to the components of this image.  First, the parts labeled in <em><strong><span style="color: #ff0000;">red</span></strong></em> are the development components:</p>
<ol>
<li><strong>MacBook Pro</strong> (&#8220;late 2007&#8243;), 17-inch 2.4GHz, running Mac OS X 10.4 (Tiger) through Mac OS X 10.7 (Lion), and soon the developer preview of 10.8 (Mountain Lion), with the help of an external FireWire hard drive, mostly hidden from view by the next item.</li>
<li><strong>iPad</strong> (original) 16G running iOS 3.2, the minimum iPad platform supported by our products.</li>
<li><strong>iPod touch</strong> (2nd generation) 8G, running iOS 4.2.1, sans (unsupported) multitasking.</li>
<li><strong>iPhone 4</strong> with 32G, running iOS 4.2.6, with multitasking, GPS, camera, and (most importantly) a Retina display.</li>
<li><strong>iPad 2</strong> (Wi-Fi + 3G) with 64G, running iOS 4.3.5, named &#8220;Rabbit&#8221;.</li>
<li><strong>Mac Mini</strong> PPC running Mac OS X 10.4 (Tiger), the minimum Mac OS X platform supported by our software.</li>
<li>Mag Innovision widescreen monitor with dual inputs, running natively at 1680 x 1050, acting as an external display for both Mac systems.</li>
<li>Microsoft Mouse attached via Apple keyboard.  After a year of <em>trying</em> to keep this desk Apple-only, I had to surrender to the fact that Microsoft is just far better at making mouses.</li>
<li>Herman Miller Aeron chair, brand new, also known as my horizontal trans-workstation transport device (for quickly moving between this workspace and my Windows workspace).  After breaking chairs every 2-3 years, the 12-year warranty actually made this purchase seem much more reasonable.</li>
</ol>
<p>The components labeled in <strong><span style="color: #00ff00;">green</span></strong> in the key are fundamental to productivity, though not directly part of the development process:</p>
<ol>
<li><strong>Head</strong>, the head head.  Head is responsible for employee morale, and keeping his minions in line.  (&#8220;I am so important that my minions have minions.&#8221;)</li>
<li>Minions.  These (4) heads each have individual names, and they keep things lively by moving around the desk, often at night, very unlike their larger relatives.  You&#8217;ve heard of &#8220;talking heads&#8221;?  These are <em>not</em> those.</li>
<li>Pioneer stereo receiver, practically an antique, from the days where radio was broadcast through the air.  This magic box plays news from NPR as well as classic rock and blues (and, previously, jazz), and special shows are regularly recorded digitally for later/repeat listening.  [Not shown: separate cassette player/recorder and turntable components.]</li>
</ol>
<p>That is a small look at one corner of my office, which serves as an important piece of our development effort.  With this range of equipment, we can develop and test products for the last 4 major versions of Mac OS X, on both Intel and PPC hardware, as well as on versions of iOS since the iPad was introduced, with at least one device with each technology.  (Of course, things change <em>again</em> on Friday with the availability of &#8220;The new iPad&#8221; and its large 2048&#215;1536 Retina display.)</p>
<p>Note that the view just to the left of this picture is out a window into a small courtyard where birds and squirrels (black, brown, and red), as well as our cats, frolic during the day.  At night, you can hear the raccoons and opossums wandering through and, alas, smell the occasional skunk.</p>
<p>Perhaps, if you are all good girls and boys, I may later show you the desk at which I am currently writing this&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/03/where-the-macgic-happens/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MAS Preparation, Part 6</title>
		<link>http://blog.gamecraft.org/2012/03/mas-preparation-part-6/</link>
		<comments>http://blog.gamecraft.org/2012/03/mas-preparation-part-6/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 05:00:28 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2494</guid>
		<description><![CDATA[App Sandboxing implementation In the previous installment of Preparing for Mac App Store Submission, I discussed the reasons and methods for implementating Mac App Store receipt validation within your project.  At this point in the series, you may have already completed all of the currently necessary and recommended changes for converting your Mac OS X [...]]]></description>
			<content:encoded><![CDATA[<h2>App Sandboxing implementation</h2>
<p>In the previous installment of <a title="Preparing for Mac App Store Submission" href="http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/">Preparing for Mac App Store Submission</a>, I discussed the reasons and methods for <a title="MAS Preparation, Part 5" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-5/">implementating Mac App Store receipt validation</a> within your project.  At this point in the series, you may have already completed all of the <em>currently</em> necessary and recommended changes for converting your Mac OS X game, available for direct download, into an application suitable for the Mac App Store (MAS); you may have even submitted it already.</p>
<p>This final part is a discussion of the latest imposition by Apple, a technology known as <span style="color: #ff0000;">application sandboxing</span>, which was introduced with Mac OS X 10.7 Lion.  The general concept of sandboxing is that an application simply runs in its is own &#8220;sandbox&#8221;, unable to do anything outside its own little piece of the file system, except in specific cases, for which it must have <em>entitlements</em>.  The idea is that a compromised program (via malware or bad programming) is limited in the amount of system damage that can be done.  This is the way that all iOS applications work, and this is, in fact, just a transference of that approach to OS X.  The problem, of course, is that desktop systems are (and <strong>should</strong> be) different than tablets and phones, so certain types of programs are left out, including those which interact with other programs, such as those which provide ease of access to people who need assistance using computers.  (This is a very poorly considered decision on Apple&#8217;s part.)</p>
<p>Frankly, the main reason that you need to understand application sandboxing is that, as of June 1, 2012, all new applications and significant updates submitted to the Mac App Store are <em>required</em> to be sandboxed.  (This deadline was recently pushed back from the original date of March 1 in light of a considerable number of issues that Apple is still having with their implementation.)  If you already have a MAS application (or submit one before the deadline), you will be allowed to apply bug fixes without adding sandboxing, but otherwise, you will need to have sandboxing implemented.  (At least, that is what they are saying right now.)</p>
<h3>0. Understand sandboxing</h3>
<p>The first step is to <span style="color: #ff0000;">understand application sandboxing</span> and the implications of using it for your game.  The definitive documentation for Apple&#8217;s implementation of this technology is <a title="App Sandbox Design Guide" href="https://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/AboutAppSandbox/AboutAppSandbox.html" target="_blank">App Sandbox Design Guide</a>, which is recommended reading.</p>
<p>Essentially, by default, your application is contained entirely within its own (read-only) bundle and a directory named by your bundle identifier (e.g., &#8216;com.goodsol.com/PrettyGoodSolitaire&#8217;) under the &#8216;~/Library/Containers&#8217; folder.  An internal technology called Powerbox regulates (reads: mostly disallows) any access outside these two folders.  Most access to hardware features and user information is also disallowed without a specific entitlement.</p>
<p>If your game is entirely self-contained, then sandboxing may not present much of a problem.  If you use certain technologies, such as submitting high scores to a web site via the Internet, then you will have to enable appropriate entitlements.  If you have more involved interactions, especially involving other applications (or helpers), you may be forced to redesign/eliminate those features, or else give up on sandboxing (and, hence, the Mac App Store).  Whatever the situation, you will need to determine how this requirement will affect your application.</p>
<p>In our case, we lost the capability to load custom card sets, since the default operation (in the downloadable version) is to read installed files from the &#8216;Application Support&#8217; folder, though that was not a huge blow since MAS already killed the idea of downloading improvements to the game.  The other feature that is gone is the ability to explicitly load and save games (for now) because the current version of our games are still built with Carbon, which cannot navigate the sandbox/Powerbox.  (Our primary save game feature, <em>AutoSave</em>, still works perfectly fine.)</p>
<h3>1. Identify possible sandboxing issues</h3>
<p>The next step is to <span style="color: #ff0000;">identify possible issues with sandboxing</span> your application, so let&#8217;s look at three different categories of features&#8230;</p>
<h5>What you CAN do:</h5>
<ul>
<li>You may read files from your application bundle, as usual.  (Bundles should always be considered read-only, so your code should never attempt to write here.)</li>
<li>You may read and write files within your sandbox folders; this process is transparent <em>provided</em> you are using system calls to obtain the correct user folders (and you should never hard-code folder paths, anyway).</li>
<li>You may update your application preferences (.plist) using a standard API.</li>
<li>You may provide a simple link to a web page; this is allowed by default entitlements (i.e., not considered an outbound connection).</li>
</ul>
<h5>What you CANNOT do:</h5>
<ul>
<li>You may not read from nor write to most locations outside your sandbox, including the user desktop and document folders, without the user explicitly selecting the location (and the appropriate entitlement set).</li>
<li><strong>You may not use any Carbon navigation dialogs</strong>, nor any Cocoa navigation dialogs <em>other</em> than NSOpenPanel and NSSavePanel, and you may not simulate user input to those panels.</li>
<li>You may not use &#8220;incompatible&#8221; functions, including those included in the Authorization Services and Accessibility APIs.</li>
<li>You may not send Apple events to arbitrary applications, nor broadcast user-info dictionaries.</li>
<li>You may not load any kernel extensions.</li>
<li>You may not alter preferences of other applications, nor terminate other applications, including helper applications.</li>
<li><strong>You may not sign future updates with a different certificate than the original; doing so will cause Mac OS X to <em>deliberately</em> crash the program.</strong></li>
</ul>
<h5>What requires an entitlement:</h5>
<ul>
<li>You need an entitlement to allow outbound network sockets (i.e., for sending information to the internet, operating as a client).</li>
<li>You need an entitlement to allow inbound network connections (i.e., for acting as a server).</li>
<li>You need an entitlement to allow read or write access to folders or files selected explicitly by the user (via NSOpenPanel/NSSavePanel).</li>
<li>You need entitlements to access the user&#8217;s &#8216;Movies&#8217;, &#8216;Music&#8217;, and &#8216;Pictures&#8217; folders.</li>
<li>You need entitlements to access camera, microphone, or Bluetooth devices.</li>
<li>You need entitlements to access serial, USB, or FireWire ports.</li>
<li>You need an entitlement to allow printing.</li>
<li>You need entitlements to access the user&#8217;s address book or calendars.</li>
<li>You need an entitlement to allow the use of Core Location for determining geographical location.</li>
</ul>
<p>&nbsp;</p>
<p>After perusing the notes above, write down a list of features that may (or should) fall afoul of application sandboxing and be sure to test each of these features to confirm that they are working prior to enabling sandboxing entitlements.</p>
<h3>2. Enable default entitlements</h3>
<p>The next step is to <span style="color: #ff0000;">enable the default entitlements</span> for sandboxing; essentially, this disables all restricted access types, which allows us to verify which features of the game really need entitlements, and which work without modification.</p>
<p>To do this in Xcode 4.2.1 (under Lion) is fairly simple: Just open the &#8216;Summary&#8217; tab for your target settings, scroll down to the &#8216;Entitlements&#8217; section, and check the &#8216;Enable Entitlements&#8217; (top) checkbox, and then confirm that the &#8216;Enable App Sandboxing&#8217; checkbox is also selected.  If you are <em>not</em> already using iCloud in your project, then you should make sure that the &#8216;iCloud Key-Value Store&#8217; is unchecked and cleared, and that that &#8216;iCloud Containers&#8217; table is empty.</p>
<p>What the first checkbox actually does is create an entitlements file, a property list with the root name from &#8216;Entitlements File&#8217; (defaults to the project name) and &#8216;.entitlements&#8217; as the extension (e.g., &#8216;Pretty Good Solitaire.entitlements&#8217;), and it adds that file to your project.  The other (app sandboxing) checkbox automatically adds the &#8216;<strong>com.apple.security.app-sandbox</strong>&#8216; key to the entitlements file, which sets the default/maximum restrictions.</p>
<p>In order to build with application sandboxing enabled, you must be code signing the project.  Clearly this is already the case for projects being submitted to the Mac App Store.  However, if you are only testing and/or do not have an appropriate certificate (such as in our case where, as a contractor, I do not have access to the distribution certificate), you can follow the instructions in the &#8216;<span style="color: #ff0000;">Create a Code Signing Certificate for Testing</span>&#8216; section of the <a title="App Sandbox Quick Start" href="https://developer.apple.com/library/mac/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxQuickStart/AppSandboxQuickStart.html#//apple_ref/doc/uid/TP40011183-CH2-SW3" target="_blank">App Sandbox Quick Start</a>.  <em>[Editor: Sorry for no direct link, but section links on that page are fuzzled.]</em>  The next section, &#8216;Specify the Code Signing Identity&#8217;, explains how to make the new certificate work with your project.</p>
<h3>3. Verify access failures</h3>
<p>Your next step is to <span style="color: #ff0000;">verify access failures</span> with application sandboxing enabled in the project.  To do this, start by launching the <strong>Console</strong> utility (from &#8216;Utilities&#8217;) and clearing its display.  This will show log entries to confirm a service denied by sandboxing.</p>
<p>Now, work through the list of suspect features that you created earlier and retest every one of those features with the new signed/sandboxed build.  Failures are, of course, expected, and for every failure there should be a log entry in Console from &#8220;<strong>sandboxd</strong>&#8221; and usually containing the text &#8220;<em>deny</em>&#8221; and an indication of the restricted service.</p>
<p>Note each confirmed failure, and determine which (if any) of the entitlements listed on the target &#8216;Summary&#8217; page is likely to resolve the issue.  Do <strong>not</strong> make any changes to the entitlements until all of the suspect features are tested and notated.  A complete list of available entitlements can be found on the <a title="Enabling App Sandbox" href="https://developer.apple.com/library/mac/#documentation/Miscellaneous/Reference/EntitlementKeyReference/EnablingAppSandbox/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW1" target="_blank">Enabling App Sandbox</a> page of the <span style="color: #ff0000;">Entitlement Key Reference</span>.  (Note that some entitlements may not be listed on the &#8216;Summary&#8217; page, requiring direct editing of the entitlements property file.)</p>
<p>If there are any features that are confirmed to fail only under sandboxing and for which there is not an appropriate entitlement, you may want to check the <a title="App Sandbox Temporary Exception Entitlements" href="https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/EntitlementKeyReference/AppSandboxTemporaryExceptionEntitlements/AppSandboxTemporaryExceptionEntitlements.html#//apple_ref/doc/uid/TP40011195-CH5-SW1" target="_blank">App Sandbox Temporary Exception Entitlements</a> page for a solution that, as the name suggests, may work for the time being, but will probably not be available in the future.  If none of the entitlements nor temporary exceptions will resolve the problem, then you may need to redesign or remove that feature and/or lobby Apple to add an entitlement for the particular action you are attempting.</p>
<h3>4. Add necessary entitlements</h3>
<p>The next step is <span style="color: #ff0000;">adding the necessary entitlements</span> to the project, which should be done as an iterative process.  For each entitlement that you anticipate requiring, enable that entitlement, rebuild the project, then test every feature that is confirmed to have failed with sandboxing previously, noting each one that now functions correctly.</p>
<p>The general idea is that one should minimize the number of entitlements included (requested?) in a sandboxed application.  If you add an entitlement that does not actually help any of your features function, then you should immediately remove that entitlement.  Using excessive entitlements, in addition to reducing the (dubious) security, is a potential cause for rejection from the Mac App Store.  (In other words, simply checking all of the boxes may work in testing, but not for MAS submission.)</p>
<p>When you have completed this process, you should have a reasonably small number of entitlement keys (perhaps even zero) enabled, and all of the features of your program should be functioning properly.  It is always a good idea to double-check all of the identified features, as well as do some additional testing, once the &#8220;final&#8221; list of entitlements is enabled.  If you still have features that do not work under sandboxing (only), and have no appropriate entitlements, then you may have a decision to make.</p>
<p>In our case, we only had to add the &#8216;com.apple.security.network.client&#8217; entitlement key, in order to perform submissions to our online high score server, but then we had to make the hard decision to lose the &#8216;Open&#8230;&#8217; and &#8216;Save&#8230;&#8217; features from our store version (for reasons stated previously).</p>
<h3>5. Create file migration rules</h3>
<p>The penultimate step in the process is <span style="color: #ff0000;">creating file migration rules</span> which is simply a property information file that is used <em>only once</em> (on a system) to indicate which existing files should be <strong>moved</strong> (not copied) into the sandbox.  If you have a new project, without existing users, then you have the luxury of skipping the final two steps.</p>
<p>The rest of us need to create a new property list, named (exactly) &#8220;<strong>container-migration.plist</strong>&#8220;, and add it to the project.  This file contains a dictionary key, &#8216;<span style="color: #ff0000;">Move</span>&#8216;, which contains string keys indicating the names of folders and/or individual files to be moved into the equivalent location within the sandbox (or array pairs of strings if you wanted to both move files into the sandbox and relocate them within the relative folder hierarchy, though I cannot think of a good reason why you would).</p>
<p>The specific documentation for the (simple) format of this migration file is in <a title="Migrating an App to a Sandbox" href="https://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/MigratingALegacyApp/MigratingAnAppToASandbox.html#//apple_ref/doc/uid/TP40011183-CH6-SW1" target="_blank">Migrating an App to a Sandbox</a> (which read).  The relevant portion of our migration file is as follows:</p>
<pre>&lt;dict&gt;
    &lt;key&gt;Move&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;${Library}/Pretty Good Solitaire&lt;/string&gt;
    &lt;/array&gt;
&lt;/dict&gt;</pre>
<p>This is all it takes to move the entire (unsandboxed) &#8216;~/Library/Pretty Good Solitaire&#8217; folder into the equivalent sandboxed folder (the unwieldy &#8216;~/Library/Containers/com.goodsol.PrettyGoodSolitaire/Data/Library/Pretty Good Solitaire&#8217;).</p>
<p><strong>Important</strong>: Note that the files are <em>moved</em> to the sandbox; they are not copied (and there is no documented process to only copy them).  The ramifications of this are that existing users switching to a sandboxed version will automatically have their files and settings moved for them, but those files and settings will no longer be available to any unsandboxed versions, nor to any other application that may have been accessing these files.</p>
<h3>6. Test file migration</h3>
<p>The final step is to <span style="color: #ff0000;">test the file migration process</span> to assure that your migration file works correctly.</p>
<p>On a system on which you have unsandboxed data for the application in question, manually duplicate the folder and/or files (in &#8216;Finder&#8217;), giving you a backup for additional testing (especially important should the migration fail).  Confirm that the sandbox container folder (i.e., &#8216;~/Library/Containers/&lt;bundle_id&gt;&#8217;) does not exist (and delete it and empty the trash if it does).</p>
<p>Build the application with sandboxing enabled and with the &#8216;container-migration.plist&#8217; file included in the project.  Run the application.  A container folder should have been created and the specified files/folders moved into appropriate locations within the container&#8217;s &#8216;Data&#8217; folder.</p>
<p>If you need to retest (or if you decide against sandboxing entirely), you can completely delete the container folder for your application (&#8216;&lt;bundle_id&gt;&#8217; and below, <strong>not</strong> the &#8216;Containers&#8217; folder) and <em>copy</em> the duplicated data back to its original location.</p>
<h4>Conclusion</h4>
<p>Following the above process to enable application sandboxing in your game, after having updated your project based on the previous five parts, you should be <span style="color: #ff0000;">completely ready to submit to the Mac App Store</span>.  Go for it!  Just keep in mind that the process changes, reviewers vary, and if your project is accepted on its first submission, you are very lucky.  However, if you use the available tools to check your code and your project build, and follow the guidelines in this series of posts, your path should be smoother.</p>
<p>I sincerely hope that you have enjoyed, or at least benefited from, all of these posts.  Comments are definitely appreciated, as are links to this blog, good word of mouth, and US currency in both large and small denominations.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/03/mas-preparation-part-6/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MAS Preparation, Part 5</title>
		<link>http://blog.gamecraft.org/2012/02/mas-preparation-part-5/</link>
		<comments>http://blog.gamecraft.org/2012/02/mas-preparation-part-5/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 05:00:02 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2464</guid>
		<description><![CDATA[Mac App Store receipt validation In the last installment of Preparing for Mac App Store Submission, I discussed the (general) source code modifications that you may need to make in order to convert your downloadable Mac OS X project into one acceptable for the Mac App Store (MAS). Now, in this fifth part, I will [...]]]></description>
			<content:encoded><![CDATA[<h2>Mac App Store receipt validation</h2>
<p>In the last installment of <a title="Preparing for Mac App Store Submission" href="http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/">Preparing for Mac App Store Submission</a>, I discussed the (general) <a title="MAS Preparation, Part 4" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-4/">source code modifications</a> that you may need to make in order to convert your downloadable Mac OS X project into one acceptable for the Mac App Store (MAS).</p>
<p>Now, in this fifth part, I will talk about a more specific addition to your source code, functionality for <span style="color: #ff0000;">checking the presence and validity of a MAS receipt file</span>.  While this change is not <em>required</em>, and would not cause your submission to be rejected, it is strongly recommend for reasons detailed below.  In fact, we will start there&#8230;</p>
<h3><em></em>0. Consider the reason for receipt validation</h3>
<p>Before implementation, it is good to understand, in general terms, <span style="color: #ff0000;">the purpose of receipt validation</span>.</p>
<p>When somebody &#8220;purchases&#8221; an application from the Mac App Store, a receipt file is added to the downloaded bundle authenticating it; this includes free products as well.  However, the level of checking provided by the system itself is minimal.  Soon after the MAS launch, it was discovered that there was a fairly simply method <em>[details deliberately omitted]</em> by which even a simple-minded software thief could circumvent the very basic protections and run stolen MAS applications.</p>
<p>The solution, of course, is to verify the validity of the software receipt <em>for your application</em>, which helps prevent &#8220;script kiddies&#8221; from easily stealing and distributing your products.  Of course, it is never quite as simple as that, especially since code signatures and encryption are inherently complex, and the program needs to validate a receipt file <em>that has not been created yet</em> (making this code rather tricky to test).</p>
<p>Keep in mind that <span style="color: #ff0000;">this validation process is optional</span>, so you can choose not to do it all, to fully validate the receipt file, or to implement only partial checks; the choice is up to you.</p>
<p>The official Apple documentation for this process is in <a title="Validating Mac App Store Receipts" href="https://developer.apple.com/library/mac/#releasenotes/General/ValidateAppStoreReceipt/_index.html" target="_blank">Validating Mac App Store Receipts</a>.</p>
<h3>1. Obtain a sample receipt for testing</h3>
<p>As mentioned above, your first challenge is that the receipt checking code needs to be able to validate a receipt file from a purchase that is to be made in the future.  To do this, you may want to <span style="color: #ff0000;">get a sample receipt for testing</span>.</p>
<p>This <em>used</em> to be fairly easy, as Apple provided a sample receipt, along with the associated validation data, to Mac developers.  Unfortunately, recently (as in, since this series began), the certification signature on the original sample receipt expired and, instead of providing a newer one, Apple has decided to remove the sample receipt entirely in favor of connecting to the iTunes servers to obtain one directly.  <em>Whatever.</em></p>
<p>Now, the process involves getting the application to initially quit with an <span style="color: #ff0000;">exit code of 173</span>, which indicates a failed verification, which is <em>supposed</em> to trigger iTunes to prompt you for your (test) account credentials and then download a valid receipt and insert it into the application bundle, as described in <a title="Test During the Development Process" href="https://developer.apple.com/library/mac/#releasenotes/General/ValidateAppStoreReceipt/_index.html#//apple_ref/doc/uid/TP40010573-CH1-SW11" target="_blank">Test During the Development Process</a>.  In practice, this definitively does <strong>not</strong> work all of the time during development, and the prerequisites are not clear.</p>
<p>What <em>is</em> clear is that the application needs to be signed before Mac OS X (version 10.6.6 or higher) will request iTunes credentials, and that they need to be for a test account.  However, any old test account will apparently not do, and a failure to produce and/or download a receipt displays no error message (just no receipt and only a vague &#8220;returnCode:1&#8243; in the console).  It appears to be that the application needs to already be in <strong>iTunes Connect</strong> and that the test account must be associated with that application via the master company account.  Unfortunately, for the moment, this remains as an exercise for the reader.</p>
<p>Another (unproven) approach could be simply borrowing a receipt from any purchased application from the Mac App Store.  You will need to know the exact bundle identifier (fairly easy), version number (also easy), and computer GUID (not quite as easy), but you could use such a receipt exactly like the sample receipt previously provided by Apple.</p>
<p><span style="color: #ff0000;"><strong>Important</strong>: Do NOT include any receipt files in your project.</span>  Receipts are specific to the application, version, and <em>system</em>, and they are generated and added by the Mac App Store/iTunes; including a receipt in your submission bundle will result in summary rejection of the application.</p>
<h3>2. Locate the receipt file</h3>
<p>The first step to take in your source code is to <span style="color: #ff0000;">locate the receipt file</span> for checking.  In the release version, intended for distribution, the location of the receipt is always within your application bundle at &#8216;<span style="color: #ff0000;"><em>Contents/_MASReceipt/receipt</em></span>&#8216;.</p>
<p>If you decide to use a sample receipt for testing, you will probably want to define its (different) location, the parameters expected from the sample receipt, and a definition to use for conditional compilation.  In our case, the debug versions define <strong>USE_SAMPLE_RECEIPT</strong> and the other values (from the old sample receipt) like so:</p>
<pre>#ifdef APPSTORE
    #define RECEIPT         "Contents/_MASReceipt/receipt"

    #ifdef _DEBUG
        #define USE_SAMPLE_RECEIPT
    #endif

    #ifdef USE_SAMPLE_RECEIPT
        #define SAMPLE_RECEIPT  "/Users/Gregg/Desktop/receipt"
        #define SAMPLE_BUNDLE   "com.example.SampleApp"
        #define SAMPLE_VERSION  "1.0.2"
        #define SAMPLE_GUID     { 0x00, 0x17, 0xF2, 0xC4, 0xBC, 0xC0 }
    #endif
#endif</pre>
<p>Note that we explicitly define <em>different</em> path variables (RECEIPT versus SAMPLE_RECEIPT) and only define the sample parameters when USE_SAMPLE_RECEIPT is defined.  This is additional protection against accidentally using a property intended only for testing in release code.  For the same reasons, we also include this check in the code before the main loop:</p>
<pre>#ifndef _DEBUG
#ifdef USE_SAMPLE_RECEIPT
    ErrorMessage ( "Warning!  Sample receipt is being checked in release version." );
#endif
#endif</pre>
<p>So, our first verification function is <em>GetReceipt()</em>, which returns the path of the (untouched) receipt file.  The routine obtains the path to the bundle and then generates the path directly to the receipt for later verification, adjusted appropriately if USE_SAMPLE_RECEIPT is defined.  Additionally, just for another sanity check, it also verifies that the actual bundle identifier and short version string match definitions within the code (so we can safely use the definitions later).</p>
<h3>3. Check the signature</h3>
<p>The next step in validating a receipt is to <span style="color: #ff0000;">check the signature</span> to verify that it is properly signed by Apple.  Sample code for doing this (as well as the next two steps) can be found in the <a title="Implementation Tips" href="https://developer.apple.com/library/mac/releasenotes/General/ValidateAppStoreReceipt/_index.html#//apple_ref/doc/uid/TP40010573-CH1-SW16" target="_blank">Implementation Tips</a> section of the <em>Validating Mac App Store Receipts</em> document, as well as via a nice web search.</p>
<p>Our second verification function is <em>CheckSignature()</em>, which returns a <strong>PKCS7*</strong> data pointer (and is essentially a fleshed out version of Listing 1-4 in the section linked above).  It opens the receipt file, validates the data types, adds the &#8220;Apple Root CA&#8221; certificate, and verifies the receipt signature (via <em>PKCS7_verify</em>), then cleans up everything except the receipt pointer, which is returned for use in the next function.</p>
<p>At this point, you know that the receipt file exists, it contains data, and its signature is valid.</p>
<h3>4. Verify the receipt contents</h3>
<p>The next step is validating a receipt is to <span style="color: #ff0000;">verify the receipt contents</span> and confirm that the receipt is intended for your application and the current version number.  The document referenced above gives more details about implementation, but the process is essentially stepping through the objects in the receipt and processing each one appropriately.</p>
<p>There are four types of objects within each receipt that are relevant to the validation process: <span style="color: #ff0000;">bundle identifier</span>, <span style="color: #ff0000;">bundle version</span>, <span style="color: #ff0000;">opaque value</span>, and <span style="color: #ff0000;">hash</span>.  In this step, you want to verify that the <em>bundle identifier</em> and <em>bundle version</em> match the hard-coded definitions for your project.  Note that matching against values retrieved from the bundle is not as safe, since the &#8216;Info.plist&#8217; file could potentially be modified to match an invalid receipt.  Also, you will want to store the <em>bundle identifier</em>, <em>opaque value</em>, and <em>hash</em> object values for checking during the next step.</p>
<p>Our third verification function is <em>VerifyData()</em>, which accepts the PKCS7* data pointer returned by the previous function.  It loops through the objects in the receipt and processes them appropriately, failing if either <em>bundle identifier</em> or <em>bundle version</em> do not match our hard-coded values (IDENTIFIER and VERSION, or SAMPLE_BUNDLE/SAMPLE_VERSION), or if either of these objects is missing from the receipt.  Additionally, it saves the objects necessary for the next step.</p>
<p>At this point, you know that the receipt is intended specifically for the current version of your application.</p>
<h3>5. Verify the system hash</h3>
<p>The next (and, perhaps, final) step in validating a receipt is to <span style="color: #ff0000;">verify the system hash</span> to confirm that the receipt is intended for the particular system on which it is being launched.  This step prevents the outright copying of entire application bundles from one system to another.  Of course, on failure, users are presented with the opportunity to enter their iTunes account information to obtain a valid receipt automatically, so legitimate customers are protected.</p>
<p>The general process for this step involves two parts: <span style="color: #ff0000;">obtaining the computer&#8217;s GUID</span> and then <span style="color: #ff0000;">computing the hash of the GUID</span>, which is then compared to the <em>hash</em> value stored in the last step.  The sample code in the Apple documentation referenced above describes both steps sufficiently (in listings 1-3 and 1-7, respectively).</p>
<p>Our fourth verification function is <em>VerifySystem()</em>, which calls a <em>CopyMacAddress()</em> function to perform the first part of the process, then uses that information to check the system hash.  More specifically, the GUID returned is added to a digest, along with the <em>opaque value</em> and the <em>bundle identifier</em>, and an expected hash is calculated.  The routine verifies that the computed hash length is the same as that of <em>hash</em> and then checks that the contents are identical.</p>
<p>At this point in the process, you now know (to a reasonable degree) that the receipt file exists and is completely valid for that system running the current version of your application.</p>
<h3>6. Take extra validation steps</h3>
<p>If you are particularly concerned (or paranoid), you can <span style="color: #ff0000;">take extra validation steps</span>, such as verifying the certification authorities, double-checking the bundle signature, or (apparently) even sending a receipt back to the App Store for verification.  You can also take steps to obfuscate your code and make it harder for crackers to find and modify the application to circumvent your checks, and Apple provides some suggestions.</p>
<p>However, just taking the general steps documented here will probably eliminate 99% of the problem, and with robust coding, error checking, and testing, theft of the Mac App Store version of your game should be minimal.  (In fact, you will likely lose significantly more money to downward pricing pressures than to piracy, but that is another topic altogether&#8230;)</p>
<h4>Conclusion</h4>
<p>With the addition of receipt validation checking to your project source code, your application should not be subject to simple receipt spoofing, once accepted into the Mac App Store.  In the next (final) installment, <a title="MAS Preparation, Part 6" href="http://blog.gamecraft.org/2012/03/mas-preparation-part-6/">Part 6: App Sandboxing implementation</a>, I will discuss the process of preparing for and implementing application sandboxing, as required for the Mac App Store by June 1, 2012 (recently pushed back from March 1st).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/02/mas-preparation-part-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MAS Preparation, Part 4</title>
		<link>http://blog.gamecraft.org/2012/02/mas-preparation-part-4/</link>
		<comments>http://blog.gamecraft.org/2012/02/mas-preparation-part-4/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 05:00:01 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2447</guid>
		<description><![CDATA[Source code modifications In the previous installment of Preparing for Mac App Store Submission, I provided some guidelines for application data and resources that should be followed (where applicable) as you transform an existing Mac OS X game project into a project that can be successfully submitted to the Mac App Store (MAS). In this [...]]]></description>
			<content:encoded><![CDATA[<h2>Source code modifications</h2>
<p>In the previous installment of <a title="Preparing for Mac App Store Submission" href="http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/">Preparing for Mac App Store Submission</a>, I provided some <a title="MAS Preparation, Part 3" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-3/">guidelines for application data and resources</a> that should be followed (where applicable) as you transform an existing Mac OS X game project into a project that can be successfully submitted to the Mac App Store (MAS).</p>
<p>In this fourth part, I will describe a number of <span style="color: #ff0000;">modifications to the source code of your project</span> that you may want to make to avoid unnecessary MAS rejections and, perhaps, improve your customer support and project maintenance.  These recommendations build on the theme of earlier posts, as most of these changes are due to Apple restrictions against anything having to do with downloading or external sales, including the use of registration codes.</p>
<p>As before, these suggestions are based solely on our experience with our products, so it could help to understand the basics of our sales system.  We have two separate <em>downloadable</em> builds for each Mac OS X product: one is a <span style="color: #ff0000;">trial version</span>, with limitations, and the other is a <span style="color: #ff0000;">full version</span>, which is unrestricted but requires a customer-specific registration code (as well as the hidden download location).  In order to better understand our customers, each web link in the program adds a very basic tracking code, so we know which version is being used; when online high scores are submitted, we include a hash of the registration code so the scores can be applied to the correct player account.</p>
<p>For this process, we have created a <span style="color: #ff0000;">new store version</span>, which is unrestricted (like the full version), includes available extra data (avoiding downloads), and <em>cannot</em> require a registration code.  (Instead, the Mac App Store automatically includes a &#8220;receipt&#8221; which should be checked, as discussed in the next installment.)  Here are the steps we took&#8230;</p>
<h3>1. Store game data within user library folder</h3>
<p>For the Mac App Store, <span style="color: #ff0000;">game data</span> that is not directly created by the user <span style="color: #ff0000;">must be stored within the user library (not documents) folder</span>.  Originally, we stored our saved games and statistics in &#8216;~/Documents/&lt;project name&gt;/&lt;player&gt;&#8217;, which made them easily accessible for our customers, but MAS guidelines (and an explicit rejection) required us to relocate such files to &#8216;~/Library/&lt;project name&gt;/&lt;player&gt;&#8217;, where they are less discoverable by users, especially since &#8216;~/Library&#8217; is now hidden in Finder.  In our case, we actually relocated the files for <em>all</em> SKUs, including a function in the downloadable versions to automatically <em>copy</em> this game data to the new location, to make future customer support more manageable.</p>
<p>Note that, with application sandboxing (as discussed in the final installment), the actual location of the (sandboxed) user library is a significantly longer path name, and the main user documents folder is not accessible by default.  Obviously, the paths given above are illustrative only; one should <em>never</em> hard-code a path in project source code.</p>
<h3>2. Remove all registration code via conditionals</h3>
<p>Since any sort of registration code is forbidden, you should <span style="color: #ff0000;">remove all registration code functionality via conditional compilation</span>.  As part of our <a title="MAS Preparation, Part 1" href="http://blog.gamecraft.org/2012/01/mas-preparation-part-1/">Project modifications</a> earlier, we added an <strong>APPSTORE</strong> preprocessor variable to the store version target (only), which now allows us to remove sections of code with &#8220;#ifndef APPSTORE&#8221;/&#8221;#endif&#8221; sections.</p>
<p>In our case, every place in the code where the trial and full versions were different were already denoted with the preprocessor variable &#8216;DEMO&#8217;, so we only needed to look at each such section and decide if it should be like the full version (i.e., no limitations), which was the case <em>most</em> of the time, or like the trial version (i.e., no registration codes).</p>
<h3>3. Add fixed internal MAS registration code</h3>
<p>Because we used registration codes to differentiate between customers, we needed to <span style="color: #ff0000;">add a fixed internal MAS registration code</span> for all store version customers.  In order to replicate the previous functionality for online high score submissions, we needed a way to distinguish among different users without accessing any individually identifiable user information.  Alas, in the end, we had to provide a hash of some system information that was reasonably unique, and simply accept the possibility of a certain number of collisions.  (Thus far, MAS sales have not been high enough to get to levels where collisions are likely, though.)</p>
<p>Honestly, there is a possibility that information from the included MAS receipt could have provided a better (unique) customer identifier, but our implementation (above) was completed before receipt checking was considered.  In this case, that is left as <em>an exercise for the reader</em> (but comments on implementation are encouraged).</p>
<h3>4. Update version tracking codes</h3>
<p>For the store version, you should <span style="color: #ff0000;">update any version tracking codes in your project</span>, using conditional compilation (APPSTORE) where necessary.  This will allow any usage statistics to differentiate between downloadable and MAS customers, as well as from trial version users (i.e., potential customers).</p>
<p>In our case, we simply add a character to the end of link URLs (i.e., as part of a single GET variable) that makes this distinction, so we just added another legal value for MAS purchases.  Additionally, our shortened version numbers are slightly different so (savvy) players can identify the product played on the online high score pages (for example, on <a title="FreeCell high scores (climb mode)" href="http://scores.goodsol.com/topscores/scores/pgs/freecell_climb.html" target="_blank">this FreeCell scores page</a>, see the &#8216;Product&#8217; column).</p>
<h3>5. Remove or modify marketing screens</h3>
<p>Consider whether you should <span style="color: #ff0000;">modify or remove any marketing screens</span> in your product.  If you have dialog boxes which have the occasional link to ordering pages or downloadable content, you will need to remove those links (and any referencing text); if you have dialogs that are explicitly for the purpose of marketing, it may make sense to remove them entirely instead.</p>
<p>In the case of our products, we include a fairly self-explanatory &#8216;<em>Help Center</em>&#8216; screen which not only contains links to the help files for the product, but also serves as a portal to all manner of support services, including sales (verboten), registration code entry (not allowed), customer support email (probably OK), and suggestions for other games (who knows?).  We found that removing the disallowed and questionable content from these pages made them almost pointless, so we instead replaced the entire dialog with a direct link to the help file contents page (within the bundle).</p>
<h3>6. Remove links to any downloadable content</h3>
<p>You must <span style="color: #ff0000;">remove any links to downloadable content</span> or risk the rejection of your product.  Note that these links (and, in truth, a number of other &#8220;offenses&#8221;) may not always be obvious on initial review, so your product can certainly get accepted once and then later rejected for something that was there in the first version; it has happened to us more than once.  (All Apple reviewers are <em>not</em> created equal.)</p>
<p>In the case of <em><strong><a title="Pretty Good Solitaire Mac Edition" href="http://www.goodsol.com/mac/" target="_blank">Pretty Good Solitaire</a></strong></em>, we have card sets which customers can <em>freely</em> download, plus a feature to check for and download updates, both of which are forbidden in the Mac App Store.  The following subsections describe the issues that we had to address to prevent suggesting that there was anything outside the MAS playground.</p>
<h4>6a. Remove download links from main menus</h4>
<p>We had to remove our &#8216;<em>Download Additional Card Sets</em>&#8216; menu option from both the main and game menus.</p>
<h4>6b. Remove version checking from main menus</h4>
<p>We had to remove our &#8216;<em>Download Latest Version</em>&#8216; menu option, which includes an implicit version check, from the both the main and game menus.</p>
<h4>6c. Remove download links from submenus</h4>
<p>We had to also remove a &#8216;<em>Download Additional Card Sets</em>&#8216; menu option from our submenu that players use to select the desired card set (a logical and convenient place to find it).</p>
<h4>6d. Remove download links from buttons</h4>
<p>Finally, we had a &#8216;<em>Download Additional Card Sets</em>&#8216; button within the program preferences, which also had to be removed (actually, hidden).</p>
<p><strong><span style="color: #ff0000;">Note</span></strong>:  In all of these cases, rather than modify our user interface (.nib) files, and thus have to manage different sets of files, we added conditional code that simply removed the offending menu option or hid the button, keeping the source code (including .nib files) identical between downloadable and store versions (distinguished solely by the presence/absence of APPSTORE).</p>
<h3>7. Review any use of the Application Support folder</h3>
<p>Before submitting your application to MAS, carefully <span style="color: #ff0000;">review your use of the Application Support folder</span> (if any).  Specifically, you are allowed to create and (appropriately) use a folder at &#8216;~/Library/Application Support/&lt;app-identifier&gt;&#8217;, where &lt;app-identifier&gt; &#8220;can be your application&#8217;s bundle identifier, its name, or your company’s name.&#8221;</p>
<p>However, there is a twist:  &#8220;<em>These strings must match what you provided through iTunes Connect for this application.</em>&#8220;  This particular requirement is somewhat buried in the guidelines, and it is not always checked.</p>
<p>In our case, we inadvertently created <em>but did not use</em> (in the store version) a folder, &#8216;~/Library/Application Support/Goodsol&#8217;, which seems to fit the criteria.  However, it was <em>supposed</em> to end in &#8216;Goodsol Development&#8217; to meet the letter of this requirement.  This &#8220;violation&#8221; was not discovered until our third or fourth submission, and our downloadable versions already used the folder extensively <em>as named</em>.  Fortunately, the store version did not actually use it (by virtue of including all downloadable content), so we just removed the spurious creation of an empty folder.  Problem solved (albeit with yet another rejection and delay).</p>
<h4>Conclusion</h4>
<p>With the above modifications to source code, plus perhaps a little detective work finding similar issues with any particular application, your project should be tentatively ready for submission to the Mac App Store.  In the next installment, <a title="MAS Preparation, Part 5" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-5/">Part 5: Mac App Store receipt validation</a>, I will discuss the reasons that you should probably validate receipts in your shipping product and provide a few links to useful code and resources.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/02/mas-preparation-part-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MAS Preparation, Part 3</title>
		<link>http://blog.gamecraft.org/2012/02/mas-preparation-part-3/</link>
		<comments>http://blog.gamecraft.org/2012/02/mas-preparation-part-3/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 05:00:10 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[artwork]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2435</guid>
		<description><![CDATA[Data and Resource guidelines In the previous installment of Preparing for Mac App Store Submission, I detailed changes to the information property list that are necessary (or recommended) for a Mac OS X game project being converted to one suitable for MAS submission. This third part deals with practical implications of guidelines for project data [...]]]></description>
			<content:encoded><![CDATA[<h2>Data and Resource guidelines</h2>
<p>In the previous installment of <a title="Preparing for Mac App Store Submission" href="http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/">Preparing for Mac App Store Submission</a>, I detailed <a title="MAS Preparation, Part 2" href="http://blog.gamecraft.org/2012/01/mas-preparation-part-2/">changes to the information property list</a> that are necessary (or recommended) for a Mac OS X game project being converted to one suitable for MAS submission.</p>
<p>This third part deals with practical implications of <span style="color: #ff0000;">guidelines for project data and resources</span>, in particular, artwork and help files.  These points are necessarily somewhat specific to the manner in which we implemented our products, but they should give you some idea of items to look out for, and as always, comments on your experiences are encouraged.</p>
<p>Now, please review all of the artwork and other (non-code) resources in your project with these points in mind&#8230;</p>
<h3>1. Include a 512&#215;512 image in the application icon</h3>
<p>The Mac App Store requires a <span style="color: #ff0000;">512&#215;512 image in the application icon file</span>.  Although this is generally overkill for an application, it is necessary for MAS submissions, where that image size is (presumably) used for presenting your product to users.</p>
<p>We actually produce our Macintosh (.icns) icons under Windows using <a title="Axialis IconWorkshop" href="http://www.axialis.com/iconworkshop/" target="_blank">Axialis IconWorkshop</a>, which handles the required sizes without problem; we recommend this tool for processing icons for multiple platforms.  (We have no affiliation with <strong>Axialis</strong>, except as a satisfied customer.)</p>
<h3>2. Update branding artwork</h3>
<p>Although it seems (and truly <em>is</em>) silly, you need to <span style="color: #ff0000;">review your branding artwork</span> and update anything that even hints that there is another way to obtain software than through the Mac App Store.</p>
<p>Herein lies a theme: <em><span style="color: #ff0000;">Apple hates downloads; Apple hates external sales.</span></em>  Any suggestion that a customer may download or purchase anything outside of MAS will result in the rejection of your submission.  (Trust me, we had this thrown in our face, via rejection, more than once.)</p>
<p>In our case, we had a static bitmap used as a splash screen.  It included the (innocuous) line, &#8220;<em>Download the latest version of Pretty Good Solitaire from http://goodsol.com</em>&#8220;; it was hardly noticeable, and the web address was not even a hot link.  <em><strong>Rejection.</strong></em>  We had to remove that text before resubmitting (and we also removed the line with our support email address, just in case).</p>
<h3>3. Add any extra product data desired</h3>
<p>Continuing with the theme, you will need to <span style="color: #ff0000;">add any extra product data</span> that you may want customers to have, especially any data previously available via download.  In our case, we have (20) extra card sets that are available for <a title="Pretty Good Solitaire Mac Edition" href="http://www.goodsol.com/mac/" target="_blank"><em><strong>Pretty Good Solitaire</strong></em></a> customers to download (and, likewise, extra tile sets and custom layouts for <a title="Pretty Good MahJongg Mac Edition" href="http://www.goodmj.com/mac/" target="_blank"><em><strong>Pretty Good MahJongg</strong></em></a>), so these needed to be added to the main bundle to avoid Apple&#8217;s allergy to downloading.</p>
<p>The one minor advantage of this, of course, is that Apple has to bear the full download bandwidth burden.  (Card set artwork is not small.)</p>
<h3>4. Remove trial version resources from the project</h3>
<p>If appropriate, <span style="color: #ff0000;">remove any resources used only in trial versions</span> of your product.  In our case, we have an exit screen for trial users, as well as a separate interface (nib) file with all dialogs displayed (only) in the trial version, so we removed these.  (There is no sense including unused files, especially if they could give Apple more places to find reasons to reject.)</p>
<p>Similarly, if you have an install bitmap in your bundle, as I recommended in <em><a title="Making Mac Disk Images Pretty" href="http://blog.gamecraft.org/2009/05/making-mac-disk-images-pretty/">Making Mac Disk Images Pretty</a></em>, you may as well remove that, too (since there is no disk image packaging to be done).</p>
<h3>5. Remove any &#8216;How to Order&#8217; section from help files</h3>
<p>Review your help files and <span style="color: #ff0000;">remove any pages that discuss verboten topics</span>, such as downloading, registering, or (especially) purchasing the product.  We have an entire section called &#8220;How to Order&#8221;, dealing with all of those topics, that is just removed wholesale for the MAS submission (but remains in our downloadable versions); it was the cause for a rejection.</p>
<p>Note that Apple does <em>not</em> reject for simple web links back to a product site, which itself may have loads of sales and download information, but you will want to be careful about the surrounding text.</p>
<h3>6. Remove text referring to downloading or sales</h3>
<p>Building from the previous guideline, after removing entire pages about problematic topics, check other help topics and <span style="color: #ff0000;">remove any text referring to downloads or sales</span>, even indirectly.</p>
<p>In our case, we have rule pages for our bonus games, which are provided in the full (purchased) version, and we removed the line, &#8220;<em>Note: This game is only available in the full version of Pretty Good Solitaire.</em>&#8220;  Elsewhere, we also replaced &#8220;the full version&#8221; with &#8220;this version&#8221;.</p>
<h4>Conclusion</h4>
<p>Using the above guidelines, you should be able to make sure that your project does not include any content that Apple may find &#8220;objectionable&#8221;, giving them cause to reject the submission.  In the next installment, <a title="MAS Preparation, Part 4" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-4/">Part 4: Source code modifications</a>, I will discuss the numerous (small) changes that may be necessary in your project source code.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/02/mas-preparation-part-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MAS Preparation, Part 2</title>
		<link>http://blog.gamecraft.org/2012/01/mas-preparation-part-2/</link>
		<comments>http://blog.gamecraft.org/2012/01/mas-preparation-part-2/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 17:56:42 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2424</guid>
		<description><![CDATA[Property List (Info.plist) changes In the last installment of Preparing for Mac App Store Submission, I discussed the project modifications that are necessary (or recommended) for converting an existing Mac OS X project to one suitable for MAS submission. This second part describes the changes to the information property list for your application that you [...]]]></description>
			<content:encoded><![CDATA[<h2>Property List (Info.plist) changes</h2>
<p>In the last installment of <a title="Preparing for Mac App Store Submission" href="http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/">Preparing for Mac App Store Submission</a>, I discussed the <a title="MAS Preparation, Part 1" href="http://blog.gamecraft.org/2012/01/mas-preparation-part-1/">project modifications</a> that are necessary (or recommended) for converting an existing Mac OS X project to one suitable for MAS submission.</p>
<p>This second part describes the <span style="color: #ff0000;">changes to the information property list</span> for your application that you should make for successful submission and to eschew rejections for simple issues.  As before, comments about any other issues or different experiences are certainly welcome.</p>
<p>Open the application information property list, usually named &#8216;<em><span style="color: #ff0000;">Info.plist</span></em>&#8216;, in your project and follow these steps&#8230;</p>
<h3>1. Update the bundle version format</h3>
<p>First, <span style="color: #ff0000;">update the format of the &#8216;Bundle version&#8217; entry</span> (<strong>CFBundleVersion</strong>) to contain exactly 3 period-separated integers representing the version number (e.g., &#8220;<em>1.01.1</em>&#8220;).  It cannot contain alphabetic characters (and although some documentation suggests that it <em>may</em> contain more or fewer integers, we did not take that chance).</p>
<p>For non-MAS applications, the format of this field was not enforced and, in fact, the default &#8216;About&#8217; box encouraged the use of this field as a standard version description (alphanumeric string) by directly displaying it underneath the application name.  We used a format like, &#8220;1.01 (January 2012)&#8221;, which is more useful and aesthetically pleasing, but this was cause for rejection.</p>
<h3>2. Add an application category</h3>
<p>If you do not have one already, you will need to <span style="color: #ff0000;">add an &#8216;Application Category&#8217; entry</span> (<strong>LSApplicationCategoryType</strong>).  The easiest way to set this value (in Xcode 4) is to select the &#8216;Summary&#8217; tab for your target and select the appropriate setting in the &#8216;Application Category&#8217; box.  In the case of <em><strong>Pretty Good Solitaire</strong></em>, we chose &#8216;Games &#8211; Card Games&#8217; (<em>public.app-category.card-games</em>).</p>
<p>Note that Xcode 3 did not recognize this key, so it was necessary to explicitly add it, along with the appropriate category value, as found in the <a title="Launch Services Keys" href="http://developer.apple.com/library/mac/#documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html" target="_blank">Information Property List Key Reference</a>; fortunately, this is no longer necessary.</p>
<h3>3. Set the minimum system version</h3>
<p>Next, <span style="color: #ff0000;">set the &#8216;Minimum system version&#8217; entry</span> (<strong>LSMinimumSystemVersion</strong>) to &#8220;10.6.6&#8243;, or higher if appropriate.</p>
<p>The Mac App Store does not work on versions of Mac OS X prior to 10.6.6 anyway, and leaving this at a lower setting (even if your downloadable versions support Leopard, Tiger, or even an earlier OS) may be cause for a rejection.</p>
<h3>4. Review the supported document types</h3>
<p>Finally, <span style="color: #ff0000;">review the supported &#8216;Document types&#8217; entry</span> (<strong>CFBundleDocumentTypes</strong>), if any.  Remove any document types that will not be supported in your store version.</p>
<p>In our case, we supported a document type for saved games, which is still useful, but also a document type for automatic installation of extra card sets (which can be downloaded), or in the case of <em><strong>Pretty Good MahJongg</strong></em>, types for both extra tile sets and tile matching layouts.  Since downloading or installing any improvement to your application (outside of the Mac App Store) is verboten, we needed to remove this support.</p>
<p>Note that this <em>initially</em> passed muster with our first product, but it was cause for a rejection later on a different product using essentially identical functionality.  There is clearly some subjectivity to the application reviews, so a more thorough (or <em>nitpicky</em>) reviewer may find something previously allowed.  When a rejection can set your release schedule back a couple of weeks or more, it is not worth the risk.</p>
<h4>Conclusion</h4>
<p>With just these few changes to your information property list, your project should have the necessary application information for submission.  In the next installment, <a title="MAS Preparation, Part 3" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-3/">Part 3: Data and Resource guidelines</a>, I will describe the issues you may encounter with your application data.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/01/mas-preparation-part-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MAS Preparation, Part 1</title>
		<link>http://blog.gamecraft.org/2012/01/mas-preparation-part-1/</link>
		<comments>http://blog.gamecraft.org/2012/01/mas-preparation-part-1/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 05:00:53 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2416</guid>
		<description><![CDATA[Project modifications In Preparing for Mac App Store Submission, the first set of changes you should make are to the project itself. This installment describes the project modifications that need to be made to an existing Mac OS X game project.  The general assumptions are that the existing project is working and properly tested, and [...]]]></description>
			<content:encoded><![CDATA[<h2>Project modifications</h2>
<p>In <a title="Preparing for Mac App Store Submission" href="http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/">Preparing for Mac App Store Submission</a>, the first set of changes you should make are to the project itself.</p>
<p>This installment describes the <span style="color: #ff0000;">project modifications</span> that need to be made to an existing Mac OS X game project.  The general assumptions are that the existing project is working and properly tested, and that, ultimately, you will want to maintain a single set of source code with conditional compilation to differentiate the store version from other builds.  Note that these are the steps that we took for <em><strong><a title="Pretty Good MahJongg Mac Edition" href="http://www.goodsol.com/mac/">Pretty Good Solitaire Mac Edition</a></strong></em>; your project may require some adjustments to these steps.  (Comments where any significant change is necessary would be very appreciated.)</p>
<p>So, without further ado&#8230;</p>
<h3>0. Create a duplicate store project</h3>
<p>Before making any other changes, <span style="color: #ff0000;">create a duplicate copy of the entire project folder</span> and name the copy appropriately.  In our case, the original folder was &#8216;Pretty Good Solitaire&#8217; (which builds full and trial versions of the game) and we created a separate &#8216;pgsse&#8217; (Pretty Good Solitaire [Mac/]Store Edition) folder for MAS modifications.</p>
<p>The version of your project that you will submit to the Mac App Store is a <span style="color: #ff0000;">separate SKU</span> (Shelf Keeping Unit), a build that uses slightly different code and configuration and which is distributed via a different channel.  While it is possible to have the store target within the main project, certain features (e.g., Power PC support, Mac OS X 10.5 support, downloadable data) are not supported in MAS, so it is easier to separate them (at first, anyway).  In any event, doing so at the start gives you a safe playground for making changes without messing up your working project.</p>
<h3>1. Update the project version number</h3>
<p>As just noted, the store build is a separate version and, thus, should have a <span style="color: #ff0000;">different version number</span>.  In our case, we decided that odd minor versions (e.g., &#8220;1.01&#8243;) would represent the store editions, while even minor versions (e.g., &#8220;1.00&#8243;) represented the direct downloadable editions.</p>
<h3>2. Rename the primary build target</h3>
<p>In the new project (of course), <span style="color: #ff0000;">rename the primary build target</span> to something appropriate.  In our case, we renamed the <em>full</em> version target to &#8216;Pretty Good Solitaire store&#8217;, which is now the <em>store</em> version.  You could also delete any redundant or obsolete targets remaining in the project.  For example, we deleted the <em>trial</em> version target, as it is built in the original project and the MAS version <strong>cannot</strong> have any vestiges of a trial version.</p>
<p>Note that this step is not strictly required, but it is a good idea to differentiate between targets, so it is always immediately obvious which project is active, and also to minimize any excess baggage, which reduces the possibility of mistakes.</p>
<h3>3. Build with a current Xcode version</h3>
<p>Make sure that you <span style="color: #ff0000;">build the project with a current version of Xcode</span>.  Submissions to the Mac App Store now require Xcode 4 and, as of this writing, the latest version is Xcode 4.2.1.</p>
<p>If you have an older version of Xcode, this would be a good time to upgrade, and although it will not be mentioned explicitly, you should build the project regularly, ideally after every change, to make sure that the build is not broken and behaves as expected.</p>
<h3>4. Define a preprocessor variable</h3>
<p>To allow for conditional compilation of certain source code, it is a good idea to <span style="color: #ff0000;">define a preprocessor variable</span>, <strong>APPSTORE</strong>, for any build targets intended for MAS.  In the &#8216;Build Settings&#8217; for the target (or the whole project, if you prefer), find the setting for &#8216;Preprocessor Macros&#8217; and add &#8220;APPSTORE&#8221; to <em>each</em> configuration.  Note that it is common to have different variables for &#8216;Release&#8217; and &#8216;Debug&#8217; configurations, so be careful to define APPSTORE for each one without accidentally removing or altering any existing definitions.</p>
<p>Of course, there is no requirement that the preprocessor variable be named &#8220;APPSTORE&#8221;, but beware that simply using &#8220;STORE&#8221; results in a naming conflict in the latest Mac OS X SDK.</p>
<h3>5. Add necessary frameworks/libraries</h3>
<p>In order to test the validity of app receipts, you will need to <span style="color: #ff0000;">add the IOKit and Security frameworks and the crypto library</span>.  From the &#8216;Build Phases&#8217; of the primary target, open the &#8216;Link Binary With Libraries&#8217; section and, by clicking on the &#8216;+&#8217; symbol, add &#8216;<strong>IOKit.framework</strong>&#8216;, &#8216;<strong>Security.framework</strong>&#8216; and &#8216;<strong>libcrypto.dylib</strong>&#8216;.</p>
<p>Note that Xcode 4 adds these frameworks/libraries at the top level of your project; you will probably want to drag them into the &#8216;External Framework and Libraries&#8217; folder with the other frameworks.</p>
<h3>6. Configure debugging symbols</h3>
<p>Despite submitting a <em>release</em> version to MAS, Apple requires debugging information to be included with a submission.  To accede to this requirement, you must <span style="color: #ff0000;">set &#8216;Generate Debug Symbols&#8217; to &#8220;Yes&#8221;</span> and also <span style="color: #ff0000;">set &#8216;Debug Information Format&#8217; to &#8220;DWARF with dSYM File&#8221;</span> (at least for the &#8216;Release&#8217; configuration) in the &#8216;Build Settings&#8217; of the target.</p>
<p>In our original project, we had all debug information disabled and/or stripped from the release builds, but one of our early issues was the lack of the dSYM file with debugging information for Apple.</p>
<h3>7. Set correct build architecture</h3>
<p>Finally, <span style="color: #ff0000;">set &#8216;Architectures&#8217; to an Intel (only) setting</span>; for our project, that is &#8220;32-bit Intel&#8221;.</p>
<p>Even if your code and original project supports both PPC and Intel via a &#8220;Universal&#8221; application, the presence of a PPC build in your submission will result in rejection.  (We found that out the hard/lengthy way.)  At least now there are settings for this; in Xcode 3, you had to use &#8220;i386&#8243;, which was not even listed as a choice.</p>
<h4>Conclusion</h4>
<p>At this point, you should have a new project with a <em>store</em> target and all of the build settings configured appropriately.  In the next installment, <a title="MAS Preparation, Part 2" href="http://blog.gamecraft.org/2012/01/mas-preparation-part-2/">Part 2: Property List (Info.plist) changes</a>, we will discuss the necessary adjustments and additions to the information property list for your project.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/01/mas-preparation-part-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Preparing for Mac App Store Submission</title>
		<link>http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/</link>
		<comments>http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 05:00:04 +0000</pubDate>
		<dc:creator>Gregg Seelhoff</dc:creator>
				<category><![CDATA[Technical]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.gamecraft.org/?p=2408</guid>
		<description><![CDATA[Making a Mac OS X game project suitable for MAS If you currently have a Mac product and have not already done so, you may be considering submission to the Mac App Store (MAS). In the upcoming series of posts, I will be detailing the process that we went through to get Pretty Good Solitaire [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Making a Mac OS X game project suitable for MAS</strong></p>
<p><a href="http://www.apple.com/mac/app-store/"><img class="alignright" title="Mac App Store" src="http://blogger.gamecraft.org/images/appstore_icon.png" alt="" width="256" height="256" /></a>If you currently have a Mac product and have not already done so, you may be considering submission to the <span style="color: #ff0000;">Mac App Store</span> (<a title="Mac App Store" href="http://www.apple.com/mac/app-store/" target="_blank">MAS</a>).</p>
<p>In the upcoming series of posts, I will be detailing the process that we went through to get <em><strong><a title="Pretty Good Solitaire Mac Edition" href="http://www.goodsol.com/mac/" target="_blank">Pretty Good Solitaire Mac Edition</a></strong></em>, and some of our other game products, successfully submitted to MAS.  There were a number of rejections along the way, as the <a title="App Store Review Guidelines" href="http://developer.apple.com/appstore/guidelines.html" target="_blank">App Store Review Guidelines</a> <em>[note: requires Mac developer agreement]</em>, while extensive, are <em>not</em> comprehensive (nor are they 100% consistent, as we had some products accepted and others rejected with identical behaviors).</p>
<p>Over multiple submissions, and fewer rejections, we developed a <span style="color: #ff0000;">submission checklist</span> which I will detail roughly (some items are specific to our games) in these upcoming posts:</p>
<ul>
<li><a title="MAS Preparation, Part 1" href="http://blog.gamecraft.org/2012/01/mas-preparation-part-1/">Part 1: Project modifications</a></li>
<li><a title="MAS Preparation, Part 2" href="http://blog.gamecraft.org/2012/01/mas-preparation-part-2/">Part 2: Property List (Info.plist) changes</a></li>
<li><a title="MAS Preparation, Part 3" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-3/">Part 3: Data and Resource guidelines</a></li>
<li><a title="MAS Preparation, Part 4" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-4/">Part 4: Source code modifications</a></li>
<li><a title="MAS Preparation, Part 5" href="http://blog.gamecraft.org/2012/02/mas-preparation-part-5/">Part 5: Mac App Store receipt validation</a></li>
<li><a title="MAS Preparation, Part 6" href="http://blog.gamecraft.org/2012/03/mas-preparation-part-6/">Part 6: App Sandboxing implementation</a></li>
</ul>
<p>We have had product in the Mac App Store since launch day, more than a year ago.  If you already have a game that runs on Mac OS X, it makes sense to make the several modifications to get it into MAS, another channel to find customers.  However, in our experience, it is <em>not</em> a viable substitute for direct downloadable sales.  The channel is not (yet) the primary &#8216;go to&#8217; location for Mac software, although the availability of Lion (Mac OS X 10.7) <em>only</em> on MAS should shift more customers.  Additionally, there is the same downward pressure on pricing (towards free) seen on the iOS App Store, sales are lackluster, and (of course) you are giving 30% directly to Apple.</p>
<p>I would certainly not recommend developing a project solely for the Mac App Store, nor eliminating a direct downloadable sales channel in favor of MAS, but with an existing project it may be worth the fairly limited extra effort it takes to be there, <em>too</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gamecraft.org/2012/01/preparing-for-mac-app-store-submission/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

