<?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>App Store &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/app-store/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Thu, 15 May 2025 15:01:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Build Your First iOS App with Xojo: 10 Practical Steps</title>
		<link>https://blog.xojo.com/2025/05/16/build-your-first-ios-app-with-xojo-10-practical-steps/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Fri, 16 May 2025 15:45:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App Store Connect]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Developer Marketing]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14876</guid>

					<description><![CDATA[Xojo is an extremely useful, fast and fun development environment for building your first (or next) iOS app. In this article, I offer a series&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Xojo is an extremely useful, fast and fun development environment for building your first (or next) iOS app. In this article, I offer a series of practical steps to guide you from idea to app.</p>



<span id="more-14876"></span>



<h2 class="wp-block-heading">1. Define Your Idea</h2>



<p>Start by summarizing your app’s purpose in a single, clear sentence. The more concise it is, the better defined your objective will be. This clarity will help guide your screen designs, navigation structure and code architecture.</p>



<p>This sentence can also double as your app’s short description in App Store Connect.</p>



<p>Focus on the essential features that form your app’s <a href="https://en.wikipedia.org/wiki/Minimum_viable_product">Minimum Viable Product</a> (MVP). It’s easy to get sidetracked by new ideas during development. Resist the urge! Instead, keep a list of potential features for future updates and base priorities on user feedback.</p>



<h2 class="wp-block-heading">2. Choose The Platform(s)</h2>



<p>Xojo supports both iPhone and iPad, but your app doesn’t have to. Choose the device type that best fits your app’s use case.</p>



<ul class="wp-block-list">
<li>iPhone apps often support quick, task-based interactions.</li>



<li>iPad apps are better suited to immersive, content-rich experiences.</li>
</ul>



<p>To target a specific device only, set the unused layout (iPhone or iPad) to “None” in the App item’s Inspector Panel.</p>



<p>You’ll also need to decide the minimum iOS version to support. Xojo currently defaults to iOS 14.0, but as of writing, over 60% of users are on iOS 18 or later.</p>



<h2 class="wp-block-heading">3. Prototyping</h2>



<p>Xojo’s visual layout editor makes it easy to dive in designing your app. But take time to prototype your app first, especially if it has more than basic functionality.</p>



<p>Use tools like Figma or MockUp, or simply sketch your ideas with pencil and paper. Choose whatever helps you plan best and clearly.</p>



<p>Also, review Apple’s <a href="https://developer.apple.com/design/human-interface-guidelines/">Human Interface Guidelines</a> to align your app with native iOS expectations.</p>



<p>When designing in Xojo, you can fine-tune layout behavior using the <a href="https://documentation.xojo.com/api/ios/ioslayoutconstraint.html#ioslayoutconstraint">iOSLayoutConstraint</a> class to adapt to orientation and screen size changes at runtime.</p>



<h2 class="wp-block-heading">4. Database Design</h2>



<p>Most apps use a database. For local storage on iOS, use <a href="https://documentation.xojo.com/api/databases/sqlitedatabase.html#methods">SQLiteDatabase</a>, and save your database file in <a href="https://documentation.xojo.com/api/files/specialfolder.html#specialfolder">SpecialFolder.Documents</a>.</p>



<p>Two key best practices:</p>



<ul class="wp-block-list">
<li>Add a Metadata table to track the database schema version. </li>



<li>Create a custom <a href="https://blog.xojo.com/2025/02/05/customize-and-extend-core-databases-functionality/">SQLiteDatabase subclass</a> to manage all read/write operations in one place.</li>
</ul>



<p>This setup allows you to always know which version is installed on the user&#8217;s device and to react accordingly as your app evolves.</p>



<h2 class="wp-block-heading">5. Graphic Resources</h2>



<p>For icons, buttons and tab bar images, use <a href="https://documentation.xojo.com/api/graphics/picture.html#picture-systemimage">Picture.SystemImage</a> with symbols from Apple’s <a href="https://developer.apple.com/sf-symbols/">SF Symbols</a> app. These scale beautifully across devices and adapt to light/dark mode. Just ensure compatibility with your minimum iOS version.</p>



<p>When using custom images, add them at multiple resolutions for optimal display across all screen sizes.</p>



<p>Typography also matters. Use system <a href="http://www.iosfont.com">fonts</a> thoughtfully, ideally no more than two font families. Vary sizes and weights to establish content hierarchy. Keep text readable with a minimum font size of 11pt.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Tip: When testing in the Simulator, set the window to physical size (Simulator &gt; Window &gt; Physical Size) to preview real-world readability.</p>
</blockquote>



<h2 class="wp-block-heading">6. Localization and Accessibility</h2>



<p>Nothing prevents you from publishing an app in a single language, whether it&#8217;s your native language or English; but supporting multiple languages can increase downloads by over 100x.</p>



<p>Start localizing early to avoid design issues later. Add a module to your Xojo project with localized String constants for all app text, and enable the “Localized” option for each one.</p>



<p>Suggested languages (in order of impact):</p>



<p>Core: English</p>



<p>High-impact additions: Chinese, Spanish, German, French, Japanese, Italian, Portuguese, Russian, Korean</p>



<p>Also, localize accessibility labels and App Store listings, including screenshots and descriptions, for each supported language.</p>



<h2 class="wp-block-heading">7. Testing the App</h2>



<p>Xojo provides multiple ways to test your app, both from a design and user experience perspective, as well as from a functionality perspective:</p>



<ul class="wp-block-list">
<li><strong>Simulators</strong>: Ideal for design, layout and localization testing. You can also use them to take App Store screenshots.</li>



<li><strong>On-device Debugging</strong>: Offers realistic input experience and access to hardware-only features.</li>



<li><strong>Build to Device</strong>: Lets you run the app outside the debugger, simulating real-world use.</li>
</ul>



<p>Once you’ve finished fixing bugs in your code and app design, move on to testing in the real world by compiling your app and using Xcode to copy that bundle to a physical device. Testing like this, you&#8217;ll likely find some optimizations, especially around design and usability.</p>



<p>TestFlight is your gateway to external beta testers. After uploading a build to App Store Connect, create a public link to invite testers. Remember to increment the version number with each new build.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Tip: Add <code>ITSAppUsesNonExemptEncryption = False</code> in your Property List to streamline build approvals.</p>
</blockquote>



<h2 class="wp-block-heading">8. Publish it!</h2>



<p>Publishing with Xojo is straightforward. The most time-consuming step is preparing your App Store Connect listing including text, artwork, screenshots, keywords and possibly localized pages. Read more about this in my earlier post <em><a href="https://blog.xojo.com/2025/03/25/how-to-publish-macos-and-ios-apps-to-the-app-store-directly-from-xojo/">How to Publish macOS and iOS Apps to the App Store Directly from Xojo</a></em>.</p>



<p>Make sure you select the correct build when submitting your app for review.</p>



<h2 class="wp-block-heading">9. Marketing</h2>



<p>Something you should be doing simultaneously is preparing the related materials to introduce your app to the world. Start your marketing efforts early. A simple website can significantly boost discoverability. Use it to:</p>



<ul class="wp-block-list">
<li>Provide tutorials and FAQs</li>



<li>Link to App Store and social media</li>



<li>Highlight features and updates</li>
</ul>



<p>Consider creating a YouTube channel for app demos and support videos, and maintain active social media profiles to stay visible.</p>



<p>Don&#8217;t forget to take advantage of the <a href="https://toolbox.marketingtools.apple.com">Marketing tools provided by Apple</a> to help you create badges, assets, links and even QR codes to promote your app.</p>



<h2 class="wp-block-heading">10. The Next Steps …</h2>



<p>After launch, gather user feedback and track any bugs that slipped through. At this stage, it’s common to manage:</p>



<ul class="wp-block-list">
<li>A public release (on the App Store)</li>



<li>A development version (next major update)</li>
</ul>



<p>Save your Xojo iOS project in text format and use a version control system. This helps you manage multiple branches and collaborate efficiently.</p>



<h2 class="wp-block-heading">To Summarize</h2>



<p>Even the simplest iOS apps require a fair amount of time and effort, but thanks to Xojo, both aspects are significantly reduced.</p>



<p>What iOS apps have you created with Xojo? What&#8217;s your methodology or any tips you&#8217;d like to share? Feel free to comment on the <a href="http://forum.xojo.com">Xojo forum</a>!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Property List Editor, Integrated in the IDE</title>
		<link>https://blog.xojo.com/2025/03/25/property-list-editor-integrated-in-the-ide/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 25 Mar 2025 15:34:12 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[2025r1]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App Store Connect]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mac App Store]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14554</guid>

					<description><![CDATA[Starting with Xojo 2025r1, a new Property List Editor is available for both Desktop (macOS) and iOS projects under Build Settings &#62; macOS and Build&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Starting with Xojo 2025r1, a new Property List Editor is available for both Desktop (macOS) and iOS projects under Build Settings &gt; macOS and Build Settings &gt; iOS. This editor simplifies the process of adding custom entries that your app may require, beyond those automatically included by Xojo.</p>



<span id="more-14554"></span>



<p>Some projects require additional entries in the generated Info.plist file. Previously, the only way to include these entries was to create the file manually using an external text editor, then drag and drop it into the project’s Navigation area. This allowed its contents to be merged with the entries automatically generated by Xojo in the final Info.plist file within the app bundle.</p>



<p>Now, the Property List Editor in the Xojo IDE provides a simpler way to add these entries. Once added, you can even export the contents to an external file, making it easy to reload them later for other projects that require the same set of entries. This saves time by eliminating the need to manually re-enter them.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img fetchpriority="high" decoding="async" width="1424" height="1082" src="https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-26-at-12.18.28 PM.png" alt="" class="wp-image-14555" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-26-at-12.18.28 PM.png 1424w, https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-26-at-12.18.28 PM-300x228.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-26-at-12.18.28 PM-1024x778.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-26-at-12.18.28 PM-768x584.png 768w" sizes="(max-width: 1424px) 100vw, 1424px" /></figure>
</div>


<p>What about projects that already reference an external Info.plist file? No worries—Xojo will automatically merge its contents with the entries added via the Property List Editor. If the same key exists in both the external file and the Property List Editor, the value from the Property List Editor will take precedence, overriding the one in the external file.</p>



<p>As for the types of data that can be added to the Property List Editor, the expected options are offered:</p>



<p><strong>For collections:</strong></p>



<ul class="wp-block-list">
<li>Dictionary</li>



<li>Array</li>
</ul>



<p><strong>For primitive values:</strong></p>



<ul class="wp-block-list">
<li>Number</li>



<li>String</li>



<li>Boolean</li>
</ul>



<p>For primitive value entries, the Editor allows you to convert them to any of the other two supported primitive types. For example, if you add a Number entry, you can later select it and convert it to a String or Boolean type as needed.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" width="1208" height="862" src="https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-18-at-1.00.05 PM.png" alt="" class="wp-image-14556" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-18-at-1.00.05 PM.png 1208w, https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-18-at-1.00.05 PM-300x214.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-18-at-1.00.05 PM-1024x731.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/Screenshot-2025-02-18-at-1.00.05 PM-768x548.png 768w" sizes="(max-width: 1208px) 100vw, 1208px" /></figure>
</div>


<p>Of course, the entries added through the Property List Editor are applied and saved to the project file in addition to any changes made using the Property List Editor. The next time you open the project in Xojo, you&#8217;ll find the previously applied Info.plist entries already in place.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Tip:</strong> If you&#8217;re using the new Publish feature to send your macOS apps to App Store Connect, you can simplify Apple&#8217;s encryption compliance process by adding a new Boolean entry in the Property List Editor with the following values:</p>
</blockquote>



<p><strong>Key:</strong> ITSAppUsesNonExemptEncryption<br><strong>Value:</strong> False</p>



<p>By doing this, you won&#8217;t need to manually go through the &#8220;Manage&#8221; option for Apple&#8217;s encryption compliance on the App Store Connect website—provided your app does not actually use encryption that requires disclosure.</p>



<h2 class="wp-block-heading">In Summary</h2>



<p>Whether you&#8217;re developing macOS or iOS projects, the integration of the Property List Editor in the Xojo IDE streamlines the process of managing additional Info.plist entries. You no longer need to manually create and import external files —now, you can add, edit, and reuse entries directly within the IDE. This not only saves time but also ensures consistency across multiple projects!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Publish macOS and iOS Apps to the App Store Directly from Xojo</title>
		<link>https://blog.xojo.com/2025/03/25/how-to-publish-macos-and-ios-apps-to-the-app-store-directly-from-xojo/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 25 Mar 2025 15:34:03 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[2025r1]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App Store Connect]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[Mac App Store]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14558</guid>

					<description><![CDATA[Starting with Xojo 2025r1, you can publish macOS and iOS apps to App Store Connect directly from the Xojo IDE. Keep reading to learn how!&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Starting with Xojo 2025r1, you can publish macOS and iOS apps to App Store Connect directly from the Xojo IDE. Keep reading to learn how!</p>



<p><a href="http://Starting with Xojo 2025r1, you can publish macOS and iOS apps to the App Store Connect website directly from the Xojo IDE. Keep reading to learn how!  App Store Connect is where developers create app records as part of the process to make their apps available on the Mac App Store and/or iOS App Store. All apps must go through Apple’s review process for approval. Once an app record exists in App Store Connect, every new app build uploaded from the Xojo IDE will be available there!">App Store Connect</a> is where developers create app records as part of the process to make their apps available on the Mac App Store and/or iOS App Store. All apps must go through Apple’s review process for approval. Once an app record exists in App Store Connect, every new app build uploaded from the Xojo IDE will be available there!</p>



<h2 class="wp-block-heading">First Things, First</h2>



<p>Before exploring how to use Xojo&#8217;s new Publish feature, let&#8217;s review the requirements and previous processes to better understand how it works.</p>



<p>You may have already met these requirements, but it&#8217;s always a good idea to review them.</p>



<ul class="wp-block-list">
<li>A paid Apple Developer membership (approximately US $99/yr).</li>



<li>Xcode installed on your Mac, preferably the latest version (Xcode 16.2 at the time of writing, which requires macOS Sequoia 15.2). However, Xojo also works with Xcode 13 or later, such as on macOS Ventura.</li>



<li>The following certificates are present in your Mac&#8217;s Keychain:
<ul class="wp-block-list">
<li>Developer ID Application</li>



<li>Apple Distribution</li>



<li>3rd Party Mac Developer Installer</li>
</ul>
</li>



<li>An explicit App ID (Identifier) has been created for your app at developer.apple.com.</li>



<li>A Provisioning Profile has been created at developer.apple.com to ensure the uploaded build is available for testing via TestFlight.</li>



<li>No pending agreements are waiting for your approval at both developer.apple.com and appstoreconnect.apple.com.</li>
</ul>



<h2 class="wp-block-heading">Handling Certificates</h2>



<p>The best way to ensure you have the correct certificates installed in your Mac’s Keychain is to manage them directly from Xcode. Open Xcode, go to Preferences &gt; Accounts, and make sure you are signed in with your developer.apple.com credentials.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" width="1884" height="1328" src="https://blog.xojo.com/wp-content/uploads/2025/02/1-Certificates-A.png" alt="" class="wp-image-14559" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/1-Certificates-A.png 1884w, https://blog.xojo.com/wp-content/uploads/2025/02/1-Certificates-A-300x211.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/1-Certificates-A-1024x722.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/1-Certificates-A-768x541.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/1-Certificates-A-1536x1083.png 1536w" sizes="(max-width: 1884px) 100vw, 1884px" /></figure>
</div>


<p>Next, click the &#8220;Manage Certificates…&#8221; button. A new window will appear, displaying the installed certificates—including expired ones or those missing a private key. From here, you can also download any missing certificates.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1884" height="1328" src="https://blog.xojo.com/wp-content/uploads/2025/02/2-Certificates-B.png" alt="" class="wp-image-14560" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/2-Certificates-B.png 1884w, https://blog.xojo.com/wp-content/uploads/2025/02/2-Certificates-B-300x211.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/2-Certificates-B-1024x722.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/2-Certificates-B-768x541.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/2-Certificates-B-1536x1083.png 1536w" sizes="auto, (max-width: 1884px) 100vw, 1884px" /></figure>
</div>


<p>Once the required certificates are installed on your Mac, I recommend opening the Keychain app to remove any revoked, expired, or incomplete certificates (those missing a private key) to keep your Keychain clean and organized.</p>



<h2 class="wp-block-heading">Handling App ID</h2>



<p>The App ID, Identifier, or &#8216;Bundle Identifier&#8217; is something you should be familiar with whenever you create a new macOS or iOS app in the Xojo IDE.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1764" height="1334" src="https://blog.xojo.com/wp-content/uploads/2025/02/3-App-Identifier.png" alt="" class="wp-image-14561" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/3-App-Identifier.png 1764w, https://blog.xojo.com/wp-content/uploads/2025/02/3-App-Identifier-300x227.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/3-App-Identifier-1024x774.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/3-App-Identifier-768x581.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/3-App-Identifier-1536x1162.png 1536w" sizes="auto, (max-width: 1764px) 100vw, 1764px" /></figure>
</div>


<p>You also need to create the same App ID at developer.apple.com. Log in to the Apple Developer portal using your Apple Developer credentials, then click &#8220;Identifiers&#8221; under the &#8220;Certificates, IDs &amp; Profiles&#8221; section.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2100" height="1312" src="https://blog.xojo.com/wp-content/uploads/2025/02/5-Identifiers.png" alt="" class="wp-image-14562" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/5-Identifiers.png 2100w, https://blog.xojo.com/wp-content/uploads/2025/02/5-Identifiers-300x187.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/5-Identifiers-1024x640.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/5-Identifiers-768x480.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/5-Identifiers-1536x960.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/02/5-Identifiers-2048x1280.png 2048w" sizes="auto, (max-width: 2100px) 100vw, 2100px" /></figure>
</div>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> Keep in mind that you must create a new App ID and follow these steps for each macOS or iOS app you want to distribute through the Mac or iOS App Store.</p>
</blockquote>



<ul class="wp-block-list">
<li>On the page displayed after the previous step, click the <strong>&#8220;+&#8221;</strong> button next to the &#8220;Identifiers&#8221; header to register a new Identifier. </li>



<li>On the next page, ensure that &#8220;App IDs&#8221; is selected, then click &#8220;Continue&#8221;. </li>



<li>On the following page, select &#8220;App&#8221;, then click &#8220;Continue&#8221; again.</li>



<li>Now, you’ll reach the most important step—entering the explicit Bundle ID. Make sure it exactly matches the &#8220;Application Identifier&#8221; used when creating the project in the Xojo IDE. </li>



<li>Also, verify that the App ID Prefix matches the Team ID of the certificates installed in your Mac’s Keychain via Xcode.</li>



<li>Select any Capabilities and/or App Services your app requires. (For this example, none are selected.) </li>



<li>Click &#8220;Continue&#8221; to proceed to the summary page, where you can review all the entered details and selected Capabilities/App Services. </li>



<li>If everything looks correct, click &#8220;Register&#8221; to finalize the process.</li>
</ul>



<p>Once registered, the new Identifier will appear in the list under the &#8220;Identifiers&#8221; section.</p>



<h2 class="wp-block-heading">Handling Provisioning Profiles</h2>



<p>TestFlight is an Apple service that allows developers to gather feedback from users and teammates while an app is still in development, before it becomes publicly available on the Mac or iOS App Store. When a new app build (version) is published from the Xojo IDE, it will also become available through TestFlight.</p>



<p>However, for this to work, the app must have a &#8220;Provisioning Profile&#8221; embedded. This profile needs to be created on the &#8220;developer.apple.com&#8221; website, as we did in the previous &#8220;App ID&#8221; section.</p>



<p>There are two main types of provisioning profiles: &#8220;Development&#8221; and &#8220;Distribution.&#8221; The key difference is:</p>



<ul class="wp-block-list">
<li>&#8220;Development&#8221; profiles specify which devices an app can be installed on. They are primarily used for internal testing on user devices or, in the case of iOS apps, for running tests on a physical device using the &#8220;Run On Device&#8221; option in the Xojo IDE.</li>



<li>&#8220;Distribution&#8221; profiles are used for submitting apps to the App Store or making them available for TestFlight testing.</li>
</ul>



<p>In this example, we will focus on creating a &#8220;Distribution Provisioning Profile&#8221; to ensure that apps published from the Xojo IDE are eligible for TestFlight testing.</p>



<ul class="wp-block-list">
<li>Log in to &#8220;developer.apple.com&#8221; and navigate to the &#8220;Certificates, IDs &amp; Profiles&#8221; section.</li>



<li>Select &#8220;Profiles&#8221; and click the &#8220;+&#8221; button next to the &#8220;Profiles&#8221; header.</li>



<li>On the next page, under the &#8220;Distribution&#8221; section, select &#8220;Mac App Store Connect&#8221; if you are creating a profile for a macOS app. For iOS apps, choose &#8220;App Store Connect&#8221; instead. Click &#8220;Continue.&#8221;</li>



<li>Select the &#8220;App ID&#8221; you previously created. Notice that the App ID is prefixed with the &#8220;Team ID&#8221; from when the App ID was created (e.g., &#8220;BW7PU32485&#8221;).</li>



<li>Under &#8220;Profile Type,&#8221; make sure the &#8220;Mac&#8221; option is selected instead of &#8220;Mac Catalyst.&#8221; Click &#8220;Continue.&#8221;</li>



<li>On the next page, select the same &#8220;Distribution&#8221; certificate that will be used when building the Xojo app (i.e., the &#8220;Apple Distribution&#8221; certificate installed on your Mac). Click &#8220;Continue.&#8221;</li>



<li>Give the Provisioning Profile a meaningful name so you can easily distinguish it later from other profiles. Click &#8220;Generate.&#8221;</li>



<li>After a few seconds, the Provisioning Profile summary page will appear with a &#8220;Download&#8221; button. Click it to download the profile.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>NOTE:</strong> Provisioning Profiles for iOS<br>For iOS apps, you need to create both &#8220;Development&#8221; and &#8220;Distribution&#8221; provisioning profiles.</p>



<ul class="wp-block-list">
<li>When creating the &#8220;Development&#8221; provisioning profile, be sure to include all registered devices you want to use for installing and testing the app directly from Xojo (using the &#8220;Run On Device&#8221; option in the IDE).</li>



<li>Once these provisioning profiles are downloaded to your Mac, double-click on them to ensure Xcode installs them in the correct location (as of this writing: &#8220;Library &gt; Developer &gt; Xcode &gt; User Data &gt; Provisioning Profiles&#8221;).</li>
</ul>
</blockquote>



<h2 class="wp-block-heading">Adding the Distribution Provision Profile to your Xojo Project</h2>



<p>Move the downloaded macOS Distribution Provisioning Profile to a more convenient location related to your Xojo project, and rename it to &#8220;embedded.provisionprofile&#8221;.</p>



<p>Next, open your Xojo project and add a new &#8220;Copy Files&#8221; step:</p>



<ul class="wp-block-list">
<li>Right-click (or use the contextual menu) and choose &#8220;Add to &#8216;Build Settings&#8217; &gt; Build Step &gt; Copy Files&#8221;.</li>



<li>Select the &#8220;macOS&#8221; item under &#8220;Build Settings.&#8221;</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1126" height="434" src="https://blog.xojo.com/wp-content/uploads/2025/02/16-CopyFiles.png" alt="" class="wp-image-14563" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/16-CopyFiles.png 1126w, https://blog.xojo.com/wp-content/uploads/2025/02/16-CopyFiles-300x116.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/16-CopyFiles-1024x395.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/16-CopyFiles-768x296.png 768w" sizes="auto, (max-width: 1126px) 100vw, 1126px" /></figure>
</div>


<p>Next, click the &#8220;Add File&#8221; button in the &#8220;Copy Files&#8221; toolbar and select your &#8220;embedded.provisionprofile&#8221; file.</p>



<p>In the associated &#8220;Inspector&#8221; panel, use the following values:</p>



<ul class="wp-block-list">
<li><strong>Name:</strong> Distribution Profile</li>



<li><strong>Applies To:</strong> Release</li>



<li><strong>Architecture:</strong> Any</li>



<li><strong>Destination:</strong> Contents Folder</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>NOTE:</strong> For Xojo iOS projects, provisioning profiles are applied automatically when building or publishing the app. This happens based on the profiles installed by Xcode when you double-click them after downloading from developer.apple.com.</p>
</blockquote>



<h2 class="wp-block-heading">App Store Connect: Creating the Record for the App</h2>



<p>You need to create an App Record for every macOS or iOS app that will be distributed through the Mac or iOS App Store. To upload an app from the Xojo IDE, it is not necessary to complete every required field in the various sections right away—you can do that at your own pace. However, you must at least have an App Record created for the app.</p>



<p>To do this, log in to &#8220;appstoreconnect.apple.com&#8221; using your developer credentials. Once logged in, select the &#8220;Apps&#8221; icon. On the next page, click the &#8220;+&#8221; button and choose &#8220;New App&#8221; to create a new App Record. The previous action will open a dialog where you need to enter the essential app information required to create the record.</p>



<ul class="wp-block-list">
<li><strong>Platforms:</strong> Select &#8220;macOS.&#8221;</li>



<li><strong>Name:</strong> Enter the same name used in your Xojo project for the app (Build Settings &gt; macOS &gt; Mac App Name). Apple can be strict about this during the app review process if the names differ, as this will also be the name displayed in the App Store listing.</li>



<li><strong>Bundle ID:</strong> Select the App ID you created for the app by following the steps in the &#8220;Handling App ID&#8221; section.</li>



<li><strong>SKU:</strong> Enter any arbitrary SKU value that makes sense to you for uniquely tracking this app.</li>



<li><strong>User Access:</strong> If you are a solo developer, the choice doesn’t make much difference. However, if you are part of a team, selecting &#8220;Limited Access&#8221; allows more control over which team members can access the app.</li>
</ul>



<p>Once you are confident with the information provided, click the &#8220;Create&#8221; button to generate the new app record.</p>



<p>If you receive an error stating that another app has already been registered with the same name, you will need to choose a different name for your app.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>NOTE:</strong> Values such as the App Name and Bundle ID can be changed later, if needed, from the &#8220;General &gt; App Information&#8221; section on the App Record page.</p>
</blockquote>



<p>Once the App Record has been created, there will be a lot of required information to fill in before the app can go through the App Store Review Process and be publicly listed in the Mac/iOS App Store upon approval. However, as mentioned earlier, you can add this information at your own pace. The most important thing right now is that, once the record is created, you have everything set up to start uploading your app builds (versions) from the Xojo IDE.</p>



<h2 class="wp-block-heading">Publishing Mac Apps From Xojo</h2>



<h4 class="wp-block-heading">&nbsp;</h4>



<h4 class="wp-block-heading">General Information</h4>



<p>Open your Xojo project in the IDE and go to Build Settings &gt; macOS. Then, make sure the correct values are set in the associated Inspector Panel for the following fields:</p>



<ul class="wp-block-list">
<li><strong>Mac App Name:</strong> This should match the name entered for the App Record on appstoreconnect.apple.com.</li>



<li><strong>Bundle Identifier:</strong> This should match the App ID created for the app.</li>



<li><strong>Category:</strong> Select the category that best fits your app from the available options.</li>
</ul>



<h4 class="wp-block-heading">App Store Connect Setup</h4>



<p>To allow the IDE to upload the app to App Store Connect, you need an app-specific password. You can add it by clicking the App Store Connect &gt; Setup button. If you have already created this app-specific password in a previous version of Xojo (under Build Settings &gt; Sign &gt; Notarization &gt; Setup), you don&#8217;t need to do it again. Also, keep in mind that this setup only needs to be done once for all your Desktop (macOS) and iOS projects.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="556" height="774" src="https://blog.xojo.com/wp-content/uploads/2025/02/AppStoreConnectSetup.png" alt="" class="wp-image-14574" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/AppStoreConnectSetup.png 556w, https://blog.xojo.com/wp-content/uploads/2025/02/AppStoreConnectSetup-216x300.png 216w" sizes="auto, (max-width: 556px) 100vw, 556px" /></figure>
</div>


<h4 class="wp-block-heading">Signing and Sandboxing</h4>



<p>Select Build Settings &gt; macOS &gt; Sign in the project browser in order to access the associated Inspector Panel:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1004" height="638" src="https://blog.xojo.com/wp-content/uploads/2025/02/21-XojoPublish-B.png" alt="" class="wp-image-14570" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/21-XojoPublish-B.png 1004w, https://blog.xojo.com/wp-content/uploads/2025/02/21-XojoPublish-B-300x191.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/21-XojoPublish-B-768x488.png 768w" sizes="auto, (max-width: 1004px) 100vw, 1004px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Developer ID:</strong> Type (or paste) the full string from the Apple Distribution certificate installed on your Mac. In this example, it is: &#8220;Apple Distribution: Francisco Javier Rodriguez Menendez (BW7PU32485)&#8221;. This certificate should match the one selected when the Distribution Provisioning Profile was created, and the Team ID (the value in parentheses) should match the one used when the App ID (Identifier) was created for the app at developer.apple.com.</li>



<li><strong>Sandboxing:</strong> Apps uploaded to App Store Connect require Sandboxing to be enabled. Turn on this option and click the associated &#8220;Edit&#8221; button to enable the necessary sandboxed features for your app. In our example, we only enabled the ability to read/write the selected user files.</li>
</ul>



<h4 class="wp-block-heading">Shared Settings</h4>



<p>Select Build Settings &gt; Shared in the project browser to access the associated Inspector Panel:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="550" height="634" src="https://blog.xojo.com/wp-content/uploads/2025/02/23-XojoPublish-D.png" alt="" class="wp-image-14564" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/23-XojoPublish-D.png 550w, https://blog.xojo.com/wp-content/uploads/2025/02/23-XojoPublish-D-260x300.png 260w" sizes="auto, (max-width: 550px) 100vw, 550px" /></figure>
</div>


<p>If you are going to publish the final (release) version of your app after it has been thoroughly tested, you will likely want to set the Stage Code value to &#8220;Final.&#8221; Additionally, make sure to enter the short version string in the Version field and the copyright information for the app in the Copyright field.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>NOTE:</strong> Did you forget something? Every time you click the Publish button (or select the equivalent &#8220;Build and Publish to App Store Connect&#8221; menu item from the Project menu), the IDE will run a &#8220;checklist.&#8221; If something needs to be set in the IDE before uploading the app to App Store Connect, any errors will be shown in the IDE&#8217;s Error Panel, pointing out &#8220;what&#8221; needs to be fixed and &#8220;where&#8221; to make the changes.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2110" height="472" src="https://blog.xojo.com/wp-content/uploads/2025/02/macOS-Error-Panel.png" alt="" class="wp-image-14565" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/macOS-Error-Panel.png 2110w, https://blog.xojo.com/wp-content/uploads/2025/02/macOS-Error-Panel-300x67.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/macOS-Error-Panel-1024x229.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/macOS-Error-Panel-768x172.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/macOS-Error-Panel-1536x344.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/02/macOS-Error-Panel-2048x458.png 2048w" sizes="auto, (max-width: 2110px) 100vw, 2110px" /></figure>
</div></blockquote>



<h4 class="wp-block-heading">App Icon</h4>



<p>Nothing new here, apart from building your macOS app for regular or &#8220;web-based&#8221; distribution. Your app needs an icon in the required sizes. However, when it comes to publishing to the Mac/iOS App Store, this requirement is even more strict. Xojo will catch this before starting the app building process to save you time spent on compilation and uploading. So, make sure you add all the required icon sizes by selecting the App item in the project browser, then clicking the Appearance &gt; Icon option in the associated Inspector Panel.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1162" height="838" src="https://blog.xojo.com/wp-content/uploads/2025/02/24-XojoPublish-E.png" alt="" class="wp-image-14571" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/24-XojoPublish-E.png 1162w, https://blog.xojo.com/wp-content/uploads/2025/02/24-XojoPublish-E-300x216.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/24-XojoPublish-E-1024x738.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/24-XojoPublish-E-768x554.png 768w" sizes="auto, (max-width: 1162px) 100vw, 1162px" /></figure>
</div>


<p>That action will open the Icon Editor, where you can drag and drop the different icon files for each size or paste them directly from your preferred image editor.</p>



<h2 class="wp-block-heading">Publishing!</h2>



<p>Click the Publish button. Once the &#8220;checklist&#8221; passes without any errors, a confirmation dialog will appear. Click the &#8220;OK&#8221; button to begin the process and upload your app&#8217;s new build to App Store Connect.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="558" height="140" src="https://blog.xojo.com/wp-content/uploads/2025/02/PublishButton.png" alt="" class="wp-image-14566" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/PublishButton.png 558w, https://blog.xojo.com/wp-content/uploads/2025/02/PublishButton-300x75.png 300w" sizes="auto, (max-width: 558px) 100vw, 558px" /></figure>
</div>


<p>If everything goes smoothly, you will see a &#8220;Success&#8221; dialog at the end of the process. However, if there is an error during any of the steps, an error message dialog will provide more details about the issue, and the process will be interrupted, returning you to the IDE.</p>



<p>In either case—whether your new app build was successfully uploaded to App Store Connect or not—you can find the generated Log file in the same folder as the built app. If there are errors, you can open the Log file to review the information about the issue(s), which will help you resolve them before trying again. For example:</p>



<pre class="wp-block-preformatted">2025-01-23 12:54:35.030 *** Error: [ContentDelivery.Uploader.6000028E01C0] The provided entity includes an attribute with a value that has already been used (-19232) The bundle version must be higher than the previously uploaded version: ‘1.0.6’. (ID: d422b9bf-049f-4263-af43-8357c2fe5f00)</pre>



<p>In this case, the Log file entry indicates that we tried to publish a build with the same version number as an already uploaded build on App Store Connect. If this new build includes changes or new features, the way to fix this issue is simply by increasing the version number (and the short version string) before publishing it.</p>



<h2 class="wp-block-heading">Testing with TestFlight</h2>



<p>When you create a new app record in App Store Connect and access it, one of the tabs at the top of the page is named &#8220;TestFlight.&#8221; Click on it, and you will see all the uploaded builds of your app that are eligible for testing.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2348" height="1164" src="https://blog.xojo.com/wp-content/uploads/2025/02/25-TestFlight.png" alt="" class="wp-image-14567" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/25-TestFlight.png 2348w, https://blog.xojo.com/wp-content/uploads/2025/02/25-TestFlight-300x149.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/25-TestFlight-1024x508.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/25-TestFlight-768x381.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/25-TestFlight-1536x761.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/02/25-TestFlight-2048x1015.png 2048w" sizes="auto, (max-width: 2348px) 100vw, 2348px" /></figure>



<p>As you can see, there is a warning icon next to the app build we just uploaded (A). This is because Apple requires additional information from you regarding the app&#8217;s compliance with Encryption Export Regulations. To provide this information, click the associated &#8220;Manage&#8221; link to access the dialog where you can make your choice about it.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1406" height="964" src="https://blog.xojo.com/wp-content/uploads/2025/02/26-TestFlight-B.png" alt="" class="wp-image-14568" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/26-TestFlight-B.png 1406w, https://blog.xojo.com/wp-content/uploads/2025/02/26-TestFlight-B-300x206.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/26-TestFlight-B-1024x702.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/26-TestFlight-B-768x527.png 768w" sizes="auto, (max-width: 1406px) 100vw, 1406px" /></figure>
</div>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>TIP</strong>: Use the new Property List Editor in Xojo’s IDE and add the following Key/Value pair to avoid manually going through the Encryption Export Regulations compliance process:</p>



<ul class="wp-block-list">
<li><strong>Key:</strong> ITSAppUsesNonExemptEncryption</li>



<li><strong>Value:</strong> False</li>
</ul>
</blockquote>



<p>Once the requirement has been completed, the build status will change to &#8220;Ready to Submit.&#8221; As you can see, it also indicates that this build will be available to your testers for the next 90 days before expiring. This should be enough time before you send new test builds to them, anyway.</p>



<p>For each of your apps, you can create as many tester groups as needed. By default, there is only one entry: &#8220;Internal Testing.&#8221; You can create additional groups and add any members of your Apple Development Team to the groups you create. Click on the &#8220;+&#8221; icon to create your first group.</p>



<ul class="wp-block-list">
<li>Give the new group a name and uncheck the &#8220;Enable automatic distribution&#8221; checkbox. Then, click the &#8220;Create&#8221; button.</li>



<li>Once the new internal testing group is created, you will be able to assign any uploaded (and not expired) builds of your app to it. You can also add members to the group (remember, these should be members of your Apple Developer Team!).</li>
</ul>



<p>However, having internal testing groups might not be very helpful if you are a solo developer or part of a small team. The good news is that once you create the first, mandatory internal group, a new option will be added to the TestFlight sidebar.</p>



<h4 class="wp-block-heading">External Testing</h4>



<p>In this case, you will be able to invite up to 10,000 members to test your app. The main difference compared to internal groups is that once you select a build to be tested in any of the external groups, it must go through the Beta App Review process. This means the build won&#8217;t be immediately available to your testers until the review is complete. However, this process is only required for the first build—subsequent builds will be available immediately, just like in internal groups.</p>



<p>When inviting members to an external group, you have several options: you can create and share a public link, manually add testers, or even import them from a .csv file.</p>



<p>In any case, your testers will be able to download, install, and begin testing your app, as well as provide feedback!</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2024" height="1386" src="https://blog.xojo.com/wp-content/uploads/2025/02/TestFlightInstallApp.png" alt="" class="wp-image-14569" srcset="https://blog.xojo.com/wp-content/uploads/2025/02/TestFlightInstallApp.png 2024w, https://blog.xojo.com/wp-content/uploads/2025/02/TestFlightInstallApp-300x205.png 300w, https://blog.xojo.com/wp-content/uploads/2025/02/TestFlightInstallApp-1024x701.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/02/TestFlightInstallApp-768x526.png 768w, https://blog.xojo.com/wp-content/uploads/2025/02/TestFlightInstallApp-1536x1052.png 1536w" sizes="auto, (max-width: 2024px) 100vw, 2024px" /></figure>



<h2 class="wp-block-heading">In Summary</h2>



<p>The new Publish feature simplifies the process of submitting your macOS and iOS apps to App Store Connect, making them available on the Mac App Store and iOS App Store directly from the IDE, without needing any external apps (such as Transporter).</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Provisioning Profiles for macOS Apps</title>
		<link>https://blog.xojo.com/2025/01/30/provisioning-profiles-for-macos-apps/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Thu, 30 Jan 2025 15:22:00 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[App Development]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App Store Connect]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[Mac App Store]]></category>
		<category><![CDATA[Native App Development]]></category>
		<category><![CDATA[Xcode]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14405</guid>

					<description><![CDATA[Continuing our series on distributing Mac apps, this post will take you through properly setting up a provisioning profile, which is required for your apps&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Continuing our series on distributing Mac apps, this post will take you through properly setting up a <a href="https://developer.apple.com/help/account/manage-profiles/create-a-development-provisioning-profile/" target="_blank" rel="noreferrer noopener">provisioning profile</a>, which is required for your apps to get tested by others in <a href="https://developer.apple.com/testflight/" target="_blank" rel="noreferrer noopener">TestFlight</a>. To review or catch up on earlier steps in this process, see my posts on <a href="https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/" target="_blank" rel="noreferrer noopener">Sandboxing, Hardened Runtime and Notarization arrives to the Xojo IDE</a>, <a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/" target="_blank" rel="noreferrer noopener">macOS Apps: From Sandboxing to Notarization, The Basics</a> and <a href="https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/" target="_blank" rel="noreferrer noopener">Uploading macOS Builds to App Store Connect</a>. But if you have those steps done, let&#8217;s set up the provisioning profile you need.</p>



<span id="more-14405"></span>



<h2 class="wp-block-heading">Development or Distribution</h2>



<p>There are two types of provisioning profiles: Development and Distribution. Development provisioning profiles are for builds sent to the AppStore Connect service that are not meant to be available on the Mac App Store. Development profiles allow apps to be tested by the eligible users associated with that app in TestFlight. For Development provisioning profiles, set the Stage Code value (under Build Settings &gt; Shared) to &#8220;Development&#8221;, &#8220;Alpha&#8221; or &#8220;Beta&#8221;.</p>



<p>On the other hand, Distribution provisioning profiles for macOS are required for builds meant to be publicly available on the Mac App Store once approved by the <a href="https://developer.apple.com/distribute/app-review/" target="_blank" rel="noreferrer noopener">App Store Reviewing Process</a>, they are also available for TestFlight. For Distribution provisioning profiles, make sure the Stage Code value is set to &#8220;Final&#8221; under Build Settings &gt; Shared.</p>



<h2 class="wp-block-heading">Creating Provisioning Profiles</h2>



<p>Regardless of which type of provisioning profile you are creating, you&#8217;ll need to do it from the Apple Developer website (using  your paid developer membership).</p>



<p>In this example we will create a Distribution provisioning profile.</p>



<ul class="wp-block-list">
<li>Login into the <a href="https://developer.apple.com" target="_blank" rel="noreferrer noopener">Apple Developer Website</a>.</li>



<li>Select the Profiles option found under the &#8220;Certificates, IDs &amp; Profiles&#8221; section.</li>



<li>Click on the &#8220;+&#8221; icon found next to the &#8220;Profiles&#8221; header.</li>



<li>Next, select the &#8220;Mac AppStore Connect&#8221; option under the Distribution section, and click on the &#8220;Continue&#8221; button.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2489" height="1595" src="https://blog.xojo.com/wp-content/uploads/2025/01/1-TypeOfProfile.png" alt="" class="wp-image-14406" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/1-TypeOfProfile.png 2489w, https://blog.xojo.com/wp-content/uploads/2025/01/1-TypeOfProfile-300x192.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/1-TypeOfProfile-1024x656.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/1-TypeOfProfile-768x492.png 768w, https://blog.xojo.com/wp-content/uploads/2025/01/1-TypeOfProfile-1536x984.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/01/1-TypeOfProfile-2048x1312.png 2048w" sizes="auto, (max-width: 2489px) 100vw, 2489px" /></figure>
</div>


<ul class="wp-block-list">
<li>Select the &#8220;Mac&#8221; option under the Profile Type section, and select the App ID value from those available in the associated Popup menu. Make sure that the chosen one (without the value between parentheses) matches the one entered under Build Settings &gt; macOS &gt; Bundle Identifier. Then, click on the &#8220;Continue&#8221; button.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2358" height="731" src="https://blog.xojo.com/wp-content/uploads/2025/01/2-SelectAppID.png" alt="" class="wp-image-14407" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/2-SelectAppID.png 2358w, https://blog.xojo.com/wp-content/uploads/2025/01/2-SelectAppID-300x93.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/2-SelectAppID-1024x317.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/2-SelectAppID-768x238.png 768w, https://blog.xojo.com/wp-content/uploads/2025/01/2-SelectAppID-1536x476.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/01/2-SelectAppID-2048x635.png 2048w" sizes="auto, (max-width: 2358px) 100vw, 2358px" /></figure>
</div>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>For example the selected one in the screenshot (that, is BW7PU32485.com.aprendexojo.vcardtoqr), matches the one used as the Bundle Identifier for the app in the Xojo IDE (com.aprendexojo.vcardtoqr).</p>
</blockquote>



<ul class="wp-block-list">
<li>Next, select the &#8220;Distribution&#8221; Certificate to be included in the generated provisioning profile. The one selected must be the same one entered in the Developer ID field when building the App from the Xojo IDE (Build Settings &gt; macOS &gt; Sign). For example, I&#8217;m going to use the value (without the quotes) &#8220;Apple Distribution: Francisco Javier Rodriguez Menendez (BW7PU32485)&#8221; as the Developer ID value in Xojo, so I&#8217;m selecting that same Distribution certificate here. Next, click the &#8220;Continue&#8221; button.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2377" height="564" src="https://blog.xojo.com/wp-content/uploads/2025/01/3-SelectCertificate.png" alt="" class="wp-image-14408" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/3-SelectCertificate.png 2377w, https://blog.xojo.com/wp-content/uploads/2025/01/3-SelectCertificate-300x71.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/3-SelectCertificate-1024x243.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/3-SelectCertificate-768x182.png 768w, https://blog.xojo.com/wp-content/uploads/2025/01/3-SelectCertificate-1536x364.png 1536w, https://blog.xojo.com/wp-content/uploads/2025/01/3-SelectCertificate-2048x486.png 2048w" sizes="auto, (max-width: 2377px) 100vw, 2377px" /></figure>
</div>


<ul class="wp-block-list">
<li>Name the provisioning profile using a significative name, so you can easily distinguish it later among the many available ones. Next, click the &#8220;Generate&#8221; button so the provisioning profile is generated and downloaded to your local Mac disk (probably in the Downloads folder).</li>



<li>The downloaded provisioning profile will have the name you entered in the previous step. Select it and use the Finder options to rename it as &#8220;embedded.provisionprofile&#8221;.</li>
</ul>



<h2 class="wp-block-heading">Adding the Provisioning Profile to the Project</h2>



<p>macOS provisioning profiles need to be added to the Contents folder on the app bundle, and that is easy to do from the Xojo IDE!</p>



<ul class="wp-block-list">
<li>Open your project in the Xojo IDE and add a new Copy Files build step under Build Settings &gt; MacOS.</li>



<li>Add the &#8220;embedded.provisionprofile&#8221; file to the just added CopyFile build step.</li>



<li>Select the &#8220;Contents Folder&#8221; option from the Destination popup menu in the associated Inspector Panel for the Copy Files build step.</li>



<li>Select the &#8220;Release&#8221; option from the &#8220;Applies To&#8221; popup menu in the associated Inspector Panel for the Copy Files build step, so only this file is copied to the Contents folder when the app is built as a standalone app.</li>
</ul>



<h2 class="wp-block-heading">Adding New Entries to the Entitlements File</h2>



<p>In order for the provisioning profile to be recognized by TestFlight when the app package is sent to AppStore Connect, we need to add a couple more entries to the Entitlements file (see &#8220;<a href="https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/" target="_blank" rel="noreferrer noopener">Uploading macOS Builds to App Store Connect</a>&#8221; for more details on the Entitlements file).</p>



<ul class="wp-block-list">
<li><strong>Full Application Identifier</strong>. Use the &#8220;com.apple.application-identifier&#8221; as the Key for the entry. The value should be the Application Bundle Identifier (in our example com.aprendexojo.vcardtoqr) prefixed with the Team ID value of the Certificate we used both for signing our app and the provisioning profile itself. In this example it is BW7PU32485, making the string value for this key BW7PU32485.com.aprendexojo.vcardtoqr</li>



<li><strong>Team ID</strong>. Use &#8220;com.apple.developer.team-identifier&#8221; as the Key for the entry, while the value (following with our example) is just the Team ID from the certificate: BW7PU32485</li>
</ul>



<p>All in all, the final Entitlements file will look like this:</p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
	&lt;key&gt;com.apple.security.app-sandbox&lt;/key&gt;
	&lt;true/&gt;
	&lt;key&gt;com.apple.security.files.user-selected.read-write&lt;/key&gt;
	&lt;true/&gt;
	&lt;key&gt;com.apple.application-identifier&lt;/key&gt;
	&lt;string&gt;BW7PU32485.com.aprendexojo.vcardtoqr&lt;/string&gt;
	&lt;key&gt;com.apple.developer.team-identifier&lt;/key&gt;
	&lt;string&gt;BW7PU32485&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;</code></pre>



<p>That is: Sandboxing enabled, plus the ability for the app to read/write the selected user files, plus the two new entries required so the provisioning profile is recognized by TestFlight when the package is submitted to the AppStore Connect.</p>



<p>Save the changes to the modified Entitlements file (in our example named as &#8220;myEntitlements.entitlements&#8221;).</p>



<h2 class="wp-block-heading">Resign, Re-Package, and Uploading</h2>



<p>If you followed the two previous blog posts in this series, you may have already guessed the next step! Yep, because we modified our &#8220;myEntitlements.entitlements&#8221; file, we need to re-sign the app bundle, package it and submit it to AppStore Connect.</p>



<p>So for re-signing, type the following in a new Terminal window:</p>



<pre class="wp-block-code"><code>codesign --force --timestamp --entitlements path-to-your-myEntitlements.entitlements-file  -s "Apple Distribution: whatever-name-you-use (BZXXXXXXX)" path-to-the-bundle-of-the-compiled-app.app</code></pre>



<p>In order to create a package from the bundle, issue this command from the Terminal:</p>



<pre class="wp-block-code"><code>productbuild --sign "3rd Party Mac Developer Installer: whatever-name-you-use (BZXXXXXXX)"  --component path-to-the-bundle-of-the-compiled-app.app  /Applications path-to-the-generated-package-file.pkg</code></pre>



<p>And in order to upload the package to the AppStore Connect, type the following command in a Terminal window:</p>



<pre class="wp-block-code"><code>xcrun altool  --upload-package path-to-the-package-file.pkg -u your-apple-developer-login-id-goes-here -p "your-app-specific-password-goes-here" --type osx -apple-id "6111111111" --bundle-id "com.yourcomany.yourIdentifier" --bundle-short-version-string "current-short-value" --bundle-version "current-version-value"</code></pre>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1970" height="270" src="https://blog.xojo.com/wp-content/uploads/2025/01/4-AddedToTestFlight.png" alt="" class="wp-image-14410" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/4-AddedToTestFlight.png 1970w, https://blog.xojo.com/wp-content/uploads/2025/01/4-AddedToTestFlight-300x41.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/4-AddedToTestFlight-1024x140.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/4-AddedToTestFlight-768x105.png 768w, https://blog.xojo.com/wp-content/uploads/2025/01/4-AddedToTestFlight-1536x211.png 1536w" sizes="auto, (max-width: 1970px) 100vw, 1970px" /></figure>
</div>


<p>If everything went OK, open your Internet Browser and go to <a href="http://appstoreconnect.apple.com">http://appstoreconnect.apple.com</a>, select your app record from the Apps section and click on the TestFlight tab. You should be able to see the just submitted build ready for testing!</p>



<h2 class="wp-block-heading">In Summary</h2>



<p>As you see, adding provisioning profiles to macOS apps sent to the AppStore Connect website to be tested by in TestFlight, requires a bit of previous preparation for the provisioning profile generation itself, copying the file to the project using a Copy Files build step and, then, adding a couple more entries to the Entitlements file.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="2048" height="1422" src="https://blog.xojo.com/wp-content/uploads/2025/01/5-macOSTestFlightApp.png" alt="" class="wp-image-14409" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/5-macOSTestFlightApp.png 2048w, https://blog.xojo.com/wp-content/uploads/2025/01/5-macOSTestFlightApp-300x208.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/5-macOSTestFlightApp-1024x711.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/5-macOSTestFlightApp-768x533.png 768w, https://blog.xojo.com/wp-content/uploads/2025/01/5-macOSTestFlightApp-1536x1067.png 1536w" sizes="auto, (max-width: 2048px) 100vw, 2048px" /></figure>
</div>


<p>Once everything this is done, your testers will be able to use the TestFlight app to download and test your builds and report feedback, crash reports and other information about it!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>More in this series on distributing Mac apps:</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/" target="_blank" rel="noreferrer noopener">Sandboxing, Hardened Runtime and Notarization arrives to the Xojo IDE</a></li>



<li><a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/" target="_blank" rel="noreferrer noopener">macOS Apps: From Sandboxing to Notarization, The Basics</a></li>



<li><a href="https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/" target="_blank" rel="noreferrer noopener">Uploading macOS Builds to App Store Connect</a></li>



<li><a href="https://blog.xojo.com/2025/01/30/provisioning-profiles-for-macos-apps/">Provisioning Profiles for macOS Apps</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Uploading macOS Builds to App Store Connect</title>
		<link>https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 14 Jan 2025 20:53:32 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[App Development]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App Store Connect]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[Mac App Store]]></category>
		<category><![CDATA[Native App Development]]></category>
		<category><![CDATA[Xcode]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=14314</guid>

					<description><![CDATA[Since Xojo 2024r4 the IDE includes the ability to automatically compile macOS apps with Sandboxing, Hardened Runtime and Notarization. Continue reading to learn that extra&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Since Xojo 2024r4 the IDE includes the ability to automatically compile macOS apps with Sandboxing, Hardened Runtime and Notarization. Continue reading to learn that extra step in order to submit the created bundle directly to the App Store Connect website!</p>



<span id="more-14314"></span>



<p>There is a Xojo-made tool out there that can simplify the process, and if that&#8217;s your route, check out <a href="https://xojo.com/store/addons/ohanaware.php" target="_blank" rel="noreferrer noopener">AppWrapper from Ohanaware</a>. But if you are the kind of developer that enjoys &#8220;how things work under the hood&#8221;, then follow these steps to do it manually from the command line (or convert these instructions into Xojo Scripts that can be executed as part of the build process itself from the Xojo project).</p>



<p>There are some requirements for all of this to work, but you took care of them already if you already followed our <a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/">previous post about how to apply Sandboxing, Hardened Runtime and Notarize</a> manually to your Xojo macOS builds. Perhaps, the most important one is that this requires a paid Apple Developer Program membership (around US $99/yr). Additionally, Xcode needs to be installed on your Mac in order to use its included <em>altool</em> and <em>productbuild</em> command line tools. Create an app-specific password in order to execute the <em>notarytool</em> command line tool, which is also required when using the <em>altool</em> command line. You likely created one already for the <em>notarytool</em> command line tool which you can use as the password required by the <em>altool</em> command line tool.</p>



<p>If distributing your macOS apps from your website, these need to be signed using the &#8220;Apple Development&#8221; Certificate, but if you are compiling a macOS app for distribution through the Mac App Store, you need to sign it using the &#8220;Apple Distribution&#8221; certificate. So make sure to fill-in the macOS &gt; Signing &gt; Developer ID field properly.</p>



<p>Also important, in order to upload the app to App Store Connect, you need to create a package file from the app bundle, and that package file (.pkg) needs to be signed using the &#8220;3rd Party Mac Developer Installer&#8221;. Make sure you have this certificate installed in your Mac Keychain.</p>



<h2 class="wp-block-heading">First things … First</h2>



<p>Before you can upload you .pkg file to the App Store Connect website, there are some things you need to take care of that are required by Apple for apps to be distributed through the Mac App Store.</p>



<ol class="wp-block-list">
<li>The first thing is to register an App ID (or Identifier) in the <a href="https://developer.apple.com/account/resources/identifiers/">Apple Developer Portal</a>. When doing it, make sure you are creating an explicit Identifier instead of a wildcard one. Also very important, make sure that the identifier (in the reversed DNS form) is the same one you are using in the field macOS &gt; Build &gt; Bundle Identifier of your Xojo project. If they don&#8217;t match, then you can expect errors throughout the process.</li>



<li>The second thing is to create a new record for the App itself in the App Store Connect website. This is the place where you need to provide all the information requested by Apple for two main things: 1. what will be available as the app information when the users reach your app in the Mac App Store (for example product description, price, images, etc.), and, 2. what is for internal and compliance use. All in all, make sure you create a new macOS app record and go through all the available sections to fill in the requested information.</li>
</ol>



<p>Once these two steps are completed, we can focus on the command line itself to create the .pkg file and upload it manually (optionally, it is possible to use the Transporter app to select the .pkg file and upload it).</p>



<h2 class="wp-block-heading">Sing, sing, sing … the re-signing song!</h2>



<p>When building the macOS app from the Xojo IDE, it will be correctly signed based on the settings selected in the Build Settings &gt; Sign section. But because of the way Apple requires some entries to be formatted (specifically those for the CFBundleShortVersionString and CFBundleVersion keys), and the fact that it also requires the LSApplicationCategoryType key to be present in the Plist file with the associated value (the app category value <a href="https://developer.apple.com/documentation/bundleresources/information-property-list/lsapplicationcategorytype?language=objc">among those you can find here</a>), we need to manually edit the generated Info.Plist file for the compiled app.</p>



<p>Yeah, sure we can create an additional text file named Info.Plist file with the appropriate/expected keys and values and drop such file in the IDE navigator for our project so this information gets added/modified, as for example this one:</p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
	&lt;key&gt;CFBundleShortVersionString&lt;/key&gt;
	&lt;string&gt;1.0.0&lt;/string&gt;
	&lt;key&gt;CFBundleVersion&lt;/key&gt;
	&lt;string&gt;1.0.0&lt;/string&gt;
	&lt;key&gt;LSApplicationCategoryType&lt;/key&gt;
	&lt;string&gt;public.app-category.business&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;</code></pre>



<p>The bad news is that the value for the CFBundleVersion key will not be replaced with the one from our Info.Plist file.</p>



<p>What&#8217;s the downside of manually editing the Info.Plist file for the already compiled app? Well, as soon you make a change and save it,&nbsp;the app bundle signature will be invalidated. But no fear!&nbsp;We know how to do it already, right? If not, I suggest you to <a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/">take a look to the blog post about Sandboxing</a>, Hardened Runtime and Notarization for macOS apps that I mentioned earlier.</p>



<p>Go ahead, select your compiled app in the Finder, click on its icon and select the option &#8220;Show package Contents&#8221; from the contextual menu. This action will show the &#8220;inner files&#8221; of the bundle that composes your app. Inside the Contents folder you will see the Info.Plist file. Click on it and select the option from the contextual menu allowing you to edit it with the text editor of your preference (mine is to use <a href="https://www.barebones.com/products/bbedit/index.html">BBEdit</a> from BareBones Software).</p>



<ul class="wp-block-list">
<li>Locate the CFBundleVersion key entry and change its string value so it doesn&#8217;t have more than three numbers separated by the dot character (as shown in the previous Plist example file).</li>



<li>Locate the CFBundleShortVersionString and change its string to make sure it has three version numbers separated by the dot character.</li>
</ul>



<p>Of course for both of the previous keys, make sure these match your expected version numbers for the app! In the example I used 1.0.0 as it&#8217;s typical for the initial release of an app.</p>



<p>Next, add the expected LSApplicationCategoryType key with the value that better fits your app among those available at the <a href="https://developer.apple.com/documentation/bundleresources/information-property-list/lsapplicationcategorytype?language=objc">Apple Documentation website</a>. In the previous Plist file example I&#8217;m using the one for the Business category:</p>



<pre class="wp-block-code"><code>	&lt;key&gt;LSApplicationCategoryType&lt;/key&gt;
	&lt;string&gt;public.app-category.business&lt;/string&gt;</code></pre>



<p>Save the changes to our modified Info.Plist file. Now it is time to sign it again!</p>



<h2 class="wp-block-heading">What about the Entitlements?</h2>



<p>Heh… wait! Because we need to re-sign our app bundle again, we also need to attach the expected entitlements to it! That means at least one very-important-and-required entitlement: enabling Sandboxing, which needs to be done to any app sent for distribution through the Mac App Store.</p>



<p>While Xojo 2024r4+ is able to do it automatically when building the app, now we also need to do it manually. That means creating our own .entitlements file that will be used when re-signing the app. For example, for a very typical (and bare-bones) app that only needs to read and write files it would look like this:</p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
	&lt;key&gt;com.apple.security.app-sandbox&lt;/key&gt;
	&lt;true/&gt;
	&lt;key&gt;com.apple.security.files.user-selected.read-write&lt;/key&gt;
	&lt;true/&gt;
&lt;/dict&gt;
&lt;/plist&gt;</code></pre>



<p>Save it as &#8220;myEntitlements.entitlements&#8221; to your Mac drive. Of course, if you app requires more entitlements, go ahead and add them to the previous &#8220;template&#8221; .entitlements file.</p>



<p>We now have our modified .Plist file and the required .Entitlements file… so we have everything we need to re-sign the app bundle again!</p>



<p>Open a Terminal window and type the following command:</p>



<pre class="wp-block-code"><code>codesign --force --timestamp --entitlements path-to-your-myEntitlements.entitlements-file  -s "Apple Distribution: whatever-name-you-use (BZXXXXXXX)" path-to-the-bundle-of-the-compiled-app.app</code></pre>



<p>Look how we are using the reference to the entitlements file, and the &#8220;Apple Distribution&#8221; certificate instead of the &#8220;Apple Development&#8221; certificate.</p>



<h2 class="wp-block-heading">Packaging Acme</h2>



<p>So far so good. We have our app bundle signed again, so we are ready now to create a .pkg file from it! All you need to do is to type the following command from a Terminal window:</p>



<pre class="wp-block-code"><code>productbuild --sign "3rd Party Mac Developer Installer: whatever-name-you-use (BZXXXXXXX)"  --component path-to-the-bundle-of-the-compiled-app.app  /Applications path-to-the-generated-package-file.pkg</code></pre>



<p>As you can see, we are using the &#8220;3rd Party Mac Developer Installer&#8221; certificate in order to create the package file.</p>



<h2 class="wp-block-heading">Uploading it!</h2>



<p>With the package file already created, we now have all we need to upload it to the App Store Connect website. At this point you can follow two paths. The first one is to use the Transporter App that you can download from the Mac App Store itself. In that case:</p>



<ul class="wp-block-list">
<li>Open the Transporter app.</li>



<li>Click on the &#8220;+&#8221; icon. That action will bring a dialog where you can select the previously created .pkg file.</li>



<li>Once it is added, Transporter will make some early checks on the package contents. If everything goes OK, you should see something like this:</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1824" height="1420" src="https://blog.xojo.com/wp-content/uploads/2025/01/TransporterA.png" alt="" class="wp-image-14320" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/TransporterA.png 1824w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterA-300x234.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterA-1024x797.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterA-768x598.png 768w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterA-1536x1196.png 1536w" sizes="auto, (max-width: 1824px) 100vw, 1824px" /></figure>
</div>


<p>The interesting thing about using Transporter is that you can select the &#8220;Verify&#8221; option from the associated contextual menu (the one with the three dots icon). That action will start some more deeply checking on the package (and its contents) so you can get some early information about things that need to be fixed prior uploading it to the App Store Connect Website. For example, this error generated when the bundle version is duplicated:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1824" height="1420" src="https://blog.xojo.com/wp-content/uploads/2025/01/TransporterB.png" alt="" class="wp-image-14333" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/TransporterB.png 1824w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterB-300x234.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterB-1024x797.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterB-768x598.png 768w, https://blog.xojo.com/wp-content/uploads/2025/01/TransporterB-1536x1196.png 1536w" sizes="auto, (max-width: 1824px) 100vw, 1824px" /></figure>
</div>


<p>The second option involves using the aforementioned <em>altool</em> command line to automatically upload the package to the App Store Connect website. If you choose this path, all you need to do is to execute the following command from a Terminal window:</p>



<pre class="wp-block-code"><code>xcrun altool  --upload-package path-to-the-package-file.pkg -u your-apple-developer-login-id-goes-here -p "your-app-specific-password-goes-here" --type osx -apple-id "6111111111" --bundle-id "com.yourcomany.yourIdentifier" --bundle-short-version-string "1.0.0" --bundle-version "1.0.0"     </code></pre>



<p>Some considerations about the provided options/values for this command:</p>



<ul class="wp-block-list">
<li><strong>-u</strong>: This is the login name you use when accessing the Apple Developer website</li>



<li><strong>-p</strong>: This is the app-specific password you created from scratch following the steps provided in the aforementioned blog post.</li>



<li><strong>-apple-id</strong>: This is the numeric value you can find under General &gt; App Information at the appstoreconnect.apple.com website for the record created for this app:</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1358" height="788" src="https://blog.xojo.com/wp-content/uploads/2025/01/AppStoreConnectA.png" alt="" class="wp-image-14321" srcset="https://blog.xojo.com/wp-content/uploads/2025/01/AppStoreConnectA.png 1358w, https://blog.xojo.com/wp-content/uploads/2025/01/AppStoreConnectA-300x174.png 300w, https://blog.xojo.com/wp-content/uploads/2025/01/AppStoreConnectA-1024x594.png 1024w, https://blog.xojo.com/wp-content/uploads/2025/01/AppStoreConnectA-768x446.png 768w" sizes="auto, (max-width: 1358px) 100vw, 1358px" /></figure>
</div>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>This information can also be retrieved using:</p>



<pre class="wp-block-code"><code>xcrun altool --list-apps -u your-apple-developer-login-id-goes-here -p "your-app-specific-password-goes-here" --output-format json</code></pre>
</blockquote>



<ul class="wp-block-list">
<li><strong>&#8211;bundle-id</strong>: Make sure to provide the same value as the one used when creating the Identifier for the App and, thus, the same one used under Build Settings &gt; macOS &gt; Build &gt; Build Identifier field in your Xojo project.</li>



<li><strong>&#8211;bundle-short-version-string</strong>: Make sure it&#8217;s the same value used for the CFBundleShortVersionString key in the .Plist file.</li>



<li><strong>&#8211;bundle-version</strong>: Make sure to provide the same value as the one used for the CFBundleVersion key in the .Plist file.</li>
</ul>



<p>Once the command is executed, your package file will be uploaded to the App Store Connect website and, once completed, eligible as a new Build to be added to your app record so you can send it to review as part of the Apple reviewing process.</p>



<h2 class="wp-block-heading">In Summary</h2>



<p>There are several details to take care of, but Xojo has simplified the process of covering the &#8220;last mile&#8221; of sending you compiled app for review at the App Store Connect website.</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>More in this series on distributing Mac apps:</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/" target="_blank" rel="noreferrer noopener">Sandboxing, Hardened Runtime and Notarization arrives to the Xojo IDE</a></li>



<li><a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/" target="_blank" rel="noreferrer noopener">macOS Apps: From Sandboxing to Notarization, The Basics</a></li>



<li><a href="https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/" target="_blank" rel="noreferrer noopener">Uploading macOS Builds to App Store Connect</a></li>



<li><a href="https://blog.xojo.com/2025/01/30/provisioning-profiles-for-macos-apps/">Provisioning Profiles for macOS Apps</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sandboxing, Hardened Runtime and Notarization arrives to the Xojo IDE</title>
		<link>https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 10 Dec 2024 16:37:15 +0000</pubDate>
				<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[2024r4]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Hardened Runtime]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Mac App Store]]></category>
		<category><![CDATA[Notarization]]></category>
		<category><![CDATA[Sandboxing]]></category>
		<category><![CDATA[Xcode]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13966</guid>

					<description><![CDATA[Starting with Xojo 2024r4 it is possible to apply Sandboxing, Hardened Runtime and Notarization on macOS apps built from the Xojo IDE on macOS and&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Starting with Xojo 2024r4 it is possible to apply Sandboxing, Hardened Runtime and Notarization on macOS apps built from the Xojo IDE on macOS and Windows.</p>



<span id="more-13966"></span>



<p>These new options are available in the Inspector Panel when selecting the Sign step available under Build Settings &gt; macOS.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="604" height="626" src="https://blog.xojo.com/wp-content/uploads/2024/10/Sign-SandboxingOptions.png" alt="" class="wp-image-13967" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/Sign-SandboxingOptions.png 604w, https://blog.xojo.com/wp-content/uploads/2024/10/Sign-SandboxingOptions-289x300.png 289w" sizes="auto, (max-width: 604px) 100vw, 604px" /></figure>
</div>


<h2 class="wp-block-heading">Requirements</h2>



<p>In order to apply Sandboxing, Hardened Runtime and go through the Notarization process for your macOS app, you will need to make sure that the following is installed on your Mac:</p>



<ul class="wp-block-list">
<li>macOS 11.3 or later.</li>



<li>Xcode 13 or later &#8211; Run it at least one time and make sure that all its required components and SDKs are installed.</li>



<li>Apple Developer ID &#8211; This needs to be a paid Apple Developer membership. Also, make sure you have your Developer certificates installed in the Mac.</li>



<li>A working Internet connection.</li>
</ul>



<h2 class="wp-block-heading">Sandboxing</h2>



<p>With the Sandboxing switch enabled, you can access the associated editor in order to enable the appropriate entitlements for the purposes of the app.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1012" height="1252" src="https://blog.xojo.com/wp-content/uploads/2024/10/Sandboxing-Editor.png" alt="" class="wp-image-13968" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/Sandboxing-Editor.png 1012w, https://blog.xojo.com/wp-content/uploads/2024/10/Sandboxing-Editor-242x300.png 242w, https://blog.xojo.com/wp-content/uploads/2024/10/Sandboxing-Editor-828x1024.png 828w, https://blog.xojo.com/wp-content/uploads/2024/10/Sandboxing-Editor-768x950.png 768w" sizes="auto, (max-width: 1012px) 100vw, 1012px" /></figure>
</div>


<p>The Sandboxing settings will be applied even when the app is run from the IDE (debug mode). That means that Sandboxing can be applied both using an Ad-Hoc Certificate or the user Developer ID Application Certificate.</p>



<h2 class="wp-block-heading">Hardened Runtime</h2>



<p>When the Hardened Runtime switch is enabled, you will be able to access the associated editor in order to set the appropriate hardening entitlements for the purposes of the app.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1140" height="1400" src="https://blog.xojo.com/wp-content/uploads/2024/10/HardenedRuntime-Editor.png" alt="" class="wp-image-13969" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/HardenedRuntime-Editor.png 1140w, https://blog.xojo.com/wp-content/uploads/2024/10/HardenedRuntime-Editor-244x300.png 244w, https://blog.xojo.com/wp-content/uploads/2024/10/HardenedRuntime-Editor-834x1024.png 834w, https://blog.xojo.com/wp-content/uploads/2024/10/HardenedRuntime-Editor-768x943.png 768w" sizes="auto, (max-width: 1140px) 100vw, 1140px" /></figure>
</div>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> The Hardened Runtime will not be applied when the project is run from the IDE.</p>
</blockquote>



<p>When building the app, if Hardened Runtime is enabled and no Developer ID Application value is entered in the Developer ID field (that is, signed as ad-hoc), then the following dialog will be shown and the build process will stop.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="744" height="688" src="https://blog.xojo.com/wp-content/uploads/2024/10/MissingDeveloperID.png" alt="" class="wp-image-13970" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/MissingDeveloperID.png 744w, https://blog.xojo.com/wp-content/uploads/2024/10/MissingDeveloperID-300x277.png 300w" sizes="auto, (max-width: 744px) 100vw, 744px" /></figure>
</div>


<h2 class="wp-block-heading">Notarization</h2>



<p>When the Notarization switch is enabled, it will automatically enable the Hardened Runtime Switch if it is not already enabled (because the Notarization process requires Hardened Runtime!).</p>



<p>With the Notarization switch enabled, you will be able to access the Setup dialog in order to setup the app-specific password required by this process to properly work. Creating this password only needs to be done one time, because it will be saved to the computer keychain and even synced via iCloud to others Macs from the same user (that is, iCloud account).</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1524" height="792" src="https://blog.xojo.com/wp-content/uploads/2024/10/App-PasswordSetup.png" alt="" class="wp-image-13971" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/App-PasswordSetup.png 1524w, https://blog.xojo.com/wp-content/uploads/2024/10/App-PasswordSetup-300x156.png 300w, https://blog.xojo.com/wp-content/uploads/2024/10/App-PasswordSetup-1024x532.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/10/App-PasswordSetup-768x399.png 768w" sizes="auto, (max-width: 1524px) 100vw, 1524px" /></figure>
</div>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> As with the Hardened Runtime feature, the Notarization process will not take place if the project is run from the IDE.</p>
</blockquote>



<p>When building the app, if Notarization is enabled and no Apple Development value is entered in the Developer ID field, then the following dialog will be shown and the build process will stop.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="744" height="688" src="https://blog.xojo.com/wp-content/uploads/2024/10/MissingDeveloperID-1.png" alt="" class="wp-image-13972" srcset="https://blog.xojo.com/wp-content/uploads/2024/10/MissingDeveloperID-1.png 744w, https://blog.xojo.com/wp-content/uploads/2024/10/MissingDeveloperID-1-300x277.png 300w" sizes="auto, (max-width: 744px) 100vw, 744px" /></figure>
</div>


<p>The Notarization process does require an active network connection to the Internet because it needs to talk with the Apple Service responsible of checking the app bundle contents. This means that the required time to complete the process will vary depending of your Internet connection speed and the load or availability of the Apple Notarization service itself.</p>



<h2 class="wp-block-heading">Custom User Entitlements</h2>



<p>Besides the entitlements you may have selected in the Sandboxing and Hardened Runtime editors, you may need to add other ones not available in these editors. This is something you can do through the User Entitlements field (.Plist file format). Such custom entitlements will be merged with the ones selected in the editors. If the custom entitlements entries collide with the ones selected in the editors, then the ones from the editors will be applied, discarding the duplicated ones found in the provided file.</p>



<h2 class="wp-block-heading">Building macOS apps… from Windows</h2>



<p>When the macOS app is built from Windows, and Sandboxing, Hardened Runtime or Notarization is applied (and optionally custom entitlements), then the final compressed archive will include all the required supporting files including the shell script required to run from a macOS computer to complete the signing process using the provided Apple Developer certificate (except the option to create an App-specific password for the Notarization step, because that can&#8217;t be done from Windows).</p>



<h2 class="wp-block-heading">Summary</h2>



<p>As you can see, Xojo 2024r4 streamlines the ability to apply Sandboxing, Hardened Runtime and Notarization to your macOS apps, and even run them as sandboxed from the IDE, so you can get better feedback during the debugging process to everything related with the access to files, network user, camera access, etc. That is, the same behaviour your users will have once they run the app downloaded from the Mac App Store or from your website.</p>



<p>See detailed steps in the <a href="https://documentation.xojo.com/topics/application_deployment/desktop/macos.html">Xojo Documentation</a>. If you need to know about what Sandboxing, Hardened Runtime or Notarization means, please take a look to the &#8220;<a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/">macOS Apps: From Sandboxing to Notarization, The Basics</a>&#8221; blog post.</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>More in this series on distributing Mac apps:</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/" target="_blank" rel="noreferrer noopener">Sandboxing, Hardened Runtime and Notarization arrives to the Xojo IDE</a></li>



<li><a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/" target="_blank" rel="noreferrer noopener">macOS Apps: From Sandboxing to Notarization, The Basics</a></li>



<li><a href="https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/" target="_blank" rel="noreferrer noopener">Uploading macOS Builds to App Store Connect</a></li>



<li><a href="https://blog.xojo.com/2025/01/30/provisioning-profiles-for-macos-apps/">Provisioning Profiles for macOS Apps</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>macOS Apps: From Sandboxing to Notarization, The Basics</title>
		<link>https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Thu, 22 Aug 2024 15:45:28 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[App Development]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[App Store Connect]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Distribution]]></category>
		<category><![CDATA[Entitlements]]></category>
		<category><![CDATA[Hardened Runtime]]></category>
		<category><![CDATA[Mac App Store]]></category>
		<category><![CDATA[Native App Development]]></category>
		<category><![CDATA[Notarization]]></category>
		<category><![CDATA[Sandboxing]]></category>
		<category><![CDATA[Xcode]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13510</guid>

					<description><![CDATA[You are likely already familiar with terms like Sandboxing, hardened runtime and Notarization. After all, these are required if you plan to distribute your macOS&#8230;]]></description>
										<content:encoded><![CDATA[
<p>You are likely already familiar with terms like Sandboxing, hardened runtime and Notarization. After all, these are required if you plan to distribute your macOS apps through the Mac App Store. But, starting with macOS Sequoia 15 (expected in the fall of 2024), Apple has tightened the runtime security protections even more. For example, it was common to Control + click on any downloaded macOS app from Internet that has not been signed and simply choose the Open option from the contextual menu to open it. That won&#8217;t be an option under Sequoia (although it still possible to run the unsigned app).</p>



<p>In fact, Apple recommends to Notarize the software even if you are going to distribute it from your own website, outside of the Mac App Store. But, don&#8217;t be scared! Currently there are good third parties options available that ease the path, like <a href="https://ohanaware.com/appwrapper/">App Wrapper from Ohanaware</a>, or some OpenSource options as for example <a href="https://github.com/jo-tools/xojo2dmg">Xojo2DMG</a>; and through this article you will see how to enable Sandboxing, runtime hardening and even Notarizing on a simple example app. Of course, this will touch only the basics and it is up to you to read the related Apple Documentation to add the entries, both the Entitlements and additional keys/values in the app Info.plist file, required by the purposes of your particular app, for example file access, camera or mic access, network access, etc.</p>



<h2 class="wp-block-heading">A Bit of Common Ground</h2>



<p>At this point, your head may be spinning if you are unfamiliar with these app security terms; so, what do Sandbox, hardened runtime and Notarizing mean when they are applied to macOS apps?</p>



<h3 class="wp-block-heading">Sandboxing</h3>



<p>When a macOS app is sandboxed, that means that macOS will create an exclusive container for everything related to the app the first time it is launched. This is what happens when installing an iOS app, too! Such a container will have its own structure to access things like documents, pictures, downloads, etc. Think about it as the own private execution space for the app:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1006" height="640" src="https://blog.xojo.com/wp-content/uploads/2024/08/1-Container.png" alt="" class="wp-image-13511" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/1-Container.png 1006w, https://blog.xojo.com/wp-content/uploads/2024/08/1-Container-300x191.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/1-Container-768x489.png 768w" sizes="auto, (max-width: 1006px) 100vw, 1006px" /></figure>
</div>


<p>Of course, there are <a href="https://developer.apple.com/documentation/security/app_sandbox?language=objc">entitlements waiting for you</a> so your sandboxed app can access the files created by other apps (including the Desktop, Downloads, Movies, Music and Picture folders), among other things.</p>



<h3 class="wp-block-heading">Hardened Runtime</h3>



<p>When enabled for your macOS app, hardened runtime adds an extra layer of protection to the running code itself. For example, it prevents certain classes of exploits, like code injection, dynamically linked library (DLL) hijacking, and process memory space tampering. This kind of protection is also enhanced by the <a href="https://support.apple.com/en-us/102149">System Integrity Protection (SIP)</a>.</p>



<h3 class="wp-block-heading">Notarization</h3>



<p>In brief, this is a third layer of confidence for the potential users of your macOS app. When the app is notarized, that ensures to the user that the Developer ID-signed software you distribute has been checked by Apple for malicious components. This is not related with the Apple Review process of your app when it is submitted to the Mac App Store, it&#8217;s related to the <a href="https://support.apple.com/en-gb/guide/security/sec5599b66df/web">macOS Gatekeeper technology</a>. So, when a Notarized app is downloaded from Internet, for example, Gatekeeper will use the notarization ticket attached to your app/DMG file to provide more meaningful information about the origin of the app, including if it is safe for the user to open it.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="744" height="752" src="https://blog.xojo.com/wp-content/uploads/2024/08/2-Gatekeeper.png" alt="" class="wp-image-13513" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/2-Gatekeeper.png 744w, https://blog.xojo.com/wp-content/uploads/2024/08/2-Gatekeeper-297x300.png 297w" sizes="auto, (max-width: 744px) 100vw, 744px" /></figure>
</div>


<h2 class="wp-block-heading">Preparation</h2>



<p>In order to follow this article, you will need:</p>



<ul class="wp-block-list">
<li><strong>Xojo</strong>. <a href="https://www.xojo.com/download">Download it for macOS</a> if you have not done yet.</li>



<li><strong>macOS 11.3</strong> or later.</li>



<li><strong>Xcode 13</strong> or later. Run it at least one time and make sure that all its required components and SDKs are installed.</li>



<li><strong>Apple Developer ID</strong>. This needs to be a paid Apple Developer membership. Also, make sure you have your Developer certificates installed in the Mac.</li>



<li>A working <strong>Internet</strong> connection.</li>
</ul>



<p>With all of this in place, open Xojo to create a macOS Desktop project and do some basic layout in the by default window. It is not required to add any functionality to keep the focus in the task at hand. Then, use Build Settings &gt; macOS &gt; Mac App Name to give an appropriate name to the built application (for this example I named it &#8220;SandboxedApp&#8221;).</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="594" height="654" src="https://blog.xojo.com/wp-content/uploads/2024/08/3-XojoProjectName.png" alt="" class="wp-image-13512" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/3-XojoProjectName.png 594w, https://blog.xojo.com/wp-content/uploads/2024/08/3-XojoProjectName-272x300.png 272w" sizes="auto, (max-width: 594px) 100vw, 594px" /></figure>
</div>


<p>Lastly, save the project (for example into the Documents folder) and click the Build button to build the app! It is not required at this point to assign the Developer ID in the Build Settings &gt; macOS &gt; Sign section, because we are going to sign it (again) in the next steps.</p>



<h2 class="wp-block-heading">Creating the Entitlements File</h2>



<p>The entitlements file is pretty similar to the Info.plist file you probably already know that is in charge of storing the required keys and values for the app to properly work. Both of these are in XML format, and the only difference is that while the Info.plist file is created for you by Xojo, the Entitlements file needs to be, currently, manually created for you.</p>



<p>So, open your text editor of choice (there a lot of there out there, both free and paid ones; personally I tend to use BBEdit from BareBones Software). Add the following lines to the text document and save it with the name &#8220;Entitlements.plist&#8221; (if you keep it next to the saved built macOS app, the better). This is the file where you will probably want to add more entitlement entries as your app requires them:</p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd"&gt;
&lt;plist version="0.9"&gt;
&lt;dict&gt;
  &lt;key&gt;com.apple.security.app-sandbox&lt;/key&gt;
  &lt;true/&gt;
&lt;/dict&gt;
&lt;/plist&gt;</code></pre>



<h2 class="wp-block-heading">Sandbox Your App</h2>



<p>With the compiled app and the entitlements file in place, open the Terminal app and type the following command and press the return key:</p>



<pre class="wp-block-code"><code>&gt; codesign --force --deep --timestamp --entitlements &lt;path-to-your-entitlements.plist-file&gt; -s "Developer ID Application: &lt;your-full-developer-name (including-the-team-id)&gt;" &lt;path-to-the-bundle-of-your-app&gt;</code></pre>



<p>Once executed, run the &#8220;SandboxedApp&#8221;, open the Activity Monitor app and make sure that the Sandbox option is enabled under the View &gt; Columns options. Then, use the search box of the main window to filter the displayed processes so it only displays your app. Take a look to the value under the Sandbox column and you will see that the app is now Sandboxed, and the Container for it has been created under the Library/Containers path. Quit the app when you are done.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1704" height="992" src="https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox.png" alt="" class="wp-image-13514" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox.png 1704w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-300x175.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-1024x596.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-768x447.png 768w, https://blog.xojo.com/wp-content/uploads/2024/08/4-Sandbox-1536x894.png 1536w" sizes="auto, (max-width: 1704px) 100vw, 1704px" /></figure>
</div>


<h2 class="wp-block-heading">Hardened Runtime</h2>



<p>With our app already sandboxed, let&#8217;s look how to add the hardened option to it. Once again, type the following command in the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; codesign --force --deep <strong>--options runtime</strong> --timestamp --entitlements &lt;path-to-your-entitlements.plist-file&gt; -s "Developer ID Application: &lt;your-full-developer-name (including-the-team-id)&gt;" &lt;path-to-the-bundle-of-your-app&gt;</code></pre>



<p>As you can see, it doesn&#8217;t vary much from the previous command. All it adds is the &#8220;<strong>&#8211;options runtime</strong>&#8221; text in charge of enabling the runtime hardening. Also, as you might guess, using this command will enable the Sandboxing of the app and also the runtime hardening, at all once.</p>



<p>Do you want to check if it worked? Well, type the following command at the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; codesign --display --verbose &lt;path-to-the-bundle-of-your-app&gt;</code></pre>



<p>It will produce an output similar to this one:</p>



<pre class="wp-block-code"><code>Executable=&lt;path-to-the-executable&gt;
Identifier=com.xojo.sandboxedapp
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=43297 <strong>flags=0x10000(runtime)</strong> hashes=1342+7 location=embedded
Signature size=9100
Timestamp=13 Aug 2024 at 12:51:28 PM
Info.plist entries=15
TeamIdentifier=************
Runtime Version=11.1.0
Sealed Resources version=2 rules=13 files=4
Internal requirements count=1 size=184</code></pre>



<p>It is the &#8220;<strong>flags=0x1000(runtime)</strong>&#8221; which shows that, in fact, the app runtime is hardened. Congrats!</p>



<h2 class="wp-block-heading">Notarizing the App</h2>



<p>This is the final step, but is going to require an extra step from your side. Because the notarytool command line tool, used for notarizing the app, is going to require the ID and password from your Apple ID account, plus the fact that it uses 2FA authentication, it is very convenient to create an app specific password for it.</p>



<h3 class="wp-block-heading">Creating an App-Specific Password</h3>



<p>In order to create the password used by the notarytool process, follow this steps:</p>



<ol class="wp-block-list">
<li>Sign in to <a href="https://appleid.apple.com">appleid.apple.com</a></li>



<li>In the Sign-in and Security section, select the App-Specific Passwords option:</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1408" height="1462" src="https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA.png" alt="" class="wp-image-13515" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA.png 1408w, https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA-289x300.png 289w, https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA-986x1024.png 986w, https://blog.xojo.com/wp-content/uploads/2024/08/5-AppSpecificPasswordA-768x797.png 768w" sizes="auto, (max-width: 1408px) 100vw, 1408px" /></figure>
</div>


<ol start="3" class="wp-block-list">
<li>The previous action will bring a new dialog displaying all the app-specific passwords already created. Click the &#8220;+&#8221; button to add a new one:</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1392" height="1308" src="https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB.png" alt="" class="wp-image-13516" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB.png 1392w, https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB-300x282.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB-1024x962.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/08/6-AppSpecificPasswordB-768x722.png 768w" sizes="auto, (max-width: 1392px) 100vw, 1392px" /></figure>
</div>


<ol start="4" class="wp-block-list">
<li>Type a meaningful name for as the &#8220;Title&#8221; or description for your new password in the presented dialog (<strong>notarytool</strong> could be a good one):</li>
</ol>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="918" height="742" src="https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC.png" alt="" class="wp-image-13517" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC.png 918w, https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC-300x242.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/7-AppSpecificPasswordC-768x621.png 768w" sizes="auto, (max-width: 918px) 100vw, 918px" /></figure>
</div>


<ol start="5" class="wp-block-list">
<li>Once you click the Create button it is possible that you will be asked to authenticate again using your Apple ID. Once done, a new dialog will present the generated password to you. Copy it and write it down (or paste it) into a safe place, because we are going to need it in the next step.</li>
</ol>



<h3 class="wp-block-heading">Adding the notarytool specific password to the Keychain</h3>



<p>Because this app-specific password is going to be used by the notarytool command line tool, it would be very convenient to have it stored in the macOS Keychain. To do so, type the following command at the Terminal prompt, and press the Return key:</p>



<pre class="wp-block-code"><code>&gt; xcrun notarytool store-credentials "notarytool-password" --apple-id "&lt;your-apple-ID&gt;" --team-id &lt;your-developer-team-id&gt; --password &lt;the-password-copied-from-the-previous-step&gt;</code></pre>



<p>Once executed, you will be able to see the password added to the Keychain app under the name of &#8220;notarytool-password&#8221;:</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1948" height="1068" src="https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword.png" alt="" class="wp-image-13518" srcset="https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword.png 1948w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-300x164.png 300w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-1024x561.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-768x421.png 768w, https://blog.xojo.com/wp-content/uploads/2024/08/8-NotaryToolPassword-1536x842.png 1536w" sizes="auto, (max-width: 1948px) 100vw, 1948px" /></figure>
</div>


<h3 class="wp-block-heading">Creating a Zip file for your app</h3>



<p>The notarization process is handled by the Apple notary service running in the Internet, what means that notarytool needs to send (upload) the bundle of your app in an appropriate format. There are two options: as a DMG file (that needs to be signed before submitting), or as a zipped file, what is even faster and easier (Trivia: Did you know how easy it is to <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-zip">create Zip files in Xojo code</a>?)</p>



<p>So, in order to upload our app for notarization, we need to create a Zip file first. Once again, it is time to type a new command at the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; /usr/bin/ditto -c -k --keepParent &lt;path-to-app-bundle&gt; &lt;path-to-generated-zip-file/file-name.zip&gt;</code></pre>



<h3 class="wp-block-heading">&nbsp;</h3>



<h3 class="wp-block-heading">Uploading the app for Notarization</h3>



<p>With our Zip file in place, we now have all the pieces to send it to the notarization process. The time spent by that process may (and will) vary depending of several factors.</p>



<p>In order to send the file, type the following command at the Terminal prompt:</p>



<pre class="wp-block-code"><code>&gt; xcrun notarytool submit &lt;path-to-zip-file/file-name.zip&gt; --keychain-profile "notarytool-password" --wait </code></pre>



<p>After pressing the Return key, the process will start and the Terminal will output information about the progress; something similar to this:</p>



<pre class="wp-block-code"><code>Conducting pre-submission checks for &lt;name-of-your-zip-file&gt; and initiating connection to the Apple notary service...
Submission ID received
  id: &lt;some-id-number-goes-here&gt;
Upload progress: 100.00% (8.65 MB of 8.65 MB)   
Successfully uploaded file
  id: &lt;some-id-number-goes-here&gt;
  path: &lt;path-of-the-zip-file&gt;
Waiting for processing to complete.
Current status: Accepted........
Processing complete
  id: &lt;keep-this-id-in-a-safe-place-you-will-need-it-later&gt;
  status: Accepted</code></pre>



<p>Have you seen the last line? The &#8220;<strong>status: Accepted</strong>&#8221; means that everything worked OK, and the notarization process has been successful, but it&#8217;s better if we check! Type the following command at the Terminal prompt. This one will ask the notarytool command to download the log file in JSON format to be saved at the desired path. It is a good habit to do it, because such a log file will include some eventual error and explanation about possible errors during the notarization process, including those related to the app itself:</p>



<pre class="wp-block-code"><code>&gt; xcrun notarytool log &lt;put-here-the-value-you-saved-in-a-secure-place-from-the-id-field-in-the-previous-output&gt; --keychain-profile "notarytool-password" &lt;path-to-save-the-log.json&gt;</code></pre>



<h2 class="wp-block-heading">Staple the Ticket!</h2>



<p>Assuming that everything worked OK, it is time to staple the notarization ticket to the app itself. It is not required, but is convenient to avoid online checks when the user runs the app, or Gatekeeper inspects it.</p>



<p>Yeah, that means using a new command from Terminal on the already signed, sandboxed and runtime hardened app bundle (not the Zip file you created for submitting using notarytool):</p>



<pre class="wp-block-code"><code>&gt; xcrun stapler staple "&lt;path-to-the-signed-sandboxed-and-hardened-app-bundle&gt;"</code></pre>



<p>After that, you can check that everything went OK using the following command:</p>



<pre class="wp-block-code"><code>&gt; spctl -a -vvv -t install &lt;path-to-the-signed-sandboxed-and-hardened-app-bundle&gt;</code></pre>



<p>And you should get something similar to this as the output:</p>



<pre class="wp-block-code"><code>source=Notarized Developer ID
origin=&lt;your-full-developer-ID-Application&gt;</code></pre>



<h2 class="wp-block-heading">App Distribution</h2>



<p>That&#8217;s fine, but you will probably want to distribute your app from the Internet using a DMG container. In that case, follow these steps:</p>



<ol class="wp-block-list">
<li>Create a DMG container (file).</li>



<li>Copy your already notarized app bundle into it.</li>



<li>Notarize the DMG file.</li>



<li>Staple the ticket to the DMG file.</li>
</ol>



<p>That way the DMG container will be Notarized along with the app bundle inside it.</p>



<h2 class="wp-block-heading">In Summary</h2>



<p>As we did see, all the process of sandboxing, runtime hardening and Notarization involves a bunch of commands from the terminal, including the creation of the Zip file. But the good news is that all the process could be automated using Xojo itself! (take a look to the <a href="https://documentation.xojo.com/api/os/shell.html#executemodes">Shell</a> class and the <a href="https://documentation.xojo.com/api/files/folderitem.html#folderitem-zip">Zip method from the FolderItem class</a> if you are not familiar with them).</p>



<p>As I said before, this article only on touches the basics and doesn&#8217;t dig into Provisioning Profile creation (associated with Capabilities required by the app), the Entitlements your app may need to properly work, among other topics; so you may find these Apple Developer Documentation of interest:</p>



<p>&#8211; <a href="https://developer.apple.com/help/account/manage-profiles/create-a-development-provisioning-profile/">Provisioning profiles</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/bundleresources/entitlements?language=objc">macOS Entitlements</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/security/app_sandbox?language=objc">macOS Sandbox</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/security/hardened_runtime?language=objc">macOS Hardened Runtime</a>.<br>&#8211; <a href="https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution?language=objc">macOS Notarization</a>.</p>



<p>Happy Xojo Coding!</p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>



<p><strong>More in this series on distributing Mac apps:</strong></p>



<ul class="wp-block-list">
<li><a href="https://blog.xojo.com/2024/12/10/sandboxing-hardened-runtime-and-notarization-arrives-to-the-xojo-ide/" target="_blank" rel="noreferrer noopener">Sandboxing, Hardened Runtime and Notarization arrives to the Xojo IDE</a></li>



<li><a href="https://blog.xojo.com/2024/08/22/macos-apps-from-sandboxing-to-notarization-the-basics/" target="_blank" rel="noreferrer noopener">macOS Apps: From Sandboxing to Notarization, The Basics</a></li>



<li><a href="https://blog.xojo.com/2025/01/14/uploading-macos-builds-to-app-store-connect/" target="_blank" rel="noreferrer noopener">Uploading macOS Builds to App Store Connect</a></li>



<li><a href="https://blog.xojo.com/2025/01/30/provisioning-profiles-for-macos-apps/">Provisioning Profiles for macOS Apps</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>iOS: Privacy Editor</title>
		<link>https://blog.xojo.com/2024/06/26/ios-privacy-editor/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Wed, 26 Jun 2024 15:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[2024r2]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=13171</guid>

					<description><![CDATA[Back in March we wrote about Apple’s new privacy policy for AppStore approval and how, and when, your Xojo iOS apps would meet this new requirement. In Xojo 2024r2 we've included a new Privacy Editor in the Xojo IDE. Continue reading to discover how to use the iOS Privacy Editor.]]></description>
										<content:encoded><![CDATA[
<p>Back in March we wrote about <a href="https://blog.xojo.com/2024/03/20/apples-new-privacy-manifest-requirements/">Apple’s new privacy policy for AppStore approval</a> and how, and when, your Xojo iOS apps would meet this new requirement. In Xojo 2024r2 we&#8217;ve included a new Privacy Editor in the Xojo IDE. Continue reading to discover how to use the iOS Privacy Editor.</p>



<span id="more-13171"></span>



<p>First of all, if your apps only relies on the Xojo provided iOS framework functionality, then you don&#8217;t need to do anything at all. When building or running the iOS app, Xojo will create and add the required PrivacyInfo.xcprivacy file for you.</p>



<p>If you are using Declare calls or rely on iOS third party libraries or plug-ins, then you should check with the developer to know if any of the calls made fall into the <a href="https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api?language=objc">Privacy Categories listed by Apple</a> (keep in mind that these can change over time). If so, then it is time to visit the new Privacy Editor available under the Build Settings &gt; iOS section, and click the Settings button in the associated Inspector Panel:</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="602" height="1410" src="https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEdit.png" alt="" class="wp-image-13173" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEdit.png 602w, https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEdit-128x300.png 128w, https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEdit-437x1024.png 437w" sizes="auto, (max-width: 602px) 100vw, 602px" /></figure>
</div>


<p>Here you will find the Edit button under the Privacy section. Click on it to bring up the Privacy Editor window:</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1424" height="1080" src="https://blog.xojo.com/wp-content/uploads/2024/06/Editor.png" alt="" class="wp-image-13174" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/Editor.png 1424w, https://blog.xojo.com/wp-content/uploads/2024/06/Editor-300x228.png 300w, https://blog.xojo.com/wp-content/uploads/2024/06/Editor-1024x777.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/06/Editor-768x582.png 768w" sizes="auto, (max-width: 1424px) 100vw, 1424px" /></figure>
</div>


<p>In the Privacy Editor window, select both the API Type from the entries available in the ComboBox control, plus the associated API Reasons that meet your specific requirements based on the API Type selection.</p>



<p>Of course, you will be able to add as many API Type cards as you may need using the &#8220;Add Type&#8221; button, or delete any of the previously added cards. If any of your iOS apps share the same Privacy settings, you can simplify the process by creating and saving files in the Privacy Editor. Now you can add those files to your other iOS apps from the Editor via the &#8220;Open…&#8221; button or by dragging &amp; dropping the file from its current location into the Editor itself.</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1504" height="1448" src="https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEntries.png" alt="" class="wp-image-13175" srcset="https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEntries.png 1504w, https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEntries-300x289.png 300w, https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEntries-1024x986.png 1024w, https://blog.xojo.com/wp-content/uploads/2024/06/PrivacyEntries-768x739.png 768w" sizes="auto, (max-width: 1504px) 100vw, 1504px" /></figure>
</div>


<p>Once you finish editing the Privacy settings for the iOS project, the PrivacyInfo.xcprivacy file will be created and automatically added when building the iOS app, allowing you to run it the Simulator, any connected iOS device or send it to the AppStore review approval. Learn more about this in the <a href="https://documentation.xojo.com/versions/2024r2/topics/application_deployment/ios/meeting_apples_privacy_requirements.html">Xojo Documentation</a>. </p>



<p><em>Javier Menendez is an engineer at Xojo and has been using Xojo since 1998. He lives in Castellón</em>, <em>Spain and hosts regular Xojo hangouts en español. Ask Javier questions on Twitter at <a href="https://twitter.com/xojoes" target="_blank" rel="noreferrer noopener">@XojoES</a> or on the <a href="https://forum.xojo.com/u/javier_menendez/summary" target="_blank" rel="noreferrer noopener">Xojo Forum</a>.</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating an Android Emulator in Android Studio</title>
		<link>https://blog.xojo.com/2023/08/09/creating-an-android-emulator-in-android-studio/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Wed, 09 Aug 2023 13:30:00 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Emulator]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Remote Debugging]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11702</guid>

					<description><![CDATA[In order to test the Android apps you create in Xojo, you either need to have an actual Android device (Xojo supports on-device testing/debugging) or you need to set up an Android Emulator in Android Studio. Read on or jump over to Xojo YouTube Channel to watch this process in this Creating an Android Emulator video.]]></description>
										<content:encoded><![CDATA[
<p>In order to test the Android apps you create in Xojo, you either need to have an actual Android device (Xojo supports on-device testing/debugging) or you need to set up an Android Emulator in Android Studio. Read on or jump over to Xojo YouTube Channel to watch this process in our <a href="https://youtu.be/hsmkUIHRvq8">Creating an Android Emulator</a> video.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="695" src="https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-1024x695.png" alt="" class="wp-image-11703" srcset="https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-1024x695.png 1024w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-300x204.png 300w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-768x521.png 768w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator-1536x1043.png 1536w, https://blog.xojo.com/wp-content/uploads/2023/07/CreatingAnAndroidEmulator.png 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ol class="wp-block-list">
<li>If you haven&#8217;t already downloaded and installed Android Studio, do that now.</li>



<li>Launch Android Studio.</li>



<li>If you have already created a project in Android Studio, you can open that project. Otherwise, click the New Project button.</li>



<li>In the dialog box that is displayed, choose the default project type.</li>



<li>Click the Next button then click the Finish button.</li>



<li>Once you have a project open, choose Tools &gt; Device Manager. The Device Manager pane appears on the right side of the project window.</li>



<li>Click on the Create Device button. The Virtual Device Configuration dialog box appears.</li>



<li>Choose the category for the type of emulator you need. Phone is chosen by default.</li>



<li>Scroll through the list of devices to find one that suits you. We recommend choosing one that has the Google Play Store icon in the Play Store column.</li>



<li>Click the Next button.</li>



<li>On the System Image page the appropriate system image for the device you selected should be automatically selected for you. Just make sure the version of Android is at least the <a href="https://documentation.xojo.com/resources/system_requirements_for_current_release.html">minimum version supported by Xojo</a>.</li>



<li>Click the Next button.</li>



<li>On the final page you can rename the device if you&#8217;d like. If you&#8217;re going to be creating a lot of Android apps, consider increasing the storage in your emulator by clicking the Show Advanced Settings button and then scrolling the lefthand pane down a bit until you see the Internal Storage field. It defaults to 2048MB so you might want to increase that a bit.</li>



<li>Click the Finish button. Your emulator appears in the Device Manager pane.</li>



<li>Quit Android Studio and go to Xojo. Android Studio cannot be running while you use emulators in Xojo.</li>
</ol>



<p>Now you&#8217;re ready to use the emulator you created.</p>



<p>In Xojo, open an Android project, in the Navigator click on Android under Build Settings and you&#8217;ll see the Android Debugging section. If you have only created one emulator, it will be selected by default. If you&#8217;ve created several, they will all be listed.</p>



<p>The first time you use a new emulator it takes Android Studio it takes a bit longer than normal for it to launch. These emulators also sometimes stop working. When that happens, launch Android Studio, open a project or create a new one, go to Tools &gt; Device Manager to display the Device Manager pane, delete the bad emulator and create a new one.</p>



<p>Don&#8217;t forget that Xojo supports on-device debugging (<a href="https://youtu.be/8B9dLxe2asY">Video</a>: Setting Up On-Device Debugging on Your Android Device) as well so if you have an Android phone or tablet, you can run your apps directly on the device which you may find to be a better overall experience for testing and debugging.</p>



<p>Learn more about using Xojo Android in the <a href="https://blog.xojo.com/category/cross-platform/android/">Android</a> category in the Xojo Programming Blog.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Versatility of Xojo</title>
		<link>https://blog.xojo.com/2022/12/06/the-versatility-of-xojo/</link>
		
		<dc:creator><![CDATA[Jérémie Leroy]]></dc:creator>
		<pubDate>Tue, 06 Dec 2022 16:49:04 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Cross-Platform]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[App Hosting]]></category>
		<category><![CDATA[App Localization]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[GraffitiSuite]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Trello]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Xojo API 2.0]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=11006</guid>

					<description><![CDATA[Many people around the world are celebrating the holidays by giving gifts, which means more and more people are organizing Secret Santa events. In November of 2018, Jérémie Leroy had the idea of making a Secret Santa iOS app. 3 years, 32 languages and 6.5 millions downloads later, Jérémie incorporated Xojo Web to improve his highly successful Xojo iOS app. Secret Santa is a prime example of what is possible and how you can leverage your Xojo skills to expand to other platforms when you need to.]]></description>
										<content:encoded><![CDATA[
<p>It is soon time for the end of year festivities. Many people around the world are celebrating the holidays by giving gifts, which means more and more people are organizing Secret Santa events. During these events, members of a group of friends, family, or colleagues will draw names to become someone’s Secret Santa and then give them a holiday gift, usually something fun.</p>



<figure class="wp-block-table aligncenter"><table><tbody><tr><td class="has-text-align-left" data-align="left"><strong>Did you know?</strong></td></tr><tr><td class="has-text-align-left" data-align="left">Secret Santa is known by different names around the world, such as “Amigo Invisible” in Spanish, “Amigo Secreto” in Portuguese, “Тайный Санта” in Russian.</td></tr></tbody></table></figure>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>I first made a desktop Secret Santa app back in 2015 for an event with friends. We were tired of drawing names out of a hat and having couples being paired together. The app I created solved that problem because couples were excluded from offering a gift to each other. And we didn’t need a hat!</p>



<p>In November of 2018, I had the idea of making a <a href="https://apps.apple.com/app/apple-store/id1442673273?pt=118403140&amp;ct=XojoBlog&amp;mt=8">Secret Santa iOS app</a> so that anyone with an iPhone or iPad could benefit from the same features I had been enjoying for the past 3 years.</p>



<p>The app would need to be easy to use, avoid couples getting matched with each other, send notifications by email without letting the organizer know which pairs were matched, and of course make sure no name would be assigned twice.</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%"><div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://apps.apple.com/app/apple-store/id1442673273?pt=118403140&amp;ct=XojoBlog&amp;mt=8"><img loading="lazy" decoding="async" src="https://blog.xojo.com/wp-content/uploads/2022/12/Screen-Shot-2022-12-06-at-9.12.28-AM.png" alt="" class="wp-image-11009" width="168" height="352" srcset="https://blog.xojo.com/wp-content/uploads/2022/12/Screen-Shot-2022-12-06-at-9.12.28-AM.png 304w, https://blog.xojo.com/wp-content/uploads/2022/12/Screen-Shot-2022-12-06-at-9.12.28-AM-143x300.png 143w" sizes="auto, (max-width: 168px) 100vw, 168px" /></a></figure>
</div></div>
</div>



<p>After just 8 days of development, the app was ready to ship and sent to the App Store.</p>



<p>Within 5 days, the app had been downloaded from 35 different countries and was my fastest app to reach 1000 downloads!</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img decoding="async" src="https://lh6.googleusercontent.com/U-yY3aE161mfhU3H6k9ODFP4LtuwzFNWzRrvUdRIvs3cLeHG2sydLIDWL1Ic65Lnw9rJvRQ8mGn82ComNHKq2s-pDWIJoGimmA5082pg_IDuI1KCwX9U82FGIkTSFev4LRYR20Tc8Tkgfn9UlL18C2cAraTTFzJKR4Np5fDCtqwc8jDcjeP1D4e2-mPSBg" alt="" width="-43" height="-22"/></figure>
</div>


<p><a href="https://apps.apple.com/app/apple-store/id1442673273?pt=118403140&amp;ct=XojoBlog&amp;mt=8"></a></p>



<p>Having the app translated to English, French, Italian, and Spanish in the initial release helped to reach more users.</p>



<p>Version 1.1 of the app was released a few days later with German and Portuguese translations.</p>



<p>That’s when I realized that Secret Santa is something extremely common in Latin America. Many families draw names for Christmas so that they can give and receive one big gift instead of smaller trivial gifts for each family member.</p>



<p>Most updates of the app came with new localizations, which really helped in realizing more and more downloads. After 3 years of updates, the app is now available in 32 languages.</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img loading="lazy" decoding="async" src="https://lh5.googleusercontent.com/DJt7zuBJxMbga7qB9LWyTwy-ZwnBYIBS4XbqTmOsuBh25vtv3UN1THXY32Z55sxG0arqCOpyKo1ttUT1q7iY5Z0Y1I9XhT8lbv6C_FPMsLPuhAiZ3q0AIdH9RUhBEGiXP4ft3aGzqAyiND3qk7bH4OSXuXNo3jRc4BPFhDmtT5kHLF2w3cgO66QPT6BctQ" alt="" width="895" height="635"/></figure>
</div>


<p>A high quantity of downloads also meant that I received a lot of feedback from users. Many users were happy with the current features, but I started getting feature requests to send the gift pairs by SMS or WhatsApp instead of by email. We all have a parent or grand-parent who isn’t tech-savvy and doesn’t have an email address.</p>



<h2 class="wp-block-heading"><strong>Leveraging the biggest advantage of Xojo &#8211; Sharing code across platforms</strong></h2>



<p>From 2018 until 2022, I had become used to updating the Secret Santa app itself to add new features and new translations while also fixing bugs. This year, I received a message from an unhappy user stating that they really need a wishlist feature and downloaded my app thinking it already had one.</p>



<p>A valid wishlist feature needed to be accessible to anyone with an Internet connection, whether they used a computer, an iPhone, or an Android device.</p>



<p>Using Xojo Web and a coding language I already knew was the obvious choice for this task. Sharing important bits of code from my main iOS project to the web wishlist project was as easy as copy and paste.</p>



<p>As with any Xojo project, copying classes from one project to the other was a real time saver, especially for the API layer required to communicate between Xojo and the online database that holds all the Secret Santa data.</p>



<p>The main difficulty working on a web project came from the UI. Not that Xojo Web’s UI is difficult, but I am so used to designing mobile apps that my brain didn&#8217;t know where to start.</p>



<p>I knew I wanted to display two columns of data:</p>



<ul class="wp-block-list"><li>The user’s wishlist</li><li>The wishlist from the person they are offering a gift to</li></ul>



<p>The layout had to be responsive to be accessible on both mobile and desktop devices.</p>



<p><a href="https://graffitisuite.com">Graffitisuite</a> from Anthony Cyphers came to mind, and within a few minutes of reviewing the online demo, I was convinced to use GraffitiKanban web control. I am a big fan of <a href="https://trello.com">Trello</a> for organizing my work, displaying cards in labeled columns. That&#8217;s exactly what I needed for the wishlist feature.</p>



<p>GraffitiKanban is “responsive” (Web Design term), meaning the display changes to adapt to smaller screens such as mobile devices.</p>



<p>GraffitiSuite also offers a wide variety of UI elements that made me save a lot of time.</p>



<p>7 days after the initial feature request, the wishlist feature was available to all.</p>



<p><strong>Wishlist on a desktop browser:</strong></p>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/idkQ031bZaWEyP1Pj4BULLGJRc-Xz95sl4xlCkYD2KZt1IsMKOvsoP9ywwY5f81wwykuMuWqofDIelJNIiwE0j0IcF93ZXyaXFBmVK991oigNXPmi7W6BR1_b44sWWWKkYO7jAXVbjDC6Io4RVwhVveV8oM4Nu1UOPMXzrcxPL-VtdgVNB3bQ58MtolkmQ" alt=""/></figure>
</div>


<p><strong>Wishlist on a mobile browser:</strong></p>


<div class="wp-block-image">
<figure class="aligncenter"><img decoding="async" src="https://lh6.googleusercontent.com/9KZB2JwTAt2cLXTb7Es_G2Qdwldmfa1nMRmS7F2s9Pb2iVuz0e4M5Zj_8XfUn97QTUvU-78i8cDq5JZOrMwr-ROe0ihov1R2YDZSVseEky4KwTATMxU2tQHD6TXQpouL37NXEryK86JjTv36A-N-VHSqCXKXYza6M2V8WyWmP7Wie5kY_0GuMaOeixI0" alt=""/></figure>
</div>


<p>Deploying the app to <a href="https://www.xojo.com/cloud">Xojo Cloud</a> was extremely easy.</p>



<p>A single button press in Xojo, a subdomain DNS record, 2 minutes of configuration in Cloudflare, and the web app was up, running, and accessible through HTTPS.</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/o76SHsHWThArJFy__WCn9HW8rgFJ2Q0lJqq12o3ReAXRszlJe5VESNgYThKLfHtsU2hfOHrm5IbBVOOjCf4n6hjdUaYMZM0vjhfHGOsVmQkugEHbHHInjG29mDEpOk4-Ef8sg98ZTZp1esNIU4JM1jQ4qTZSdxLcrY_YKlOUKCW2_lWqV84NTyp-vvnnJQ" alt=""/></figure>



<p>Customer use of the wishlist feature has blown-up more than I ever would have expected. So far 30,000 gift ideas have been added to the wishlist (and counting).</p>



<h2 class="wp-block-heading"><strong>The next feature request</strong></h2>



<p>With an app that sees 60,000 new users per month, I receive a lot of feature requests. Most recently, I received a one star review on the app store because my app isn&#8217;t accessible to the Visually Impared. When VoiceOver is activated, all it says is “button”, “button”, “button”, with no explanation.</p>



<p>Adding voice-over capabilities in Xojo is simple. The <a href="https://documentation.xojo.com/api/user_interface/mobile/mobileuicontrol.html#mobileuicontrol">MobileUIControl</a> class has two String properties, AccessibilityHint and AccessibilityLabel.</p>



<p>But it actually is a lengthy task to check each control on each screen and make sure that the translations are correct.</p>



<p>VoiceOver support will soon be released in English and French, but all other localizations will be only ready next year. It is currently a bad time to get 30 different translators to work on the project under such short notice.</p>



<p>Xojo has enabled me to create a business out of developing iOS apps for the App Store. Including all of my apps, I have had over 6.5 million downloads and counting. Secret Santa is a prime example of what is possible and how you can leverage your Xojo skills to expand to other platforms when you need to. I look forward to what’s to come and will be at <a href="https://www.xojo.com/xdc">XDC London</a> to learn more about the future.</p>



<p>If you are organizing a Secret Santa event or just curious to see the app, download Secret Santa on the <a href="https://apps.apple.com/app/apple-store/id1442673273?pt=118403140&amp;ct=XojoBlog&amp;mt=8">App Store.</a></p>



<p><em>Jérémie Leroy has been using Xojo since 2008, he won two Xojo Design Awards in the iOS App category and has released over 13 iOS apps made with Xojo on the App Store. He also released </em><a href="https://github.com/jkleroy/iOSDesignExtensions"><em>iOSDesignExtensions</em></a><em> on Github to help style and polish your Xojo made iOS apps.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Crazy Exercise that is the Apple Signing Process</title>
		<link>https://blog.xojo.com/2021/10/26/the-crazy-exercise-that-is-the-apple-signing-process/</link>
		
		<dc:creator><![CDATA[Greg O'Lone]]></dc:creator>
		<pubDate>Tue, 26 Oct 2021 20:31:46 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=9512</guid>

					<description><![CDATA[...why (does) this process seems so complicated in the first place? What Apple is trying to do is to provide operational security...]]></description>
										<content:encoded><![CDATA[
<p>Anyone who dabbles in macOS or iOS development in Xojo (and elsewhere) has encountered what seems to be the maddening voodoo of getting their development certificates and profiles &#8220;just right&#8221; only to have them fail the next time they try to build. <br><br>Today I&#8217;m going to try to clear up some of the mystery surrounding this convoluted process and give you some pointers not only for fixing but also for figuring out where your signing issues lie.</p>



<h2 class="wp-block-heading">It&#8217;s All About Operational Security</h2>



<p>Just so we&#8217;re all clear about why this process seems so complicated in the first place. What Apple is <em>trying</em> to do is to provide operational security, that is, separation of responsibilities so that on a big team, a single developer can&#8217;t just create and push out an app without anyone&#8217;s approval. While it adds a bit of complication for individual developers, it also means that as your product (and more importantly your team) grows, you&#8217;ll be able to deal with the changes gracefully.</p>



<h2 class="wp-block-heading">Seemingly Disparate Pieces</h2>



<p>There are six different parts that need to come together to successfully sign and deploy on iOS and macOS using the App Store (or Enterprise) which need to be configured properly for all this to work. If you&#8217;re just starting out, we suggest doing them in the order specified below to avoid having to go back and regenerate things later.</p>



<ol class="wp-block-list"><li><strong>The Application Identifier</strong> – This is the identifier which Apple requires be unique for every application installed on an Apple device. Typically in the form: <code>com.yourcompany.app-name</code> You will have the best luck with this process if you decide what this is going to be up front because it affects nearly everything going forward. You will define any capabilities which require entitlements in this section. Enabling things in this section may mean that you need to check a corresponding capability in your Xojo project. <em>Changing these capabilities will invalidate the Profiles below.</em></li><li><strong>Testing Devices</strong> – This is a list of devices which are <em>allowed</em> to be used for testing. They are specified using the Apple Developer portal using the device UDID. For an iOS device, this can be found either in Finder or in iTunes when the device is connected. I suggest using a meaningful name for the device if you have a lot of them.</li><li><strong>Certificates</strong> – Development and Distribution certificates are based on a public-private key-pair (like SSH) and are used for signing applications for testing and distribution respectively. See the Troubleshooting section below for more information.<ol><li><strong>Development Certificate</strong> – Each person who is writing code for you on your projects and needs to be able to build for a testing device will need one of these which was created in <em>your account</em>. This means that if you have a contractor working for you, you&#8217;ll need to add them to your account, set their Role to <strong>Developer</strong> and specify the apps that this developer is allowed to work on. One certificate per developer, and these need to be renewed each year.</li><li><strong>Distribution Certificate</strong> – The person, group or machine that is responsible for building for the App Store (or Enterprise) has a separate key-pair certificate. One certificate per <em>account</em>, and they need to be renewed each year.</li></ol></li><li><strong>Profiles</strong><ol><li><strong>Development Profile</strong> –&nbsp;This file is used to link up the who, what and where of developing an iOS or macOS app. When creating a development profile, give it a name appropriate to the group you are creating. It&#8217;s important to understand that because these profiles rely on the testing devices and on the individual developers that changes to those groups will require regenerating this profile. If your developers and/or testing devices change often, I suggest creating individual profiles for each developer. If not, you&#8217;ll have better luck with just one profile that contains all of your developers and devices. These need to be regenerated at least once per year.<ol><li>The Application Identifier &#8211; Select the Application Identifier for the app to which this profile applies.</li><li>Certificates – Select each of the developers that should be able to test this app on the selected devices.</li><li>Devices &#8211; Select each of the devices that the developers should be able to use in their testing.</li></ol></li><li><strong>Distribution Profile</strong> – This file links together the Application Identifier and the Distribution Certificate. Remember, there is typically one Distribution Certificate per account, so this allows you to grant or revoke the ability to distribute an app. These need to be regenerated at least once per year.</li></ol></li></ol>



<h2 class="wp-block-heading">Dependencies</h2>



<p>I&#8217;ve touched on this in places above, but I want this to be perfectly clear to anyone that is having trouble with certificates or profiles. The Development and Distribution profiles are highly dependent on the integrity of the Application Identifiers, Devices and Certificates. Any change to those items will mean that either or both of the profiles will need to be regenerated. Luckily (for the profiles anyway), it&#8217;s just a matter of editing the profile, adding or updating the data (if any) and clicking Save. Once that&#8217;s done, you can download the new profile, give it to anyone on your team that needs it (anyone whose certificates are contained therein) and just by double-clicking on the new file, it will be installed on your system by Xcode.</p>



<p>The table below shows the dependencies of the Development and Distribution profiles. <em>Any</em> changes to the indicated items (including expiration of a certificate) will render the profile Invalid and require that it be regenerated.</p>



<figure class="wp-block-table aligncenter is-style-regular"><table><thead><tr><td class="has-text-align-center" data-align="center"><strong>Profile Type</strong></td><td class="has-text-align-center" data-align="center"><strong>Application Identifier</strong></td><td class="has-text-align-center" data-align="center"><strong>Devices</strong></td><td class="has-text-align-center" data-align="center"><strong>Development Certificates</strong></td><td class="has-text-align-center" data-align="center"><strong>Distribution Certificate</strong></td></tr></thead><tbody><tr><td class="has-text-align-center" data-align="center">Development</td><td class="has-text-align-center" data-align="center">X</td><td class="has-text-align-center" data-align="center">X</td><td class="has-text-align-center" data-align="center">X</td><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-center" data-align="center">Distribution</td><td class="has-text-align-center" data-align="center">X</td><td class="has-text-align-center" data-align="center"></td><td class="has-text-align-center" data-align="center"></td><td class="has-text-align-center" data-align="center">X</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Troubleshooting</h2>



<h3 class="wp-block-heading"><strong>Overall</strong></h3>



<p>If you&#8217;re getting errors during the build process, there&#8217;s usually some information about whether it is a Profile or a Certificate that is causing the trouble. The first thing you should do is go to your Apple Developer portal and under Certificates, Identifiers &amp; Profiles check to make sure that none of your Certificates have expired and that all of your Profiles for the current project are still Valid and have also not expired.</p>



<h3 class="wp-block-heading"><strong>Certificates</strong></h3>



<p>If for any reason you do not have both parts of the certificate you are trying to use, whether it&#8217;s the user&#8217;s Development certificate when building for your test devices or the Distribution certificate when trying to build for the App Store (or Enterprise), you&#8217;re not going to be successful. Both the public and the private key must be present on your machine for them to work.</p>



<p>It&#8217;s important to remember that these certificates can only be downloaded from Apple&#8217;s Developer portal <strong>once</strong>, after which downloading will only give you the public key. If you need to transfer a development certificate from one account to another (like if you replace your computer mid-year), you should find the certificate in your keychain, right-click on it and select <strong>Export</strong>. When the save dialog appears, make sure the file format is set to <strong>Personal Information Exchange (.p12)</strong>, and set a password for the key after you click <strong>Save</strong>. When you take the exported key to your new account/machine and double-click on it, the system will ask you for the password and you should be all set.</p>



<h2 class="wp-block-heading">Enterprise Distribution</h2>



<p>If you are a Xojo developer using an Enterprise developer account to distribute iOS applications within your own company without going through the App Store, we highly suggest checking out 2021r3 or later as some important changes have been made to make your builds more successful. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Guest Post: What is ASO and Why is it Important?</title>
		<link>https://blog.xojo.com/2020/06/22/guest-post-what-is-aso-and-why-is-it-important/</link>
		
		<dc:creator><![CDATA[Gummicube]]></dc:creator>
		<pubDate>Mon, 22 Jun 2020 16:00:00 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Developer Marketing]]></category>
		<category><![CDATA[Play Store]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=7106</guid>

					<description><![CDATA[App Store Optimization (ASO) is important for app developers to gain keyword visibility, downloads and retention on the Apple App Store and Google Play Store.&#8230;]]></description>
										<content:encoded><![CDATA[
<p><a href="https://blog.gummicube.com/2019/12/what-is-aso-get-started-optimizing-your-app/">App Store Optimization</a> (ASO) is important for app developers to gain keyword visibility, downloads and retention on the Apple App Store and Google Play Store. ASO can provide an <a href="https://www.xojo.com/">app developer</a> with the insights into keyword visibility, best practices for designing app pages and mobile marketing strategies. A good ASO strategy will help drive users to the app and convert to installations from high quality users at a low overall cost.</p>



<p>There are several key aspects to App Store Optimization. One must assess all of them to fully understand what ASO is and why it’s important.</p>



<p><strong>What is ASO?</strong></p>



<p>App Store Optimization is the process of improving the entire marketing funnel of an app. This includes optimizing metadata to increase organic search impressions, running creative A/B testing to improve conversion across all marketing channels and aligning organic and paid campaigns to improve the overall cost per install (CPI) of a campaign. Yet this is just the tip of the iceberg; the optimization process is an in-depth analysis of all aspects of the app and user behavior on the app stores.</p>



<p>ASO is critical to any app marketing program as it sets the foundation for success. This can help apps get off the ground or provide new vitality for existing apps. The process includes optimizing keywords, designing an app listing to maximize conversions, retaining users and running researched and efficient paid marketing campaigns.</p>



<p><strong>Keyword Optimization</strong></p>



<p>One of the first aspects of the App Store Optimization process is optimizing your product page and the keywords you want the app to appear in searches for. The goal here is to improve your app’s discovery in search results. This is important since the majority of app discovery happens in search results, making it a vital channel for an app to reach new users.</p>



<p>Users typically search for terms focused on functionality, features or specific brands. With that in mind, the app metadata should include terms related to the functionality, demographics and branding. A photo editing app will want to focus on editing and photography terms, a streaming app on live stream and video terms, an app related to a popular brand will want to leverage its name recognition and so forth.</p>



<p>At the same time, not all terms are equally valuable. It is important to identify what terms have the highest relevance and search volume. Doing so requires accurate data sets using mobile search volume. Using web search volume, which only has a 20% overlap with mobile search, risks targeting terms with little to no value.</p>



<p>After the metadata is updated, it may take some time for the store to index the app. On average, this takes up to 30 days on the App Store and 45 days on Google Play. After this point, it is recommended to update again in order to continue helping the app index for keywords.</p>



<p><strong>Conversion Optimization</strong></p>



<p>Conversion optimization is another aspect of ASO that will help your app gain installs. One goal of conversion optimization is to improve your click-through rate (CTR). This signals to the stores that users are finding your app relevant for its keywords, thus increasing organic ranking and providing further visibility. Apps compete for clicks on a keyword-by-keyword basis, so the amount of clicks an app receives for each keyword plays a big role in how it ranks compared to the competition.</p>



<p>While keyword optimization focuses on organic search visibility, conversion optimization can help increasing app installs across all channels, including paid.</p>



<p>Conversion optimization takes place in both search results and product page. It requires designing all aspects of the app listing and testing to create variants that result in the maximum number of installs. This includes anything visible to the user that may impact conversion, such as the icon, title, screenshots, video and description.</p>



<p>When users see an app in the Apple App Store’s search results, they will see the icon, title, subtitle and first one-to-three screenshots. If the app uses portrait mode videos and screenshots, it will display the first three; if it uses landscape mode creatives, it will display the first one. On Google Play, users will see the icon and title, although for mobile games, Google has begun displaying screenshots and videos in the search results as well. The differences between how the platforms display search results and product pages is an important factor to consider when testing creatives.</p>



<p>Conversion optimization requires research into the app market to identify common trends and designs that could be contributing to high conversion rates. After identifying these elements, developers can run A/B tests on their own app listings to determine which variants result in the most installs. Continually testing new iterations helps developers create optimized listings that have a high CTR and conversion rate.</p>



<p><strong>Paid Marketing</strong></p>



<p>In addition to the benefits from advertising, paid marketing is an effective way to supplement your organic visibility. Beyond additional users to your app, paid marketing helps galvanize the store’s algorithms, which can help accelerate your organic indexation.</p>



<p>Apple Search Ads and Google Ads can have a direct impact on how an app ranks for keywords in the respective stores, whereas third party channels such as Facebook or ad network traffic impact how fast you can index for keywords. In both instances, the paid marketing traffic has a positive effect on your organic rankings as well.</p>



<p>The clicks gained from paid marketing helps improve organic rankings, so your traffic can improve even outside of the paid campaigns. The additional organic installs gained from this can potentially lower the overall cost per install.</p>



<p>Ultimately, paid app marketing plays an important role in a mobile marketing strategy. This is why many companies and developers run paid marketing as part of their ASO campaigns.</p>



<p><strong>In-App Retention</strong></p>



<p>Getting installs is an important part of the App Store Optimization process, but it does not end there. The next step is keeping users engaged.</p>



<p>It is key to monitor your in-app retention, including tracking how users are interacting with the app and for how long. These metrics will help you understand your audience’s behavior and where the drop offs are. This can help you retain new users you acquire and bring back users you may have lost.</p>



<p>Additionally, understanding your in-app metrics can help identify any areas where users are encountering hurdles or user retention begins to drop. These are pain points that you can address in updates to improve retention. Uninstalls are factored into app ranking algorithms, so low retention can negatively impact how your app ranks.</p>



<p>Using these metrics as part of the optimization process can help lead to overall improvements to your users’ experiences. That in turn can lead to a higher return on investment (ROI) and positive reviews as the campaigns produce more loyal users.</p>



<p><strong>To Conclude</strong></p>



<p>App Store Optimization (ASO) is the process of developing and improving all aspects of an app and its listing to maximize visibility, downloads and retention, making it critical for any mobile app marketing program. ASO best practices are designed to create the foundation for organic discovery and improve the efficiency of traffic leading to the app.</p>



<p>In order to properly implement an App Store Optimization strategy, it is critical that developers optimize for visibility, conversions and retention, as well as invest in paid marketing. Employing the right data and methodology can help lead to the highest quality users at the lowest cost and provide an app with the growth and visibility it needs to thrive. App Store Optimization can make the difference between an unknown app and the next success story.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>In-App Purchases Tutorial on iOS</title>
		<link>https://blog.xojo.com/2019/12/19/in-app-purchases-tutorial-on-ios/</link>
		
		<dc:creator><![CDATA[Ryan Hartz]]></dc:creator>
		<pubDate>Thu, 19 Dec 2019 10:00:00 +0000</pubDate>
				<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Sandboxing]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=6323</guid>

					<description><![CDATA[This guide is going to walk you through the steps to set up in-app purchases in your iOS apps. It may be best to get&#8230;]]></description>
										<content:encoded><![CDATA[
<p>This guide is going to walk you through the steps to set up in-app purchases in your iOS apps. It may be best to get things set up first on Apple’s side, following with the app configurations in Xojo.</p>



<h3 class="wp-block-heading"><a href="http://developer.apple.com">Apple Developer</a></h3>



<ol class="wp-block-list"><li>Go into Certificates, Identifiers, &amp; Profiles.</li><li>Select Identifiers on the left.</li><li>Click the plus sign to add a new identifier.</li><li>Select App ID and hit Continue to Register an App ID.</li><li>Choose iOS under Platform, enter a Description, and enter an ExplicitBundle ID. This must be the same as your Xojo project’s Bundle Identifier. Make sure In-App Purchase is checked (it should be by default).</li><li>Click Continue, then click Register on the next screen after you verify the information.</li></ol>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="308" src="https://blog.xojo.com/wp-content/uploads/2019/12/1-Apple-dev-certs-1024x308.png" alt="" class="wp-image-6339" srcset="https://blog.xojo.com/wp-content/uploads/2019/12/1-Apple-dev-certs-1024x308.png 1024w, https://blog.xojo.com/wp-content/uploads/2019/12/1-Apple-dev-certs-300x90.png 300w, https://blog.xojo.com/wp-content/uploads/2019/12/1-Apple-dev-certs-768x231.png 768w, https://blog.xojo.com/wp-content/uploads/2019/12/1-Apple-dev-certs-1536x463.png 1536w, https://blog.xojo.com/wp-content/uploads/2019/12/1-Apple-dev-certs-2048x617.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ol class="wp-block-list" start="7"><li>Back in Certificates, Identifiers, &amp; Profiles, make sure you have a physical device listed. This will be used for the IAP test purchase since you cannot test a purchase in Simulator. </li><li>Select Devices on the left. If your device is not listed, click the plus sign to add it. </li><li>Select iOS as the Platform, enter in a name for the device, and enter in the Device ID (UDID). You get the UDID by connecting your phone to the computer, opening Xcode, choosing Window &gt;&gt; Devices and Simulators, right-click on your device listed on the left and select Copy Identifier. </li><li>Copy this into the UDID box in Apple Developer Register a Device.</li></ol>



<h3 class="wp-block-heading">iTunes Connect</h3>



<p>In the Agreements, Tax, and Banking section, make sure you have active agreements for Free Apps and Paid Apps. The process of getting these agreements set up can take a couple of days.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p>Set up the new app:</p>



<ol class="wp-block-list"><li>Go to My Apps and create a new app using the plus sign on the left.</li><li>In the New App box that appears, check the box for iOS.</li><li>Enter a unique name for the app.</li><li>Choose the primary language.</li><li>Choose the Bundle ID created in Apple Developer.</li><li>Enter a SKU number.</li><li>Choose Full Access.</li></ol>
</div></div>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="977" height="1024" src="https://blog.xojo.com/wp-content/uploads/2019/12/2-ITC-new-app-977x1024.png" alt="" class="wp-image-6340" srcset="https://blog.xojo.com/wp-content/uploads/2019/12/2-ITC-new-app-977x1024.png 977w, https://blog.xojo.com/wp-content/uploads/2019/12/2-ITC-new-app-286x300.png 286w, https://blog.xojo.com/wp-content/uploads/2019/12/2-ITC-new-app-768x805.png 768w, https://blog.xojo.com/wp-content/uploads/2019/12/2-ITC-new-app.png 1128w" sizes="auto, (max-width: 977px) 100vw, 977px" /></figure>



<p>To  set up the in-app purchase product select Features at the top, then In-App Purchases on the left. Click the plus sign next to the In-App Purchases and choose which IAP you are using in your app then click Create.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p>There are 3 options when choosing which IAP is right for your app:</p>



<ul class="wp-block-list"><li>Consumable: Think of tokens to buy in a game. Once they’re spent, you need to buy more.</li><li>Non-Consumable: A one-time purchase to unlock a feature</li><li>Subscriptions: Auto-renewing or non-renewing</li></ul>
</div></div>



<p>Fill out the necessary data on the following screen:</p>



<ul class="wp-block-list"><li>Reference Name: This is a name that is not displayed to the user. It is only for your reference.</li><li>Product ID: Enter in the Bundle ID you made in Apple Developer but also include an end tag of the in-app purchase product name. For example, your Product ID might look like com.mycompany.myapp.myinappproduct.</li><li>Check the box for Cleared for Sale (this should be checked by default).</li><li>Choose a pricing tier.</li><li>Scroll down, under App Store Information enter in a Display Name and a Description. These will be shown to the user.</li><li>Scroll down to Review Information. You can include a screenshot of your app now or you can save your IAP product and add in a screenshot later. If you skip adding a screenshot, you will see a message saying Missing Metadata. This message will go away after you add a screenshot. The screenshot needs to be at least 640&#215;920, which is the size of the iPhone 5s. The screenshot I used is a display of my purchase view in the app. Not sure if that is what they expect, but the app and IAP got approved.</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="393" src="https://blog.xojo.com/wp-content/uploads/2019/12/3-ITC-new-IAP-pt-1-1024x393.png" alt="" class="wp-image-6341" srcset="https://blog.xojo.com/wp-content/uploads/2019/12/3-ITC-new-IAP-pt-1-1024x393.png 1024w, https://blog.xojo.com/wp-content/uploads/2019/12/3-ITC-new-IAP-pt-1-300x115.png 300w, https://blog.xojo.com/wp-content/uploads/2019/12/3-ITC-new-IAP-pt-1-768x295.png 768w, https://blog.xojo.com/wp-content/uploads/2019/12/3-ITC-new-IAP-pt-1-1536x590.png 1536w, https://blog.xojo.com/wp-content/uploads/2019/12/3-ITC-new-IAP-pt-1-2048x787.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p>Next set up your sandbox testers. Choose Users and Access from the top drop-down menu then select Testers on the left under Sandbox. Add at least one sandbox user for testing, preferably two or three so you can try a purchase more than once. Your sandbox user accounts cannot be tied to an Apple ID account. Use a personal email address for yourself that is not with Apple or make a new account in Gmail or Yahoo. After you create a sandbox user, you will need to verify the account in the email box you created, so it is best to create the email account first to make sure it hasn’t been taken.</p>
</div></div>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="640" src="https://blog.xojo.com/wp-content/uploads/2019/12/5-ITC-add-sandbox-user-1024x640.png" alt="" class="wp-image-6342" srcset="https://blog.xojo.com/wp-content/uploads/2019/12/5-ITC-add-sandbox-user-1024x640.png 1024w, https://blog.xojo.com/wp-content/uploads/2019/12/5-ITC-add-sandbox-user-300x188.png 300w, https://blog.xojo.com/wp-content/uploads/2019/12/5-ITC-add-sandbox-user-768x480.png 768w, https://blog.xojo.com/wp-content/uploads/2019/12/5-ITC-add-sandbox-user-1536x960.png 1536w, https://blog.xojo.com/wp-content/uploads/2019/12/5-ITC-add-sandbox-user.png 1782w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Turn on In-App Purchases Xojo</h3>



<ol class="wp-block-list"><li>Under Build Settings in left panel, click iOS. </li><li>Then, in the Inspector, click the Entitlements (gear icon) and move the switch for In-App Purchases to on.</li></ol>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="427" src="https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.12-PM-1024x427.png" alt="" class="wp-image-6363" srcset="https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.12-PM-1024x427.png 1024w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.12-PM-300x125.png 300w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.12-PM-768x320.png 768w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.12-PM-1536x641.png 1536w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.12-PM-2048x854.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ol class="wp-block-list" start="3"><li>Include Jason King’s <a href="https://github.com/kingj5/iOSKit">iOSKit folder</a>. </li><li>In my sample project, I have a ModalPurchaseView to handle the purchase/restore pieces. If you want to activate this the same way, add to your project Jeremie Leroy’s <a href="https://github.com/jkleroy/iOSDesignExtensions">iOSExtensions</a> which has the method to call the modal in a neat way. The ModalPurchaseView from the sample project can be copied to your project and used to cover the purchase/restore functions. Be sure to change the pieces in the code that points to your in-app purchase product, such as com.mycompany.myapp.myIAPproduct</li><li>Build your app with all features, then choose which features you want to be included in your premium version. I have a boolean property ActivatePremium in Module1 to be set to true if the premium is purchased.</li></ol>



<h3 class="wp-block-heading">Testing the In-App Purchase</h3>



<p>You won’t be able to test the IAP in Simulator, so don’t even try. Instead, you will need to test on a physical device.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<ol class="wp-block-list"><li>Build the completed project in Xojo.</li><li>Connect your device to the computer and open Xcode.</li><li>In Xcode, select in the top menu Window &gt;&gt; Devices and Simulators.</li><li>Drag the app from your Builds folder to the bottom pane of the Devices and Simulators window in Xcode. It’s the one with that looks crossed out.</li></ol>
</div></div>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="848" height="668" src="https://blog.xojo.com/wp-content/uploads/2019/12/8-XCode-add-app-to-device-1.png" alt="" class="wp-image-6348" srcset="https://blog.xojo.com/wp-content/uploads/2019/12/8-XCode-add-app-to-device-1.png 848w, https://blog.xojo.com/wp-content/uploads/2019/12/8-XCode-add-app-to-device-1-300x236.png 300w, https://blog.xojo.com/wp-content/uploads/2019/12/8-XCode-add-app-to-device-1-768x605.png 768w" sizes="auto, (max-width: 848px) 100vw, 848px" /></figure></div>



<ol class="wp-block-list" start="5"><li>You will need to sign out of your Apple ID on your device. In the Settings of your device, go into the iTunes &amp; App Store section, click your Apple ID at the top, then click Sign Out.</li></ol>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="206" height="300" src="https://blog.xojo.com/wp-content/uploads/2019/12/9-Device-settings-sign-out.png" alt="" class="wp-image-6349"/></figure></div>



<ol class="wp-block-list" start="6"><li>Open your app and click the Purchase option. You will be asked to sign in. Sign in with your sandbox account you created. After you sign in, you should see a Confirm Purchase [Sandbox Environment] box. Enter in your password and see what happens.</li></ol>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="496" src="https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.22-PM-1024x496.png" alt="" class="wp-image-6364" srcset="https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.22-PM-1024x496.png 1024w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.22-PM-300x145.png 300w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.22-PM-768x372.png 768w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.22-PM-1536x743.png 1536w, https://blog.xojo.com/wp-content/uploads/2019/12/Screen-Shot-2019-12-13-at-4.12.22-PM.png 1872w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div></div>
</div></div>



<ol class="wp-block-list" start="7"><li>If you need to test it again, go back into Settings &gt;&gt; iTunes and App Store, scroll to the bottom, and sign out of the sandbox test account. Try with another account.</li><li>You should also test the Restore function of your IAP. It might be best to test this before testing a purchase to make sure you don’t end up getting the app for free without “purchasing”. When testing your Restore after purchasing, you will need to delete the app from the device and add it back through the Xcode method above in steps 2 through 4.</li></ol>



<p>Credit to Jason King for creating iOSKit and to Jeremie Leroy for his personalized help with helping me get my first iOS app with in-app purchases off the ground. I hope you found this tutorial useful. You can download the project <a href="http://files.xojo.com/Documentation/SampleProjects/My%20IAP%20Sample.xojo_binary_project">here</a>. </p>



<p><em>Ryan Hartz has been a Xojo user for over 10 years.  He is a registered dietitian with no formal education in software development, illustrating that anyone can learn development in Xojo with its ease of use and understandable language.  In 2005, Ryan started his company, <a href="https://visualveggies.com/">Visual Veggies Software</a>, which offers software study guides to young nutrition students preparing to become registered dietitians.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Guest Post: Achieving Success As A Xojo Developer</title>
		<link>https://blog.xojo.com/2019/03/14/guest-post-achieving-success-as-a-xojo-developer/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Thu, 14 Mar 2019 10:00:38 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Guest Post]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=5518</guid>

					<description><![CDATA[I'm often asked by other developers where the opportunities for Xojo developers are, and how to find them. I thought I'd share some of my experiences and observations.]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve spent most of my career developing custom software. I&#8217;ve worked as an in-house developer creating custom &#8220;line of business&#8221; solutions. I&#8217;ve worked for software development firms that provide custom software for clients. And I&#8217;ve primarily been a self-employed custom software developer since first going out on my own in early 2000. Today, a lot of the work that I&#8217;m doing involves developing custom software solutions using Xojo.</p>
<p>I&#8217;m often asked by other developers &#8211; some who are already using Xojo and some who are not &#8211; where the opportunities for Xojo developers are, and how to find them. I also occasionally see these types of questions posted on the Xojo forum by developers who want to use their knowledge of and passion for Xojo to start their own business. So I thought I&#8217;d share some of my experiences and observations.</p>
<p><span id="more-5518"></span></p>
<h4>Custom Solutions</h4>
<p>There are a number of Xojo developers who have been successfully selling commercial software solutions. For example, there&#8217;s <a href="https://www.everwebapp.com">EverWeb</a>, Jeremie Leroy&#8217;s <a href="https://packr.app">Packr</a>, and the amazing color management applications provided by <a href="http://www.chromix.com">CHROMiX</a>, to name just a few.</p>
<p>However, in my case, it&#8217;s all about custom software. Businesses turn to me for highly specialized software that simply doesn&#8217;t already exist. These are solutions that are tailor-made to meet their business needs and fit seamlessly into their processes. One of the many things that I love about Xojo is that regardless of what type of solution a client needs, I can build it for them. With Xojo, I can develop web, desktop, iOS, and even Raspberry Pi apps &#8211; and Android apps will soon be possible as well. But best of all, because Xojo is a rapid application development platform, I can deliver solutions quickly and affordably. And needless to say, clients love that.</p>
<h4>Enhancing SaaS Solutions</h4>
<p>To help reduce costs and increase efficiency, many businesses are moving &#8220;to the cloud.&#8221; They&#8217;re using Software as a Service (SaaS) and Platform as a Service (PaaS) solutions. Oracle&#8217;s NetSuite, a cloud-based ERP system, and SalesForce, are two popular SaaS examples that you may have heard of.</p>
<p>It&#8217;s probably not surprising that this move to SaaS has had a big impact on my business, and you&#8217;re probably thinking it has been a negative impact. But you&#8217;d be wrong. In fact, SaaS has actually opened up new &#8211; and very lucrative &#8211; opportunities for me.</p>
<p>Here&#8217;s why. These services try to be &#8220;all things to all people.&#8221; (Or, more accurately, all things to all businesses). They provide everything from contact management, quoting, order processing, inventory &#8230; you get the idea. And it&#8217;s that breadth of functionality, and the tight integration between those functions, that appeals to many businesses.</p>
<p>However, businesses often find that they have needs that these solutions don&#8217;t address. And that&#8217;s where the opportunities for custom software developers come in. We have the ability to develop external solutions that integrate with SaaS systems. And as I mentioned earlier, with Xojo, we can develop those systems quickly and affordably. It&#8217;s simply a matter of learning how those systems allow integration. At that point, with Xojo, wiring up to them is usually quite easy.</p>
<p>Of all of the opportunities that I&#8217;m running into these days, it&#8217;s the integration with SaaS that has me the most excited.</p>
<h4>FileMaker</h4>
<p>I&#8217;ve been developing with FileMaker for many, many years. At one point, I even wrote a book on it. But back in 2015, I saw changes coming to the platform that lead me to begin move away from it. Increased pricing. Licensing changes, and so on.</p>
<p>Today, while Xojo is my preferred development platform, I am still actively doing FileMaker work as well. But it&#8217;s very different. I very rarely develop new FileMaker databases. Instead, clients &#8211; many of whom are FileMaker developers &#8211; are coming to me and seeking help. Some are looking to make the most of their investments in the FileMaker platform. Others, including several FileMaker developers, are looking to migrate their solutions from FileMaker to Xojo.</p>
<p>While having experience with FileMaker certainly helps, I strongly believe that you don&#8217;t need FileMaker experience to be successful with these projects. The trick, I think, is to think of FileMaker as just another database. Sure, it&#8217;s different from the databases that you&#8217;re probably used to dealing with, like MySQL, SQLite, and so on. But FileMaker is, essentially, a relational database. And if you&#8217;re curious about how you can connect to it from Xojo, check out <a href="https://temperapi.com">Temper</a>, a Xojo-based, open source Web API for hosted FileMaker databases.</p>
<h4>Finding and Attracting These Opportunities</h4>
<p>I&#8217;ve discussed the types of opportunities that I&#8217;m seeing for Xojo developers. But you&#8217;re probably wondering how to actually find these opportunities.</p>
<p>I&#8217;m sure that if you try hard enough, you&#8217;ll eventually stumble upon these opportunities on job boards such as <a href="https://www.upwork.com">UpWork</a> or even Craigslist. But I&#8217;ve found that the best way to get business is to have prospective clients come to you. In other words, don&#8217;t just look for business opportunities, also do things that will attract business opportunities to you.</p>
<p>To do that, you&#8217;ve got to give prospects something to be attracted to. A way to learn more about you, your skills, your experience, and so on.</p>
<p>While I&#8217;m not a fan of social media, I&#8217;ve found that <a href="https://www.linkedin.com">LinkedIn</a> is a great way to network with people, including people that you already know and new business contacts as well. (If you want, connect with <a href="https://www.linkedin.com/in/tim-dietrich/">me on LinkedIn</a>.) Of course, you should also setup a professional Web site. This is becoming increasingly easy to do, with services such as <a href="https://www.squarespace.com">SquareSpace</a> and <a href="https://www.weebly.com">Weebly</a>. And be sure to check out <a href="https://www.everwebapp.com">EverWeb</a>, which I mentioned earlier.</p>
<p>When you get your site in place, consider adding a blog to it. Even if you only post occasionally, I think you&#8217;ll find that it helps to attract prospective clients. My advice: Write about technical topics (that developers like us will understand) as well as topics that a non-technical business person will understand.</p>
<p>I&#8217;m probably one of the shyest people that you&#8217;ll ever meet. However, I really try to move outside my comfort zone by attending conferences and user group meetings. And I&#8217;m really pushing myself when I present at these events. This is a great way to meet other developers, and you never know what might come from making those acquaintances. If I can do it, you can, too.</p>
<p>And finally, you should consider investing in a Xojo Pro license. With Xojo Pro, you not only get the ability to compile your apps for all of Xojo&#8217;s targets (desktop, Web, and iOS), but you&#8217;ll also get access to consulting leads that are posted to a special area of the Xojo Forum. My investment in Pro has more than paid for itself.</p>
<h4>Wrapping Up</h4>
<p>Whether you&#8217;re a Xojo developer that is already doing development for a living, or a developer that is considering it, I hope that the experiences, observations, and tips and tricks that I&#8217;ve shared will help you achieve success. If you have any questions, feel free to reach out to me on the Xojo <a href="https://forum.xojo.com">forum</a>. And I hope to meet you at <a href="https://www.xojo.com/xdc/">XDC</a>.</p>
<p><i>Tim Dietrich is a custom software developer based in Richmond, Virginia. To learn more, visit: <a href="https://timdietrich.me/" target="_blank" rel="noopener" data-saferedirecturl="https://www.google.com/url?q=https://timdietrich.me&amp;source=gmail&amp;ust=1552488320387000&amp;usg=AFQjCNEDiwUxo_XLnpKX-Bt3nL8FIQTxZA">https://timdietrich.me</a></i></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Name Your App</title>
		<link>https://blog.xojo.com/2018/07/25/name-your-app/</link>
		
		<dc:creator><![CDATA[Dana Brown]]></dc:creator>
		<pubDate>Wed, 25 Jul 2018 10:00:27 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Development]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Social Media Marketing]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=4559</guid>

					<description><![CDATA[There’s a lot of thought that goes into picking the best name for your app. The ideal name sets the right tone, clarifies the purpose, and makes it easy to rank and market your app. Here are key strategies that help you get started.]]></description>
										<content:encoded><![CDATA[<p class="p1"><span class="s1">Naming your app may seem like the last step and the easiest part of the process, but it actually should involve some careful thought and consideration. A name needs to set the right tone for your app, should relate to it in some way, and should be searchable, meaning something that can be found easily in search engines. For example, you don’t want to name your app TravelTips &#8211; there are thousands of google searches that will come up before your app. You want a name you can own. </span></p>
<p class="p1"><span class="s1">When we changed our name from Real Studio to Xojo, we wanted to make sure we could find a name that we could own. Not only was Xojo a pretty wide open space in terms of search, but it also stands for something that describes what Xojo is &#8211; X is for Cross-platform and “OJO” is for Object-Oriented.</span></p>
<p><span id="more-4559"></span></p>
<p class="p1"><span class="s1"><b>Be Your Own App Name Generator</b></span></p>
<p class="p1"><span class="s1">It’s never too early to start the process. Your name might morph or change several times during the process, so the more time you have to think about it, the better.<span class="Apple-converted-space"> </span>All you need is pencil &amp; paper (or a notes app) and some time to start brainstorming. Start your list by answering the following questions.</span></p>
<ol class="ol1">
<li class="li1"><span class="s1">What is the main purpose of your app?</span></li>
<li class="li1"><span class="s1">Who is the target audience?</span></li>
<li class="li1"><span class="s1">What’s the value proposition?</span></li>
</ol>
<p class="p1"><span class="s1">Write down every word that comes to mind. When you’re done, you have a great bank of words to brainstorm with.</span></p>
<p class="p1"><span class="s1"><b>First Impressions Really Do Matter</b></span></p>
<p class="p1"><span class="s1">They say don’t judge a book by the cover, but … we do. We are more attracted to things that catch our eye. The name of your app and the icon are the first interaction a prospect user has with your app, it’s sort of like its book cover, it’s what makes people stop and think, “Oooh this is nice&#8230; Is this app right for me?”</span></p>
<p class="p1"><span class="s1">While reviewing your list of words, start thinking about images and emotions that will resonate with your audience. Conduct some research to find descriptive words and imagery that correlate to your app, ask your friends, get input from potential users.</span></p>
<p class="p1"><span class="s1">Pro tip: <i>Make sure you research the meanings and different connotations of your words to make sure they make sense for your intended audience. Avoid words that evoke negative emotions. </i></span></p>
<p class="p1"><span class="s1"><b>Make It Recognizable</b></span></p>
<p class="p1"><span class="s1">Try to find a name that might reveal the literal purpose of your app. In general, when a user can understand the point of your app just by the icon and name, they’re more successful. Names like Evernote and GrubHub are good examples of this. They are short and catchy, but also describe exactly what the app is or does. If your app can’t really be summarized, make sure the icon clearly and visually describes its purpose so they work together to catch the prospective user. Instagram is a good example of this &#8211; the name does not necessarily describe what it does, but coupled with it’s camera icon, it conveys the purpose of the app, that it has something to do with photos. App stores also give preference to names that are not totally arbitrary and appropriately describe the apps purpose.</span></p>
<p class="p1"><span class="s1">Pro tip: <i>If you are trying to put two words together that need to be pronounced separately (example &#8211; Instagram vs. GrubHub), it is recommended to use camel case, rather than all caps.</i></span></p>
<p class="p1"><span class="s1">Though you do want to use words that describe your app, make sure you aren’t <a href="https://support.google.com/webmasters/answer/66358?hl=en">keyword stuffing</a>. Picking applicable, even high traffic keywords, to go in your title is a good thing, but too many or too much repetition actually detracts from your preference and ranking. <a href="https://adwords.google.com/home/resources/using-google-adwords-keyword-planner.html#?modal_active=none">Google Keyword Planner</a> is a great free tool to start your keyword search.</span></p>
<p class="p1"><span class="s1">Its common for consumers to download an app just because it sounds interesting or fun, so try to find a name and design to make your app stand out.</span></p>
<p class="p1"><span class="s1"><b>Do Market Research</b></span></p>
<p class="p1"><span class="s1">Don’t forget to check out your competition. See what others are doing, without duplicating their name or icon, of course. Identify what emotions their name and icon emote, are the words you use to describe them the same as what is on your list? Is there something you missed that you might want to add? Maybe you might see something that really works you want to try to incorporate into yours, maybe you’ll see some things that really don’t work, like a specific icon, word or color palette. But, make sure to differentiate your app from the rest. Your app could be outright rejected from an App Store if the name is too similar to other apps that are already there.</span></p>
<p class="p1"><span class="s1">Pro tip: <i>Make sure the name you choose is not <a href="https://www.uspto.gov/trademarks-application-process/search-trademark-database">trademarked</a> by anyone else.</i></span></p>
<p class="p1"><span class="s1"><b>Other Considerations</b></span></p>
<p class="p1"><span class="s1">In searching for your name, take a look to see if you can also get a reasonable domain and and social media account. If the name of your app is not available as a domain, don’t discount it, there are variations you can consider for your name (like <a href="http://GoXojo.com"><span class="s2">GoXojo.com</span></a> or <a href="http://XojoApp.com"><span class="s2">XojoApp.com</span></a>). </span></p>
<p class="p1"><span class="s1">There’s a lot of thought that goes into picking the best name for your app. These strategies only just scratch the surface. The ideal name sets the right tone, clarifies the purpose, and makes it easy to rank and market your app. </span></p>
<p class="p1"><span class="s1">Good luck with your name-storming!</span></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>App How To: Packaging, Selling &#038; Marketing</title>
		<link>https://blog.xojo.com/2018/07/16/how-to-selling-your-xojo-apps/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Mon, 16 Jul 2018 13:00:00 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Add-Ons]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Developer Marketing]]></category>
		<category><![CDATA[Ohanaware]]></category>
		<category><![CDATA[Social Media Marketing]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2013/09/25/how-to-selling-your-xojo-apps/</guid>

					<description><![CDATA[In this long read blog post, we'll walk you through packaging your app for distribution, offering your app on your website and and app marketplaces for sale, as well as first steps to marketing your app.]]></description>
										<content:encoded><![CDATA[<p>Are you ready to sell your app? Whether you have a web app, desktop or mobile app, it&#8217;s time to think about how to package and distribute that app, how get the word out and, of course, how to get paid for sales.</p>
<p>In this #longread blog post, we&#8217;ll walk you through preparing your app for distribution, offering your app on your website and in app marketplaces for sale, as well as first steps to marketing your app.</p>
<p><span id="more-64"></span></p>
<p>When designing a commercial app for sale, an important thing you need to consider is how you will get the app to people who buy it.</p>
<h2 style="text-align: center;">Packaging Your App for Distribution</h2>
<p>Desktop and mobile apps will need to be distributed, whereas a web app usually requires the user set up a log in and sign up for a subscription and is not distributed separately.</p>
<h3>Mobile Apps</h3>
<p>To package your iOS app you&#8217;ll need an <a href="https://blog.xojo.com/2015/06/16/apple-combines-ios-and-mac-developer-programs/">Apple Developer account</a> to generate the certificates and provisioning profiles required by Apple. After that is set up, go to the iOS Build Settings and turn on the switch for Build For App Store and Build your app. This creates a special ipa file that can be submitted to the App Store using App Connect. You can read the steps in more detail here: <a href="http://developer.xojo.com/userguide/ios-app-store">Submitting to the App Store</a></p>
<p>You can also <a href="https://blog.xojo.com/2015/12/03/deploy-ios-apps-to-your-devices-without-an-apple-dev-membership/">read this earlier post</a> on how deploy iOS apps to your devices without an Apple Developer Membership.</p>
<h3>Desktop Installers</h3>
<p>You&#8217;ll definitely want to use an installer to distribute your Windows apps. We&#8217;ve previously blogged before about free and paid options for <a href="https://blog.xojo.com/2014/06/12/creating-installers-for-windows-apps/">Windows installers in detail</a>.</p>
<p>On macOS, many apps are distributed as simple ZIP files that you can create from the Finder. Or you can use Disk Utility (or another utility such as <a href="http://www.araelium.com/dmgcanvas/" target="_blank" rel="noopener noreferrer">DMG Canvas</a>) to create a DMG (disk image). If you need an installer on macOS, which is not often the case, try <a href="http://s.sudre.free.fr/Software/Packages/about.html">Packages</a> or PackageMaker (included with Xcode).</p>
<p>On Linux, you can also distribute your apps as ZIP files or you can take the more complicated route of creating a specific distribution file (deb or rpm) for the versions of Linux you target.</p>
<h3>Demo Mode or Limited Free Trial</h3>
<p>People like to download and try out software before purchasing. We highly recommend that you offer some features of your app for free or for a limited free trial to entice people to give your app a shot.</p>
<p>For iOS apps, the App Store does not have great support for demo or trial apps. One option is to make two versions of your app: one that is a free demo and one that is a paid app. Another option is to make your app a free download and to use in-app purchase to unlock the full version.</p>
<p>Desktop and web apps offer more options regarding demos and trials so think about what will work best for your app. Do you want a free demo version? Will you limit the demo by time (14 and 30 days are common) or by number of uses (4 free uses)? Another common option is to limit the app to running with some feature limitations if no license key is entered. You can even combine the two so that a trial reverts to a demo after the trial expires.</p>
<p>Regardless of what you choose, you&#8217;ll need to make sure this is all designed into your app before you release it.</p>
<h3>License Keys &amp; Serial Numbers</h3>
<p>Often, an essential part of commercial software is generating license keys or serial numbers. When a customer purchases your app, you can provide a license key to unlock the full features of your app or stop the timer on a time-limited trial. You can build your own license key generation and verification functions into your app. This is relatively simple to do by creating a web service with a Xojo web app. Two solutions that can help you get started are <a href="http://www.tempel.org/UsingAquaticPrime" target="_blank" rel="noopener noreferrer">AquaticPrime</a> and <a href="https://github.com/paullefebvre/regcode">RegCode</a>.</p>
<p>If you are need to save time, look into developed solutions offered in the Xojo <a href="https://www.xojo.com/store/#addons">Add-Ons Store</a> such as the <a href="https://blog.xojo.com/2018/06/26/software-distribution-simplified-with-guanchemos/">GuancheMOS Plugin</a>, a cross-platform serial number creation and validation engine, for Windows check out Quick License Manager for licensing trials for perpetual or subscription licenses.</p>
<h2 style="text-align: center;">Selling Your App</h2>
<p>Once you have your app packaged to distribute, you&#8217;ll need places to sell it and ways to get paid.</p>
<h3>Selling on your Website</h3>
<p>You should definitely have a Web site with a specific landing page that talks about the product and shows the price.  This makes is easier for your page to be found when searching the web. A landing page is a stand-alone page that includes highlights of what your app offers, your demo video and a call to action. (<a href="https://blog.hubspot.com/blog/tabid/6307/bid/7177/what-is-a-landing-page-and-why-should-you-care.aspx">Learn more</a> about landing pages.) Make the page&#8217;s focus your &#8220;call to action&#8221;, whether that is to watch the demo video, download or purchase the app, or to create an account.</p>
<p>Even if you only have an iOS app that is sold via the App Store, a landing page is useful, some say essential, making it easier for people to find your app and for you to share it on social media.</p>
<h3>Selling at a Marketplace</h3>
<p>In addition to selling on your website, you may want to investigate getting your app into an appropriate app store. App stores are often where people look first for apps, plus most app stores make it really simple for users to install and upgrade apps. And they make getting paid a lot simpler. However, App Stores can take a percentage of the sale (commonly 30%) and may have significant restrictions and a lengthy approval process before your app can be ready for sale.</p>
<p>If you are selling a macOS app, you might want to make it available in the Apple&#8217;s Mac Store. Here are some examples of <a href="https://blog.xojo.com/2013/07/08/xojo-apps-in-the-mac-app-store/">Xojo apps in the Mac Store</a>. For iOS apps the only option is the App Store and we&#8217;ve blogged about how to get your <a href="https://blog.xojo.com/2015/08/21/getting-your-ios-apps-into-the-app-store/">Xojo iOS apps in the App Store</a>.</p>
<p>To sell something in either the App Store or Mac App Store you need to be a member of the $99 <a href="http://blog.xojo.com/2015/06/16/apple-combines-ios-and-mac-developer-programs/">Apple Developer Program</a>. You also have give Apple 30% of each sale, wait for them to approve your app for sale and wait for approvals for any app updates. The <a href="http://www.ohanaware.com/appwrapper/">App Wrapper tool</a> can help make it easier to package your Mac apps to sell in the Mac App Store.</p>
<p>Of course there is the <a href="https://www.microsoft.com/en-us/store/appsvnext/windows">Windows Store</a> for your Windows apps. If you use <a href="https://www.advancedinstaller.com">Advanced Installer</a>, the <a href="https://www.advancedinstaller.com/user-guide/desktop-bridge-setup-converter.html">Desktop Bridge Setup Converter</a> can be used to convert an installer to one that is compatible with the Windows Store. More information is available in this article: <a href="http://scispec.ca/index.php/books/34-build-an-appx-installer-for-microsoft-store-with-xojo">Build an AppX Installer for Microsoft Store with Xojo</a>.</p>
<p>If you are selling a Xojo-related tool, library or plugin, another option is to sell it in the Xojo Store in the Add-On Product section. There is no charge for this and you get to keep 70% of the sale. <a href="../../../../../../com/xojo/blog/index.html">Contact us</a> if you are interested.</p>
<h3>Getting Paid</h3>
<p>With apps sold in the app stores you&#8217;ll get paid by the store guidelines, usually once a month for the previous month&#8217;s sales, though some store may set a minimum payment before they pay up.</p>
<p>For desktop apps or web apps that have subscriptions you&#8217;ll need a way to handle payments. Rather than setting up your own merchant account and dealing with that, it&#8217;s increasingly common to use an existing payment processing service like <a href="https://www.paypal.com" target="_blank" rel="noopener noreferrer">PayPal</a> or <a href="http://www.fastspring.com" target="_blank" rel="noopener noreferrer">FastSpring</a>.</p>
<p>If you are not already familiar with how PayPal works, you can learn more <a href="https://www.paypal.com/us/smarthelp/article/how-do-i-get-paid-faq1750">here</a>. FastSpring lets you create a &#8220;store&#8221; with your products, pricing, a shopping cart, currency conversion and will take payments from credit cards and other means. FastSpring takes 8.9% per transaction with a minimum order fee of $0.75 or 5.9% + $0.95 per transaction; <a href="https://www.paypal.com/us/webapps/mpp/paypal-fees">PayPal is 2.9%</a> + $0.30 per transaction (rates from July 2018).</p>
<p>Regardless of the service you use, you will need to hook it up to an account to receive payment. Typically you hook it up to a checking account or PayPal. Other services you might want to check out include: <a href="https://gumroad.com" target="_blank" rel="noopener noreferrer">Gumroad,</a> <a href="https://stripe.com" target="_blank" rel="noopener noreferrer">Stripe</a>, <a href="http://www.usepaddle.com" target="_blank" rel="noopener noreferrer">Paddle</a>, and <a href="https://www.2checkout.com" target="_blank" rel="noopener noreferrer">2CheckOut</a>.</p>
<h2 style="text-align: center;">Marketing Your App</h2>
<p>Now your app is packaged and available for sale on your website and an app marketplace or two. How do you get the word out? Here are 3 <em>musts</em> when it comes to app marketing:</p>
<h3>Press Release</h3>
<p>You&#8217;ll need a Press Release that announces your app, explains what your app does and why people should buy it &#8211; here&#8217;s a <a href="https://coschedule.com/blog/how-to-write-press-releases/#outline">template and example</a>.</p>
<p>For a small fee, services like <a href="https://www.prnewswire.com/">PR Newswire</a> will send out your press release to a wide variety of websites for you. We also want to help promote your #XojoMade app! Email your press release to <a href="../../../../../../com/xojo/blog/index.html">pr@xojo.com</a> and we&#8217;ll post it on the <a href="https://forum.xojo.com/conversations/announcements">Announcements</a> channel in the forum and share it on <a href="https://twitter.com/xojo">Twitter</a>.</p>
<h3>Demo Video</h3>
<p>Yes, you should definitely have a demo video! Either more of a traditional software demonstration, a commercial that lists your app&#8217;s top selling points or some combination of the two. Keep it short and sweet &#8211; feel free to follow up with a longer, more in-depth video, but to grab perspective users you&#8217;ll want something less than a minute. Video is much more digestible and easy to share than the written word and you can <a href="https://blog.hubspot.com/marketing/make-a-marketing-video">create a good one</a> on your own.</p>
<h3>Outside Listings &amp; Reviews</h3>
<p>Get your product listed on app download services, such as <a href="https://www.macupdate.com" target="_blank" rel="noopener noreferrer">MacUpdate</a> or <a href="http://download.cnet.com" target="_blank" rel="noopener noreferrer">Download.com</a>. Once listed, you&#8217;ll want reviews because one of the most trusted forms of marketing is word of mouth. You believe the word of a colleague over that of a commercial, right? Ask your users to post honest reviews of your app in app marketplaces and on third party sites. If your app is new, or just needs the reviews, think about offering a discount or swag for a review.</p>
<h3>Now What? More Marketing Tips from Dana and Alyssa</h3>
<p>Here are some great posts to explore simple and often free options for marketing your apps:</p>
<div><a href="https://blog.xojo.com/2017/06/29/free-marketing-4-practical-tips-for-developers-new-to-twitter/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://blog.xojo.com/2017/06/29/free-marketing-4-practical-tips-for-developers-new-to-twitter/&amp;source=gmail&amp;ust=1529168451724000&amp;usg=AFQjCNGqP9YZLFau25CucRprxMbV6KAtng">Free Marketing! 4 Practical Tips for Developers New to Twitter</a></div>
<div><a href="https://blog.xojo.com/2017/09/05/recording-ios-demos/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://blog.xojo.com/2017/09/05/recording-ios-demos/&amp;source=gmail&amp;ust=1529168451724000&amp;usg=AFQjCNGeSLm8YLYe75PBW3lXrWOx28H_Fg">How to Record Video Demos for your iOS Apps</a></div>
<div><a href="https://blog.xojo.com/2017/11/16/8-ways-to-market-your-app-for-free/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en&amp;q=https://blog.xojo.com/2017/11/16/8-ways-to-market-your-app-for-free/&amp;source=gmail&amp;ust=1529168451724000&amp;usg=AFQjCNHHck5L1dhcywvr-Le4yHnPkTF4vQ">8 Ways to Market Your App for Free</a></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>8 Ways to Market Your App for Free</title>
		<link>https://blog.xojo.com/2017/11/16/8-ways-to-market-your-app-for-free/</link>
		
		<dc:creator><![CDATA[Dana Brown]]></dc:creator>
		<pubDate>Thu, 16 Nov 2017 10:45:12 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Developer Marketing]]></category>
		<category><![CDATA[Social Media Marketing]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2653</guid>

					<description><![CDATA[You don’t need a huge budget to get the word out about your app. Here are 8 steps to market your app for free. Be a little creative and willing to invest some of your own time into making things happen!]]></description>
										<content:encoded><![CDATA[<p>Though marketing may not be your forte, there are things you can do that are very effective in promoting your app and building your customer base. You can try some of the paid options and get varying results, but there are many free things you can do that can have a huge impact. We&#8217;ve already blogged about using <a href="https://blog.xojo.com/2017/06/29/free-marketing-4-practical-tips-for-developers-new-to-twitter/">Twitter to market your app</a> for free.</p>
<p>Here’s a list of 8 additional ways your marketing team of 1 can promote your app at no cost:</p>
<p><span id="more-2653"></span></p>
<p><strong>1. Build a small website</strong></p>
<p>Don’t compare your app or your website to the big fish in the market. You don’t need to have a big, fancy site to get started. Create a simple website (just 1-2 pages to showcase your app) or even use a pre-made template or website builder like <a href="https://www.everwebapp.com/">Everweb</a>, which is made with Xojo, to pre-announce your app. Launch your website about a month or two before you plan on releasing your app and collect email addresses of people who might be interested in hearing from you when your app launches. Keywords are important for search engines, so make sure that you play up keywords about your app when writing your text.</p>
<p><strong>2. Have a blog</strong></p>
<p>Blogs can be a great way to to attract readers and draw them into your website. Start a blog and update it often with content that relates to your audience. Do make a schedule for the month with the blog posts you think you can put together. Don’t fill your blog with filler content that has nothing to do with why your your readers visit your blog. Think about what they’d want to learn more about, or comment on industry news, talk about your app development progress or anything relevant.</p>
<p><strong>3. Share your content</strong></p>
<p>Use your social media outlets like <a href="https://twitter.com/xojo">Twitter</a>, <a href="https://www.facebook.com/goxojo/">Facebook</a>, <a href="https://www.linkedin.com/company/xojo/">LinkedIn</a> to promote your app, blog posts, product updates, etc. at least several times a week.</p>
<p><strong>4. Create a product video</strong></p>
<p>Become your own video editor! Make a short, creative video to showcase your app and what it can do. Shoot for a funny or thought-provoking theme for your video. Share your video on <a href="https://www.youtube.com/user/goxojo">YouTube</a> and link to it via other social media channels.</p>
<p><strong>5. Contact bloggers</strong></p>
<p>Find bloggers who write about topics that relate in some way to your app or who are interested in app development, technology, etc. For example, if your app has something to do with music recording, contact bloggers that cater to musicians.</p>
<p><strong>6. Always be collecting emails</strong></p>
<p>An email list of people who have opted in (given their express permission to hear from you) can be a powerful marketing tool. Gather potential customer emails through social media sites and your website. You can use tools like <a href="https://mailchimp.com/">Mail Chimp</a> or <a href="https://www.constantcontact.com/account-home">Constant Contact</a> to email your audience.</p>
<p><strong>7. Use your email signature</strong></p>
<p>This is often a missed opportunity, but your email signature is something that everyone you talk to sees and a great way to make sure you share a message with everyone. Provide a catchy short description of your app with a download link below your signature block to help your contacts know what you’re up to and get them to visit your website. All of your contacts could be potential customers!</p>
<p><strong>8. Run a contest or promotion</strong></p>
<p>Encourage people to tweet and share content on their social networks promoting your app. A random person each week can win a coupon to download your app for free, for example. Alternatively, run a contest to win a discount coupon for people who opt into your mailing list and build up your email database. Another idea is to offer a code to people who like your Facebook page or follow your Twitter account to grow your online community.</p>
<p>You don’t need a huge budget to get the word out about your app. There are so many things you can do to market your app for free, with a little creativity and will to invest some of your time into promoting your app! Join us at the <a href="http://www.xojo.com/xdc">Xojo Developer Conference</a> for more tips and information on how to market your Xojo app.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How To Record Video Demos for your iOS Apps</title>
		<link>https://blog.xojo.com/2017/09/05/recording-ios-demos/</link>
		
		<dc:creator><![CDATA[Geoff Perlman]]></dc:creator>
		<pubDate>Tue, 05 Sep 2017 10:00:00 +0000</pubDate>
				<category><![CDATA[Dev Marketing]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Marketing]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Developer Marketing]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Social Media Marketing]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/09/30/recording-ios-demos/</guid>

					<description><![CDATA[If you are making commercial iOS apps, you'll want a video demo. Video demos can be added to the app store and are great to use in multi-platform marketing and promotions. Keep in mind, a demo is typically short, definitely less than 1 minute and should highlight the core benefits of your app.

For some apps, you can just record the iPhone or iPad screen with another camera especially if you feel you need to show an actual finger doing the tapping. In most cases, however, that's not necessary and a actual screenshot video would be more effective.]]></description>
										<content:encoded><![CDATA[<p>If you are making commercial iOS apps, you&#8217;ll want a video demo. Video demos can be added to the app store and are great to use in multi-platform marketing and promotions. Keep in mind, a demo is typically short, definitely less than 1 minute and should highlight the core benefits of your app.</p>
<p>For some apps, you can just record the iPhone or iPad screen with another camera especially if you feel you need to show an actual finger doing the tapping. In most cases, however, that&#8217;s not necessary and a actual screenshot video would be more effective.</p>
<p><span id="more-313"></span></p>
<p>The easist way to record your iOS device for a demo is with the Quicktime Player on macOS. This feature was added in macOS Yosemite.</p>
<ol>
<li>Plug your iOS device into your Mac.</li>
<li>Launch QuickTime Player.</li>
<li>Choose New Movie Recording from the File menu.</li>
<li>When the Movie Recording window opens, you will see the Record button (a red circle). Next to it is a popup menu icon shaped like a small v. Click that.</li>
<li>Choose your iOS. You&#8217;ll see your device&#8217;s screen appear in the Movie Recording window.</li>
<li>If you&#8217;re going to record your voice while doing the demo, make sure you choose Internal Microphone or use an external one if you have one. Otherwise, the QuickTime Player will default to using the iPhone itself which won&#8217;t sound as good.</li>
<li>You have two choices for the quality level. I suggest using the default choice (High) unless that turns out to be unsatisfactory. For most uses it will be fine and produces much smaller files.</li>
<li>Click Record to record your iOS screen.</li>
<li>Do all the steps for your demo.</li>
<li>When you&#8217;re finished, click the Stop button.</li>
<li>Save your recording and later you can use File -&gt; Export to save in various formats and sizes based upon how you&#8217;re going to use the demo video you&#8217;ve made.</li>
</ol>
<p>Note: The name of the iOS device can be found on the device in Settings -&gt; General -&gt; About -&gt; Name.</p>
<p>The QuickTime Player has some decent functions for clipping and trimming your video as well. If you need titles and more sophisticated features for your demo video, iMovie or Final Cut are great solutions.</p>
<p><img loading="lazy" decoding="async" class="alignleft wp-image-3320 size-full" src="https://blog.xojo.com/wp-content/uploads/2015/09/Screen-Shot-2017-08-29-at-2.29.49-PM.png" alt="" width="658" height="450" /></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Xojo Draw in the App Store</title>
		<link>https://blog.xojo.com/2016/10/12/xojo-draw-in-the-app-store/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 12 Oct 2016 19:10:15 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Learning]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1981</guid>

					<description><![CDATA[Want to see how easy it is to make an iOS app with Xojo? Check out Xojo Draw in the App Store. Released last week&#8230;]]></description>
										<content:encoded><![CDATA[<p>Want to see how easy it is to make an iOS app with Xojo? Check out <a href="https://itunes.apple.com/us/app/xojo-draw/id1159010053?mt=8">Xojo Draw in the App Store</a>. Released last week at the start of <a href="https://blog.xojo.com/2016/10/11/xdc-2016-recap/">XDC 2016</a>, Xojo Draw is an enhanced version of the Xojo Doodle sample project that is included with Xojo. Working on both iPhone and iPad, Xojo Draw lets you draw with touch and save your creations to the camera roll or send to other apps.</p>
<p><span id="more-1981"></span></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1983" src="https://blog.xojo.com/wp-content/uploads/2016/10/2016-10-12_10-09-13.png" alt="2016-10-12_10-09-13" width="600" height="649" /></p>
<p>In addition, to help you learn how you can create your own iOS apps, the <a href="https://github.com/xojo/XojoDraw">full source code for Xojo Draw is on GitHub</a> (click the Clone or Download button to get it)! Grab the free version of <a href="http://www.xojo.com/download">Xojo</a> and the Xojo Draw source code to see for yourself how you can quickly start creating your own iOS apps.</p>
<p>And stay tuned for more Xojo-made apps to appear in the App Store, along with full source code to help you get coding with Xojo iOS!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>App Transport Security for iOS</title>
		<link>https://blog.xojo.com/2016/07/27/app-transport-security-for-ios/</link>
					<comments>https://blog.xojo.com/2016/07/27/app-transport-security-for-ios/#comments</comments>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 27 Jul 2016 07:10:36 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=1440</guid>

					<description><![CDATA[Last year with iOS 9, Apple announced a new security requirement for your iOS and OS X apps: App Transport Security. From Apple&#8217;s docs: Starting in&#8230;]]></description>
										<content:encoded><![CDATA[<p>Last year with iOS 9, Apple announced a new security requirement for your iOS and OS X apps: <a href="https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html">App Transport Security</a>.</p>
<p>From <a href="https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33">Apple&#8217;s docs</a>:</p>
<blockquote><p>Starting in iOS 9.0 and OS X v10.11, a new security feature called App Transport Security (ATS) is available to apps and is enabled by default. It improves the privacy and data integrity of connections between an app and web services by enforcing additional security requirements for HTTP-based networking requests. Specifically, with ATS enabled, HTTP connections must use HTTPS (RFC 2818). Attempts to connect using insecure HTTP fail. Furthermore, HTTPS requests must use best practices for secure communications.</p></blockquote>
<p>Starting with Xojo 2016 Release 2, this change matters to you because Xojo is now using the updated Apple libraries that have this requirement. Simply stated, it means that if your iOS apps use HTTPSocket or iOSHTMLViewer, then your URLs have to be secure (https). If they are not, you will get an error returned with HTTPSocket and no page displayed in the HTMLViewer.</p>
<p>If you are relying on other services or URLs that do not yet support https, then what do you do? Apple has provided a workaround: you have to specify an exemption in your plist file. In the plist you identify specific URLs for which you want to allow unsecured connections. To do this, create a text file called Info.plist, add this content to it and drag the file to the Navigator to add it to your project:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
  &lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
  &lt;dict&gt;
    &lt;key&gt;NSExceptionDomains&lt;/key&gt;
    &lt;dict&gt;
      &lt;key&gt;firstsite.com&lt;/key&gt;
      &lt;dict&gt;
        &lt;key&gt;NSIncludesSubdomains&lt;/key&gt;
        &lt;true/&gt;
        &lt;key&gt;NSTemporaryExceptionAllowsInsecureHTTPLoads&lt;/key&gt;
        &lt;true/&gt;
      &lt;/dict&gt;
      &lt;key&gt;secondsite.com&lt;/key&gt;
      &lt;dict&gt;
        &lt;key&gt;NSIncludesSubdomains&lt;/key&gt;
        &lt;true/&gt;
        &lt;key&gt;NSTemporaryExceptionAllowsInsecureHTTPLoads&lt;/key&gt;
        &lt;true/&gt;
      &lt;/dict&gt;
    &lt;/dict&gt;
  &lt;/dict&gt;
&lt;/dict&gt;
&lt;/plist&gt;</pre>
<p>Replace the domain names (or add more) based on your needs. You can also allow all unsecured connections, but Apple may reject App Store submissions that use this without valid reasons:</p>
<pre>&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
&lt;dict&gt;
  &lt;!-- Include to allow all connections; avoid if possible --&gt;
  &lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt;
  &lt;true/&gt;
&lt;/dict&gt;</pre>
<p>For additional information, refer to the <a href="http://documentation.xojo.com/topics/application_structure/mobile/using_a_plist.html">Using a plist</a>, <a href="http://documentation.xojo.com/api/deprecated/xojo.net.httpsocket.html">Xojo.Net.HTTPSocket</a> and <a href="http://documentation.xojo.com/api/deprecated/ioshtmlviewer.html">iOSHTMLViewer</a> pages in the docs.</p>
<p>Update (August 10, 2016): Apparently there is a <a href="https://forums.developer.apple.com/thread/6205">bug in iOS</a> that prevents the use of IP addresses in this plist. So to enable http on your local computer for testing use &#8220;localhost&#8221; rather than &#8220;127.0.0.1&#8221; and be sure to use &#8220;http://localhost&#8221; in your URLs instead of &#8220;http://127.0.0.1&#8221;.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.xojo.com/2016/07/27/app-transport-security-for-ios/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>iOS View Navigation Tips</title>
		<link>https://blog.xojo.com/2016/05/18/ios-view-navigation-tips/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 18 May 2016 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[UI]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2016/05/18/ios-view-navigation-tips/</guid>

					<description><![CDATA[Your iOS apps uses Views to display information to the user, learn to use the multiple views to show different information.]]></description>
										<content:encoded><![CDATA[<p>Your iOS apps uses Views to display information to the user and often your app will have multiple views to show different information. These views can be displayed in different ways.</p>
<p><span id="more-293"></span></p>
<h2>PushTo</h2>
<p>The most common way to display new views is to use the <a href="http://developer.xojo.com/iosview$PushTo">PushTo</a> method.</p>
<p>With this method, the new view appears on top of the current view and a &#8220;back&#8221; button is displayed in the Navigation Bar (if it is enabled) to close this new view so that the original view is displayed.</p>
<p><a href="http://files.xojo.com/BlogExamples/PushToExample.xojo_binary_project.zip">Download the PushTo example</a> to see how this works.</p>
<p>Refer to <a href="http://developer.xojo.com/userguide/ios-views">Views</a> in the User Guide to learn more about PushTo.</p>
<h2>Modal View</h2>
<p>A modal view is a view that appears over a view, and is a bit more limited. The user cannot display a new view or go back to the original view until the modal view is closed. To display a modal view in your Xojo iOS apps, you have to use a Declare.</p>
<p><a href="http://files.xojo.com/BlogExamples/ModalView.xojo_binary_project.zip">Download the ModalView example</a> to see how it works.</p>
<p>Refer to <a href="http://developer.xojo.com/userguide/ios-views">Views</a> in the User Guide to learn more about Modal View.</p>
<h2>Change Current Screen</h2>
<p>There are times where you may want to reset the view hierarchy so that the &#8220;back&#8221; feature is not available. An example of this might be an initial login screen displayed by your app. After the user logs in, you will likely want your true main view to replace the login view, but not allow the use of the &#8220;back&#8221; feature to go back to the login view.</p>
<p>A feature (<a href="http://developer.xojo.com/iosapplication$CurrentScreen">iOSApplication.CurrentScreen</a>) added to Xojo in 2016r1 allows you to do that by changing the current screen of the app to point to your new view.</p>
<p><a href="http://files.xojo.com/BlogExamples/NavigationExample.xojo_binary_project.zip">Download the Navigation example</a> to see how it works.</p>
<p>Refer to <a href="http://developer.xojo.com/userguide/ios-views">Views</a> in the User Guide to learn more about this.</p>
<h2>Splits on iPad</h2>
<p>An iPad can be set up with a split view that allows two views to be displayed on the screen at the same time. The view on the left is the &#8220;master&#8221; and the view on the right is the &#8220;detail&#8221;. If you&#8217;ve used Mail on iOS then you&#8217;re familiar with this type of layout.</p>
<p>When you have a split view set up, you can access the base view for the master and detail areas by using the <a href="http://developer.xojo.com/iosview$ParentSplitView">ParentSplitView</a> property of any of the views. ParentSplitVIew is an iOSSplitView with its own properties (Master and Detail) that give you access to the content of the split area.</p>
<p><a href="http://files.xojo.com/BlogExamples/SplitViewExample.xojo_binary_project.zip">Download the SplitVIew example</a> to see how it works.</p>
<p>These tips should help you provide great navigation for your iOS apps. If you have an iOS app in the App Store, be sure to tell everyone in the <a href="https://forum.xojo.com/20331-xojo-made-ios-apps-in-the-app-store">Xojo-made iOS apps in the App Store</a> conversation of the forum and tweet us the link @xojo!</p>
<p>We&#8217;ve got lots of resources to get your iOS app started, <a href="http://developer.xojo.com/ios-guide" target="_blank">check them out</a> or click below to learn about building 64bit iOS apps for the App Store.</p>
<p><!--HubSpot Call-to-Action Code --> <span id="hs-cta-wrapper-effd89b6-76da-4f82-a83a-cd6bd0e73903" class="hs-cta-wrapper"> <span id="hs-cta-effd89b6-76da-4f82-a83a-cd6bd0e73903" class="hs-cta-node hs-cta-effd89b6-76da-4f82-a83a-cd6bd0e73903"><br />
<!-- [if lte IE 8]>


<div id="hs-cta-ie-element"></div>


<![endif]--> <a href="http://blog.xojo.com/2015/02/25/creating-64-bit-ios-apps/" target="_blank"><img loading="lazy" decoding="async" id="hs-cta-img-effd89b6-76da-4f82-a83a-cd6bd0e73903" class="hs-cta-img aligncenter" style="border-width: 0px;" src="https://blog.xojo.com/wp-content/uploads/2015/02/effd89b6-76da-4f82-a83a-cd6bd0e73903.png" alt="Xojo iOS 64bit" width="574" height="128" /></a> </span><script src="https://js.hscta.net/cta/current.js" charset="utf-8">// <![CDATA[
<script type="text/javascript"><![CDATA[ hbspt.cta.load(608515, 'effd89b6-76da-4f82-a83a-cd6bd0e73903', {}); // ]]&gt;</script></span><br />
<!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Getting Your iOS Apps Into the App Store</title>
		<link>https://blog.xojo.com/2015/08/21/getting-your-ios-apps-into-the-app-store/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Fri, 21 Aug 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/08/21/getting-your-ios-apps-into-the-app-store/</guid>

					<description><![CDATA[Submit your Xojo iOS apps to the App Store.]]></description>
										<content:encoded><![CDATA[<p>Since the release of <a href="http://blog.xojo.com/2016/08/31/develop-faster-using-xojo-to-make-ios-apps/">Xojo for iOS</a>, people have been asking if Xojo apps can be listed in the App Store.</p>
<p>The answer is simple: <strong>Absolutely</strong>.</p>
<p><span id="more-275"></span></p>
<p>Of course, you&#8217;ll have to pay heed to Apple&#8217;s rules regarding the Mac App Store and follow their very stringent requirements.</p>
<p>You can review Apple&#8217;s App Store Review Guidelines <a href="https://developer.apple.com/app-store/review/">here</a>. If your iOS app meets these guidelines, you can create your Xojo iOS app and prepare it for submission to the App Store. This does involve generating certificates, IDs, distribution profiles and then uploading to iTunes Connect. Detailed instructions are availble in the <a href="http://documentation.xojo.com/topics/application_deployment/mobile/submitting_to_the_ios_app_store.html">Submitting to the App Store page at the Xojo Dev Center</a>.</p>
<p>I made a simple (and free) Tip Calculator with Xojo that is available in the App Store called TipVue. And lots of other Xojo developers have created iOS apps that are in the App Store. If you would like to see step-by-step instructions on how to submit your iOS app to the App Store, you can also watch this <a href="https://youtu.be/ZsvjEjoYMYU">4 minute video</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>All The Ways: Deploying Your iOS Apps</title>
		<link>https://blog.xojo.com/2015/02/27/deploying-your-ios-apps/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Fri, 27 Feb 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/02/27/deploying-your-ios-apps/</guid>

					<description><![CDATA[We've been getting a lot of questions about available options for deploying iOS apps. Geoff recently wrote about how to deploy iOS apps inside a company, but I'd like to collect all the various ways to deploy your iOS here for quick, easy reference.]]></description>
										<content:encoded><![CDATA[<p>We&#8217;ve been getting a lot of questions about available options for deploying iOS apps.</p>
<p>Geoff recently wrote about how to <a href="http://blog.xojo.com/2015/02/19/deploying-ios-apps-inside-your-company/">deploy iOS apps inside a company</a>, but I&#8217;d like to collect all the various ways to deploy your iOS here for quick, easy reference.</p>
<p><span id="more-189"></span></p>
<h3>Ad-Hoc Deployment to Devices</h3>
<p>With Ad-Hoc Deployment, you build your iOS apps using an iOS Development Profile and manually copy the built app to the device. To create this profile you need to be a member of the <a href="http://developer.apple.com/">Apple Developer Program</a> (currently $99/year from Apple). You can deploy apps built in this manner on up to 100 devices.</p>
<p>There are step-by-step instructions on how to do this, which you can read about in the Xojo User Guide here: <a href="https://documentation.xojo.com/topics/application_deployment/mobile/device_deployment.html">iOS Device Deployment</a>.</p>
<h3>TestFlight</h3>
<p><span style="line-height: 1.62;">For beta testing purposes, you can also use Apple&#8217;s TestFlight server to allow up to 1000 users to install a beta version of your app. Use of TestFlight also requires that you are a member of the iOS Developer Program.</span></p>
<p><span style="line-height: 1.62;">Check out the Xojo Docs for instructions on how to use TestFlight: <a href="https://documentation.xojo.com/topics/application_deployment/mobile/submitting_to_testflight.html">Submitting to TestFlight</a></span></p>
<h3>App Store</h3>
<p>To get your app in the hands of end users, you will typically want to use the App Store. To do so, you will build your app using an iOS Distribution Profile. You will have to be a member of the iOS Developer Program.</p>
<p>Check out the Xojo Docs for step-by-step instructions on how to build and submit an app to the App Store: <a href="https://documentation.xojo.com/topics/application_deployment/mobile/submitting_to_the_ios_app_store.html">Submitting to the iOS App Store</a>.</p>
<h3>Volume Purchase Program</h3>
<p>As <a href="http://www.xojo.com/blog/en/2015/02/deploying-ios-apps-inside-your-company.php">mentioned by Geoff in a previous post</a>, the Volume Purchase Program provides a way for you to distribute apps to businesses or educational institutions without having to publish your app to the App Store. Apple has more information on this program:</p>
<ul>
<li><a href="https://www.apple.com/business/it/">Volume Purchase Program for Business</a></li>
<li><a href="https://www.apple.com/education/k12/it/">Volume Purchase Program for Education IT</a></li>
</ul>
<h3>Enterprise Deployment</h3>
<p>Businesses can use the iOS Developer Enterprise Program to get tools and resources for developing proprietary, in-house iOS apps that you can distribute to your employees. These apps are distributed outside of the App Store.</p>
<p>For more information, visit the <a href="https://developer.apple.com/programs/ios/enterprise/">iOS Developer Enterprise Program</a>.</p>
<h3>Other Options</h3>
<p>Other than jailbreaking your device, we are not aware of other options for deploying apps to iOS devices at this time.<span id="hs-cta-wrapper-effd89b6-76da-4f82-a83a-cd6bd0e73903" class="hs-cta-wrapper"><span id="hs-cta-effd89b6-76da-4f82-a83a-cd6bd0e73903" class="hs-cta-node hs-cta-effd89b6-76da-4f82-a83a-cd6bd0e73903"><br />
</span></span> <!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Guest Post: Solving Sandboxing Issues and Improving Xojo Apps With Ohanaware&#8217;s Sandbox Kit</title>
		<link>https://blog.xojo.com/2015/02/18/guest-post-solving-sandboxing-issues-and-improving-xojo-apps-with-ohanawares-sandbox-kit/</link>
		
		<dc:creator><![CDATA[Xojo]]></dc:creator>
		<pubDate>Wed, 18 Feb 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Ohanaware]]></category>
		<category><![CDATA[Sandboxing]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/02/18/guest-post-solving-sandboxing-issues-and-improving-xojo-apps-with-ohanawares-sandbox-kit/</guid>

					<description><![CDATA[If you want to sell an app in the Mac App Store, the app must adopt the App Sandbox security. Trying to figure out solutions to these new issues often results in much head scratching and consulting with other developers via the Xojo Forums. In this post, I'm going to cover a few Sandboxing issues and how to resolve them with the tools / code that I've built for the apps that we sell.]]></description>
										<content:encoded><![CDATA[<p><em>Sam Rowlands has been developing Xojo apps since 1997. He and his wife, Joy Sha, make up <a href="http://www.ohanaware.com">Ohanaware</a> and they have been building award winning apps since 2008, notably Funtastic Photos, HDRtist and <a href="http://xojo.com/community/casestudies/shine.php">Shine</a>. Sam is an active Xojo developer and he also offers App Wrapper, which simplifies the process of preparing applications for submission to the Mac App Store and deploying on web sites, in the Xojo Third Party Store.</em></p>
<h2><span style="font-size: 20px;"><strong>What is the App Sandbox and why is it a chore?</strong></span></h2>
<p>The App Sandbox is a great end user security concept. The Sandbox governs what an application can and cannot do. This means that a virally infected word processor, cannot go on to infect other applications nor rampantly damage files on the users disk. It can however affect files which the user has created or opened within the word processor.</p>
<p><span id="more-185"></span></p>
<p>The developers&#8217; pain comes from the App Sandbox&#8217;s greatest strength. The app developer must perform additional work, just to reclaim functionality that the App Sandbox took away. If you want to sell an app in the Mac App Store, the app must adopt the App Sandbox security.</p>
<p><strong>Note</strong>: There are some functions which simply cannot be done within a Sandboxed application.</p>
<p>Trying to figure out solutions to these new issues often results in much head scratching and consulting with other developers via the Xojo Forums. I&#8217;ve seen some really creative solutions to reclaim features when using this security mechanism. In this post, I&#8217;m going to cover a few Sandboxing issues and how to resolve them with the tools / code that I&#8217;ve built for the apps that we sell.</p>
<h2><span style="font-size: 20px;"><strong>Chocks away&#8230;</strong></span></h2>
<p>Taking my latest, greatest app, which just so happens to be a really cool Text Editor built with Xojo.</p>
<p>1. If I simply Sandbox the application (using App Wrapper 3, with just the minimum), I can create new documents, but I can&#8217;t save or even open documents.</p>
<p>2. The Recent Items menu no longer works.</p>
<p>3. I personally like apps that re-open the last documents I was working on. The same issue persists, code that used to work, no longer does.</p>
<p>4. Even more scary, is that users can&#8217;t even print- what kind of text editor can&#8217;t print?</p>
<h3><strong>Problems 1 and 4</strong></h3>
<p>We&#8217;ll start with the simplest, problems #1 &amp; #4 are easily resolved with the options (&#8220;Open &amp; Save Panels&#8221; &amp; &#8220;Printer&#8221;) on the &#8220;Capabilities&#8221; panel within App Wrapper.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2015/02/Screenshot%201%20-%20App%20Wrapper%20Settings-574.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2015/02/screenshot20120-20app20wrapper20settings-thumb-400x323-574.pngt1466486449161ampwidth400ampheight323" sizes="auto, (max-width: 400px) 100vw, 400px" alt="Screenshot 1 - App Wrapper Settings.png" width="400" height="323" /></a><strong>Note</strong>: There appears to be a new issue with Yosemite, I&#8217;m not 100% certain of the cause, but it seemed that changing the case of the application&#8217;s bundle identifier solved it. So &#8220;com.ohanaware.mytexteditor&#8221; doesn&#8217;t work, where as &#8220;com.ohanaware.myTextEditor&#8221; does.</p>
<h3><strong>Problem 2: Recent Items list</strong></h3>
<p>In order to solve problem 2, we&#8217;ll use the &#8220;OWRecentItems&#8221; class from the Sandbox Kit. It&#8217;s a little more complicated than just selecting checkboxes, but not much more complicated.</p>
<p>Add the Sandbox Kit to your Xojo project.</p>
<p>In the &#8220;Open&#8221; event of the &#8220;App&#8221; object, add the following line of code</p>
<pre>OWRecentItems.installRecentMenu( fileMenu, 1 )</pre>
<p>This single line of code will tell the OWRecentItems class to install the recent menu, you pass in the menu on the to add to, and where in the menubar you&#8217;d like the &#8220;Open Recent&#8221; submenu to appear.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2015/02/Screenshot%202%20-%20Code%20%26%20Recent%20Menu%20items-577.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2015/02/screenshot20220-20code202620recent20menu20items-thumb-400x198-577.pngt1466486449161ampwidth400ampheight198" sizes="auto, (max-width: 400px) 100vw, 400px" alt="Screenshot 2 - Code &amp; Recent Menu items.png" width="400" height="198" /></a></p>
<p>For my Text Editor, I added it to the file menu and in position 2.</p>
<p>3. Now all that&#8217;s required is when a document is saved or opened, another line of code needs to be called.</p>
<pre>OWRecentItems.addToRecentMenu( file )</pre>
<p>Simply call the OWRecentItems class again and use the addToRecentMenu method, passing in the Xojo folderitem where the document is being saved. It will be added to the Recent Menu (it&#8217;s okay to call it multiple times as it will only list it once).</p>
<p>That&#8217;s it. Now the application has a Sandbox safe recent items menu.</p>
<p><strong>Note</strong>: Using this code will also add the Recent Item menu to the App&#8217;s dock item. It&#8217;s also pretty cool in the fact that the Apple Recent Item system work across Sandboxed and un-sandboxed versions.</p>
<h3><strong>Problem 3: Re-opening last open documents</strong></h3>
<p>There&#8217;s a bit more work involved to implement this solution, the great news is once you&#8217;ve mastered it for one window, it&#8217;s trivial to add to other windows.</p>
<p>1. In your Xojo application, you need to select your document window and click on the &#8220;Choose&#8221; button next to &#8220;Interfaces&#8221; in the Xojo inspector.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2015/02/Screenshot%203%20-%20Interface%20selector-580.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2015/02/screenshot20320-20interface20selector-thumb-400x233-580.pngt1466486449161ampwidth400ampheight233" sizes="auto, (max-width: 400px) 100vw, 400px" alt="Screenshot 3 - Interface selector.png" width="400" height="233" /></a></p>
<p>2. Some new methods will be added to the Window class.</p>
<ul>
<li>classIdentifer as string</li>
<li>restoreData( data as JSONItem )</li>
<li>storeData as JSONItem</li>
</ul>
<p>&#8220;classIdentifer&#8221; is where we return a identifier, to which our restoration service uses to determine what window instance to create when the data is restored. I tend to return the window class name.</p>
<pre>Function classIdentifier() As string
  // Part of the OWRestorableWindow interface.
  return "documentWindow"
End Function</pre>
<p>&#8220;restoreData&#8221; is used to populate the controls when restoring the window. For our word processor, we&#8217;ll use the code below.</p>
<pre>Sub restoreData(data as JSONItem)
  // Part of the OWRestorableWindow interface.
  if data &lt;&gt; nil then
    if data.hasName( "text" ) then TextArea1.text = data.value( "text" )
  end if
End Sub</pre>
<p>It&#8217;s important to check that the data object isn&#8217;t NIL and also to check for each setting (this will help to future proof your application).</p>
<p>&#8220;storeData&#8221; is the last method to populate in the Window class. For our purposes we&#8217;ll use the following code. It will simply store the TextArea into the property &#8220;text&#8221;.</p>
<p><strong>Note</strong>: As we&#8217;re using JSONItems to save and restore the data, it&#8217;s not designed to contain vast amounts of data and some data types will need to be converted to text before storing.</p>
<pre>Function storeData() As JSONItem
  // Part of the OWRestorableWindow interface.
  if me.folderitem &lt;&gt; nil then call saveFile
  Dim r as new JSONItem
  if textArea1.text &lt;&gt; "" then r.value( "text" ) = textArea1.text
  Return r
End Function</pre>
<p>It&#8217;s important to know that if you&#8217;re writing Auto Save files, this is the place to do so. Once Window Restoration is properly configured, the window will never receive the &#8220;CancelClose&#8221; or &#8220;Close&#8221; events. Consider this the last place to save the user data.</p>
<p>Modify the Save routine of the window, to store the file into the Window, this is done by using the window.folderitem property.</p>
<pre>me.folderitem = f</pre>
<p><strong>Note</strong>: This is one of the key elements, without this the Window Restoration will not work correctly. The folderitem must be attached to the Window using this method.</p>
<p>Modify your file open routine to also use this property.</p>
<p>3. Now we need to alter the App object.<br />
In the &#8220;CancelClose&#8221; event of the &#8220;App&#8221; Object, add the code to store the open windows.</p>
<pre>Function CancelClose() As Boolean
<strong>OWWindowRestoration.storeOpenWindows</strong>
End Function</pre>
<p><strong>Note</strong>: Once this line is executed, no more code will be executed after it, nor will the application&#8217;s &#8220;Close&#8221;, window &#8220;CancelClose&#8221; and &#8220;Close&#8221; events will not fire.</p>
<p>4. The next step is to create a subclass of the &#8220;OWWindowRestoration&#8221; class, name this class something appropriate (for &#8220;My Text Editor&#8221;, I used the name &#8220;MTERestoration&#8221; ).</p>
<p>Add the event &#8220;windowByClassIdentifier&#8221; and in here is where we create a new instance of our window when requested. Earlier on, I returned &#8220;documentWindow&#8221; from the Window&#8217;s classIdentifer method.</p>
<pre>Function windowByClassIdentifier(classIdentifier as string) As window
  select case classIdentifier
  case "documentWindow"
    return new documentWindow
  end select
End Function</pre>
<p>5. Back to the &#8220;Open&#8221; event of the &#8220;App&#8221; and we ask our subclass to restore windows. For example, this app uses the following code.</p>
<pre>Sub Open()
  // --- Initiate the Recent Items Menu.
  OWRecentItems.installRecentMenu( fileMenu, 2 )
  // --- Initate Window Restoration.
<strong>  Dim nwrc as new MTERestoration
</strong>End Sub</pre>
<p>In order to test this, make sure that &#8220;Close windows when quitting an app&#8221; is unchecked, in the &#8220;General&#8221; section of &#8220;System Preferences&#8221;.</p>
<p>Now run the application, leave some windows open, quit the application and re-launch it&#8230;</p>
<p>6. Cleaning up<br />
In the final step, we need to restore window positions for files that were auto re-loaded (not just data that is stored). This is done by adding the following line to your file open routine.</p>
<pre>OWWindowRestoration.restoreWindowBounds( myNewWindow, fileToOpen )</pre>
<p>Replace &#8220;MyNewWindow&#8221; with the new instance of your window and &#8220;fileToOpen&#8221; with the file that was opened by the routine. Below is how it&#8217;s used in &#8220;My Text Editor&#8221;.</p>
<pre>Sub OpenDocument(item As FolderItem)
  Dim theText as string
  try
    Dim tis as textInputStream = textInputStream.open( item )
    if tis &lt;&gt; nil then
      theText = tis.readAll
      tis.close
      Dim ndw as new documentWindow
      ndw.TextArea1.text = theText
      ndw.contentsChanged = false
      ndw.folderitem = item
      OWRecentItems.addToRecentMenu( item )
<strong>      OWWindowRestoration.restoreWindowBounds( ndw, item )
</strong>      ndw.show
    end if
  catch err as IOException
    MsgBox "Unable to open the file """ + item.name + """." + EndOfLine + endOfLine + err.message
  End try
End Sub</pre>
<p>You may have noticed that your Xojo application is also creating new blank windows, which may be undesirable. This is can be solved by adding a property to the &#8220;App&#8221; class, name it &#8220;blockFirstNewWindow&#8221; and make it a boolean. Update the &#8220;NewDocument&#8221; event to use this new property.</p>
<pre>Sub NewDocument()
  if blockFirstNewWindow = false then
    Dim ndw as new documentWindow
    ndw.show
  else
    blockFirstNewWindow = false
  end if
End Sub</pre>
<p>Switch back to the &#8220;Open&#8221; event and add a line of code to set that property to the result of the window restoration code.</p>
<pre>Sub Open()
  // --- Initiate the Recent Items Menu.
  OWRecentItems.installRecentMenu( fileMenu, 2 )
  // --- Initate Window Restoration.
  Dim nwrc as new MTERestoration
<strong>  blockFirstNewWindow = nwrc.restored
</strong>End Sub</pre>
<p>Now, if you run the project, create some documents, open some, save others, then quit and re-launch, your app should restore the open documents as they were when the application was quit.</p>
<h2><strong>Benefits of using this code</strong></h2>
<p>Apart from solving some App Sandbox issues, you&#8217;ll also get some additional functionality for free.</p>
<ul>
<li>Using the Apple Recent Item system, recent documents are also available from the dock menu.</li>
<li>The Apple Recent Item system is compatible with both the Sandboxed application and unsandboxed (while everything else is not). Users of either version can swap between the two and still be able to use the Recent Items.</li>
<li>Using the Window Restoration system will make an application follow and behave more consistently with other applications.</li>
<li>The Window Restoration system will also add the file icon to the Window titlebar, and if the user control clicks on the file icon, they can see where on the disk the file is located.</li>
</ul>
<h2><strong>What&#8217;s included in the Sandbox Kit</strong></h2>
<ul>
<li>OWRecentItems; Used to implement a Sandbox Safe Recent Items menu</li>
<li>OWWindowRestoration; The Window Restoration handler</li>
<li>OWRestorableWindow; A Class Interface adding the functions for Window Restoration</li>
<li>OW_Sandbox_Kit; A shared module that the Sandbox Kit object require</li>
<li>OWAppleScript; The preferred method of executing Apple Scripts from within a Sandboxed application</li>
<li>OWBookmark; A last resort function for storing references to files, use this only if OWRecentItems &amp; OWWindowRestoration cannot solve the issue</li>
<li>SSBToken; Used by the OWBookmark class to ensure access to a referenced file is closed properly</li>
<li>OWShell; A Shell subclass that can also use NSTask, the only way to launch embedded &#8220;Helper&#8221; applications within a Sandboxed application</li>
</ul>
<h2><strong>How to get the Sandbox Kit</strong></h2>
<p>The Sandbox Kit is sold via the <a href="http://www.ohanaware.com/sandboxkit/">Ohanaware web site</a> for $99.99.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>iOS App Icons and Launch Images</title>
		<link>https://blog.xojo.com/2014/12/17/ios-app-icons-and-launch-images/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Wed, 17 Dec 2014 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2014/12/17/ios-app-icons-and-launch-images/</guid>

					<description><![CDATA[Before you submit to the App Store, you're going to want to have app icons and launch images for your iOS apps. Here's some information about them.]]></description>
										<content:encoded><![CDATA[<p>Before you submit to the App Store, you&#8217;re going to want to have app icons and launch images for your iOS apps. Here&#8217;s some information about them.</p>
<p><span id="more-172"></span></p>
<p>An iOS app requires app icons in up to 12 sizes to support the different iOS devices. In order for these icons to be included with your app, you have to copy them into the App Icon folder of your iOS project. More importantly, the icons have to have very specific names so that iOS recogizes them. You can read about the specific sizes and the names in the <a href="http://xojo.helpdocsonline.com/launch-images-and-app-icons">Launch Images and App Icons</a> page of our documentation.</p>
<blockquote><p><strong>Update</strong>: Starting with <a href="http://developer.xojo.com/ios-changes">Xojo 2016 Release 2</a>, Launch Images are optional.</p></blockquote>
<p>Launch Images are static images that iOS displays while your app is launching (or loading). These are often static images of the initial screen of your app, but they can also serve as &#8220;splash&#8221; screens.</p>
<p>There can be up to 9 different sizes of Launch Images that you can include with your app and, like with App Icons, they all need specific names. Launch Images are also important for displaying your app on iPhone 5 (4&#8243;) and larger screens. Because of the way iOS works, without an iPhone 5 Launch Image, your app will only display at the iPhone 4 (3.5&#8243;) screen size.</p>
<p>All this might seem a bit complicated, but we have a way to make this a bit simpler. In your Xojo installation you will find the ImageMaker tool. You can use this tool to quickly create a folder of App Icons and Launch Images that you can just drag into your iOS project.</p>
<p>On the App Icons tab, choose the image you want for your icon and select the sizes you want to create. Click &#8220;Create Icons&#8221; to create a folder of icons that you can drag into your project.<a href="http://www.xojo.com/blog/en/assets_c/2014/12/iOS%20Image%20Maker-AppIcons-541.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2014/12/ios20image20maker-appicons-thumb-400x256-541.pngt1466486449161ampwidth400ampheight256" sizes="auto, (max-width: 400px) 100vw, 400px" alt="iOS Image Maker-AppIcons.png" width="400" height="256" /></a></p>
<p>On the Launch Images tab, you can create blank (but in the selected color) launch images of the selected sizes to output to a folder you can drag to your project.<a href="http://www.xojo.com/blog/en/assets_c/2014/12/iOS%20Image%20Maker-LaunchImages-544.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2014/12/ios20image20maker-launchimages-thumb-400x256-544.pngt1466486449161ampwidth400ampheight256" sizes="auto, (max-width: 400px) 100vw, 400px" alt="iOS Image Maker-LaunchImages.png" width="400" height="256" /></a></p>
<p>For more information about App Icons and Launch Images, you can also refer to Apple&#8217;s Human Interface topics on <a href="https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/AppIcons.html">App Icons</a> and <a href="https://developer.apple.com/library/ios/documentation/userexperience/conceptual/MobileHIG/LaunchImages.html">Launch Images</a>.<!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
