{"id":21853,"date":"2018-06-11T12:15:43","date_gmt":"2018-06-11T09:15:43","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=21853"},"modified":"2018-06-11T12:15:03","modified_gmt":"2018-06-11T09:15:03","slug":"cross-platform-development-part-two","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/","title":{"rendered":"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two"},"content":{"rendered":"<p>There\u2019s a lot of demand for mobile application developers these days, but learning all the available platforms and toolsets can be a <a href=\"https:\/\/simpleprogrammer.com\/native-versus-hybrid-apps\/\" target=\"_blank\" rel=\"noopener\">costly, time-consuming challenge<\/a>.<\/p>\n<p>The most popular solution to this problem is <strong>cross-platform application development<\/strong>.<\/p>\n<p>The goal of cross-platform development is to create software that seamlessly runs on multiple platforms using one set of tools and programming languages. The benefits of this approach include lower costs, rapid prototyping, and skill reuse.<\/p>\n<p><a href=\"https:\/\/www.webcodegeeks.com\/web-development\/from-zero-to-app-the-cross-platform-development-approach-simplified\/\" target=\"_blank\" rel=\"noopener\">In part one<\/a>, we implemented a web-based, cross-platform app that allows users to access the device\u2019s camera to take and display photos. In part two, we\u2019ll cover the steps to transform it into a native <a href=\"https:\/\/simpleprogrammer.com\/develop-app-ios-android\/\" target=\"_blank\" rel=\"noopener\">Android and iOS app<\/a> using PhoneGap Build.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/from-zero-to-app-square-300x300.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21856 size-full\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/from-zero-to-app-square-300x300.png\" alt=\"cross platform development\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/from-zero-to-app-square-300x300.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/from-zero-to-app-square-300x300-150x150.png 150w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/from-zero-to-app-square-300x300-70x70.png 70w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h2>What Is PhoneGap Build?<\/h2>\n<p>Traditional methods of compiling web apps into native ones, such as the <a href=\"https:\/\/cordova.apache.org\/docs\/en\/latest\/guide\/cli\/index.html\" target=\"_blank\" rel=\"noopener\">Cordova CLI<\/a>, force you to maintain native software development kits (SDKs) for each platform you target. This can be challenging, as it means keeping multiple machines (PC and Mac) up to date with the latest software versions and tooling.<\/p>\n<p>Adobe\u2019s PhoneGap Build cloud tool simplifies the process of transforming your web assets (HTML, CSS, JavaScript) into native mobile apps. There are no SDKs to maintain; everything is managed in the cloud for you. Additionally, PhoneGap Build provides tools for quick deployment cycles, collaboration, and sharing apps with end users.<\/p>\n<p>To get started, sign up for a <a href=\"https:\/\/build.phonegap.com\/plans\" target=\"_blank\" rel=\"noopener\">free account here<\/a>. Note that you\u2019ll need to create an Adobe account if you don\u2019t already have one.<\/p>\n<p>The mobile app we\u2019ll be creating is <a href=\"https:\/\/github.com\/dotNetkow\/sp-cross-platform-app\" target=\"_blank\" rel=\"noopener\">located here<\/a>. For the rest of this article, all code referenced can be found in the \u201capp \u2013 part two\u201d folder.<\/p>\n<h2>Config.xml: Initial Configuration<\/h2>\n<p>Before we use PhoneGap Build to create the native versions of our app, we need to create \u201cconfig.xml,\u201d the configuration file that specifies app metadata and the native features that will be used. You can find this file in the root of the \u201capp \u2013 part two\u201d folder.<\/p>\n<p>Let\u2019s begin with the main app metadata:<\/p>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;\r\n  &lt;widget xmlns   = \"http:\/\/www.w3.org\/ns\/widgets\"\r\n    xmlns:gap   = \"http:\/\/phonegap.com\/ns\/1.0\"\r\n    id          = \"com.simpleprogrammer.crossplatapp\" \r\n    version     = \"1.0.0\"&gt;\r\n&lt;\/widget&gt;<\/pre>\n<p>The config.xml file follows the <a href=\"http:\/\/www.w3.org\/TR\/widgets\/\" target=\"_blank\" rel=\"noopener\">W3C widget specification<\/a>, which provides the standardization of packaged web apps. There are two attributes in the widget declaration to note:<strong> id<\/strong> and <strong>version<\/strong>.<\/p>\n<p>The id attribute is the unique identifier for your application. Typically, you\u2019ll see this written in reverse domain name notation; this format combines company domain plus project name. In my example here, \u201ccom.simpleprogrammer\u201d (\u201csimpleprogrammer.com\u201d) is the company domain and \u201ccrossplatapp\u201d is the name of our mobile app created in this article series.<\/p>\n<p>The version attribute represents the current version number of the application and works exactly the same as with other software projects. Each time you release a new update of the app, you increment the version number here:<\/p>\n<pre class=\"brush:xml\">&lt;name&gt;Simple Programmer Cross-platform Camera app&lt;\/name&gt;\r\n\r\n&lt;description&gt;\r\n  This sample app is used in conjunction with the SP cross-platform development article by Matt Netkow.\r\n&lt;\/description&gt;\r\n\r\n&lt;author href=\"http:\/\/www.example.com\" email=\"noreply@example.com\"&gt;\r\n  Your Author Name\r\n&lt;\/author&gt;\r\n\r\n&lt;!-- Build preferences for each platform. Too many to list here, see online PhoneGap docs for more. --&gt;\r\n&lt;preference name='phonegap-version' value='cli-8.0.0' \/&gt; &lt;!-- Version of PhoneGap to use --&gt;<\/pre>\n<p>The next three elements, including name, description, and author, are PhoneGap Build-specific. They are not used or seen in your app at all, but rather displayed within the PhoneGap Build site on the particular app page. If you share your app with other developers or companies, the description and author information can be useful.<\/p>\n<p>The last element, a preference tag named \u201cphonegap-version,\u201d designates the PhoneGap version to use when building the app.<\/p>\n<pre class=\"brush:xml\">&lt;!-- https:\/\/www.npmjs.com\/package\/cordova-plugin-camera --&gt;\r\n&lt;plugin name=\"cordova-plugin-camera\" source=\"npm\" spec=\"4.0.2\" \/&gt;<\/pre>\n<p>As you\u2019ll recall from part one, we added the <a href=\"https:\/\/www.npmjs.com\/package\/cordova-plugin-camera\" target=\"_blank\" rel=\"noopener\">camera plugin<\/a> into the app in order to use the mobile device\u2019s camera to take photos. Using a plugin tag here informs PhoneGap Build to install the native portion of the code.<\/p>\n<h2>Config.xml: Adding Icons and Splash Screens<\/h2>\n<p>In the last section of the config file, we see a couple of \u201c\u201d tags, one for iOS and one for Android. Within these tags, we define various rules and configurations specific to the designated platform.<\/p>\n<p>While there are <a href=\"https:\/\/cordova.apache.org\/docs\/en\/latest\/config_ref\/index.html#platform\" target=\"_blank\" rel=\"noopener\">many options to choose from<\/a>, we\u2019re going to focus only on icons and splash screens (full screen images displayed during app launch). These are specific to mobile applications, so we won\u2019t see them in use when developing locally in the browser. Image dimensions for <a href=\"https:\/\/cordova.apache.org\/docs\/en\/latest\/config_ref\/images.html\" target=\"_blank\" rel=\"noopener\">icons<\/a> and <a href=\"https:\/\/cordova.apache.org\/docs\/en\/latest\/reference\/cordova-plugin-splashscreen\/index.html\" target=\"_blank\" rel=\"noopener\">splash screens<\/a> vary wildly, too.<\/p>\n<pre class=\"brush:xml\">&lt;!-- The platforms to build --&gt;\r\n&lt;platform name=\"ios\"&gt;\r\n  &lt;!-- Icons for iOS 8.0+, iPhone 6 \/ 6+ --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-60@3x.png\" width=\"180\" height=\"180\" \/&gt;\r\n  &lt;!-- iOS 7.0+ --&gt;\r\n  &lt;!-- iPhone \/ iPod Touch  --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-60.png\" width=\"60\" height=\"60\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-60@2x.png\" width=\"120\" height=\"120\" \/&gt;\r\n  &lt;!-- iPad --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-76.png\" width=\"76\" height=\"76\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-76@2x.png\" width=\"152\" height=\"152\" \/&gt;\r\n  &lt;!-- Spotlight Icon --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-40.png\" width=\"40\" height=\"40\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-40@2x.png\" width=\"80\" height=\"80\" \/&gt;\r\n  &lt;!-- iOS 6.1 --&gt;\r\n  &lt;!-- iPhone \/ iPod Touch --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon.png\" width=\"57\" height=\"57\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon@2x.png\" width=\"114\" height=\"114\" \/&gt;\r\n  &lt;!-- iPad --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-72.png\" width=\"72\" height=\"72\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-72@2x.png\" width=\"144\" height=\"144\" \/&gt;\r\n  &lt;!-- iPhone Spotlight and Settings Icon --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-small.png\" width=\"29\" height=\"29\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-small@2x.png\" width=\"58\" height=\"58\" \/&gt;\r\n  &lt;!-- iPad Spotlight and Settings Icon --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-50.png\" width=\"50\" height=\"50\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-50@2x.png\" width=\"100\" height=\"100\" \/&gt;\r\n  &lt;!-- iPad Pro --&gt;\r\n  &lt;icon src=\"www\/icons\/ios\/icon-83.5@2x.png\" width=\"167\" height=\"167\" \/&gt;\r\n\r\n  &lt;!-- iPhone and iPod touch --&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default~iphone.png\" platform=\"ios\" width=\"320\" height=\"480\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default@2x~iphone.png\" platform=\"ios\" width=\"640\" height=\"960\" \/&gt;\r\n\r\n  &lt;!-- iPhone 5 \/ iPod Touch (5th Generation) --&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-568h@2x~iphone.png\" platform=\"ios\" width=\"640\" height=\"1136\" \/&gt;\r\n\r\n  &lt;!-- iPhone 6 --&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-667h.png\" platform=\"ios\" width=\"750\" height=\"1334\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-736h.png\" platform=\"ios\" width=\"1242\" height=\"2208\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-Landscape-736h.png\" platform=\"ios\" width=\"2208\" height=\"1242\" \/&gt;\r\n\r\n  &lt;!-- iPad --&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-Portrait~ipad.png\" platform=\"ios\" width=\"768\" height=\"1024\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-Landscape~ipad.png\" platform=\"ios\" width=\"1024\" height=\"768\" \/&gt;\r\n\r\n  &lt;!-- Retina iPad --&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-Portrait@2x~ipad.png\" platform=\"ios\" width=\"1536\" height=\"2048\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/ios\/Default-Landscape@2x~ipad.png\" platform=\"ios\" width=\"2048\" height=\"1536\" \/&gt;\r\n&lt;\/platform&gt;\r\n\r\n&lt;!-- Android --&gt;\r\n&lt;platform name=\"android\"&gt;\r\n  &lt;!--\r\n    ldpi    : 36x36 px\r\n    mdpi    : 48x48 px\r\n    hdpi    : 72x72 px\r\n    xhdpi   : 96x96 px\r\n    xxhdpi  : 144x144 px\r\n    xxxhdpi : 192x192 px\r\n  --&gt;\r\n  &lt;icon src=\"www\/icons\/android\/ldpi.png\" density=\"ldpi\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/android\/mdpi.png\" density=\"mdpi\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/android\/hdpi.png\" density=\"hdpi\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/android\/xhdpi.png\" density=\"xhdpi\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/android\/xxhdpi.png\" density=\"xxhdpi\" \/&gt;\r\n  &lt;icon src=\"www\/icons\/android\/xxxhdpi.png\" density=\"xxhdpi\" \/&gt;\r\n\r\n  &lt;!-- Android --&gt;\r\n  &lt;splash src=\"www\/splash\/android\/drawable-port-ldpi-screen.png\" platform=\"android\" density=\"ldpi\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/android\/drawable-port-mdpi-screen.png\" platform=\"android\" density=\"mdpi\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/android\/drawable-port-hdpi-screen.png\" platform=\"android\" density=\"hdpi\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/android\/drawable-port-xhdpi-screen.png\" platform=\"android\" density=\"xhdpi\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/android\/drawable-port-xxhdpi-screen.png\" platform=\"android\" density=\"port-xxhdpi\" \/&gt;\r\n  &lt;splash src=\"www\/splash\/android\/drawable-land-xxhdpi-screen.png\" platform=\"android\" density=\"land-xxhdpi\" \/&gt;\r\n&lt;\/platform&gt;<\/pre>\n<p>You can create these images by hand, using tools such as <a href=\"https:\/\/www.adobe.com\/products\/photoshop.html\" target=\"_blank\" rel=\"noopener\">Adobe Photoshop<\/a> or <a href=\"https:\/\/www.getpaint.net\/\" target=\"_blank\" rel=\"noopener\">Paint.net<\/a>. This can be tedious, however, so I highly recommend the Ionic framework\u2019s <a href=\"https:\/\/ionicframework.com\/docs\/cli\/cordova\/resources\/\" target=\"_blank\" rel=\"noopener\">resources tool<\/a>. Simply create one large icon and one large splash screen, then the tool takes care of generating all images for you. Here are the iOS icons, for example:<a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-icons-1024x347.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21858\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-icons-1024x347.png\" alt=\"cross platform development ios icons\" width=\"860\" height=\"291\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-icons-1024x347.png 1024w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-icons-1024x347-300x102.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-icons-1024x347-768x260.png 768w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<h2>Device Deployment Prerequisites<\/h2>\n<p>Interacting with the app on the web couldn\u2019t be easier. Simply open up \u201cindex.html\u201d in a web browser and it\u2019s immediately usable.<\/p>\n<p>Unfortunately, deploying and testing it as a native app requires a lot more steps and each platform has its own idiosyncrasies. The most challenging is Apple\u2019s iOS platform.<\/p>\n<h3>iOS<\/h3>\n<p>Apple makes iOS development rather painful for beginners. Regardless of the development approach (cross-platform or native), there are multiple steps required to deploy an app onto a device.<\/p>\n<p>The silver lining? If you have a Windows PC or a Linux machine, you\u2019re in luck, because <strong>99 percent of iOS app creation can be done without a Mac!<\/strong> The only task that requires a Mac is submission of the app binary to Apple for publication on the App Store.<\/p>\n<p>Before you are able to deploy an app to your device, you\u2019ll need to enroll in the <a href=\"https:\/\/developer.apple.com\/programs\/enroll\/\" target=\"_blank\" rel=\"noopener\">Apple Developer Program<\/a>. As of 2018, it costs $99 per year. There are ways to <a href=\"https:\/\/blog.ionicframework.com\/deploying-to-a-device-without-an-apple-developer-account\/\" target=\"_blank\" rel=\"noopener\">test locally without paying<\/a>, but if you\u2019re serious about developing an app, the cost is worth it.<\/p>\n<p>Additionally, if you have a Mac, update to the latest version of MacOS and Xcode. Regardless of the operating system, download iTunes too; it is required to retrieve the device id of your mobile device.<\/p>\n<h3>Android<\/h3>\n<p>Android is significantly easier to set up than iOS, a great option for Windows, Linux, and Mac users. Only an Android device is required. You don\u2019t need a Google Play account for local device testing.<\/p>\n<h2>Upload the App to PhoneGap Build<\/h2>\n<p>With your free PhoneGap Build account already created, sign in and click the \u201c+ New App\u201d button. There are two options to select from: pulling the code from GitHub or uploading a ZIP file. For simplicity\u2019s sake, let\u2019s upload a ZIP file.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/upload-Zip-1024x414.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21866\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/upload-Zip-1024x414.png\" alt=\"cross platform development upload zip\" width=\"860\" height=\"348\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/upload-Zip-1024x414.png 1024w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/upload-Zip-1024x414-300x121.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/upload-Zip-1024x414-768x311.png 768w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>If you haven\u2019t done so previously, <a href=\"https:\/\/github.com\/dotNetkow\/sp-cross-platform-app\" target=\"_blank\" rel=\"noopener\">download the code repository from GitHub<\/a>. On the file system, navigate to the \u201csp-cross-platform-app\u201d folder. Zip up the folder using your zip tool of choice.<\/p>\n<p>Next, click the \u201cUpload a .zip file\u201d button and select \u201csp-cross-platform-app.zip.\u201d After it has uploaded, click the \u201cReady to build\u201d button. Next, click the \u201cSimple Programmer Cross-\u2026\u201d title link.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/preBuild-1024x393.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21863\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/preBuild-1024x393.png\" alt=\"cross platform development prebuild\" width=\"860\" height=\"330\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/preBuild-1024x393.png 1024w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/preBuild-1024x393-300x115.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/preBuild-1024x393-768x295.png 768w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>PhoneGap Build will begin creating the app for Android and iOS.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/pgb-start-1024x575.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21862\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/pgb-start-1024x575.png\" alt=\"cross platform development pgb start\" width=\"860\" height=\"483\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/pgb-start-1024x575.png 1024w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/pgb-start-1024x575-300x168.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/pgb-start-1024x575-768x431.png 768w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>The Android version should build successfully, as evidenced by the blue \u201capk\u201d button that becomes visible. The iOS build will fail, because you\u2019ll need to follow the steps below before you\u2019re able to build the app successfully.<\/p>\n<p>There are two quick, easy ways to install the app. Sign into PhoneGap Build on your mobile device, then either tap the blue \u201capk\u201d button or use a QR code scanning app to scan the QR code.<\/p>\n<h2>Install the Android App<\/h2>\n<p>By default, the installation will be blocked because the app hasn\u2019t been signed with a developer certificate. Tap the \u201cSettings\u201d button that appears. Next, tap \u201cAllow installation from unknown sources.\u201d Navigate back to the app using the physical back button. Now, instead of seeing a \u201cSettings\u201d button, an \u201cInstall\u201d button should appear. Tap it to install the app.<\/p>\n<p>That\u2019s all it takes to load the Android version of our app onto a device! To create a developer certificate for uploading onto the Google Play store, <a href=\"https:\/\/developer.android.com\/studio\/publish\/app-signing.html\" target=\"_blank\" rel=\"noopener\">follow these instructions<\/a> from the official Android developer site or from my <a href=\"https:\/\/pluralsight.pxf.io\/c\/1218107\/424552\/7490?u=https%3A%2F%2Fapp.pluralsight.com%2Flibrary%2Fcourses%2Fphonegap-build-fundamentals\" target=\"_blank\" rel=\"noopener\">Pluralsight course<\/a>.<\/p>\n<h2>iOS Configuration<\/h2>\n<p>Unfortunately, getting the iOS version of the app onto a device isn\u2019t as easy as Android. As we see here, we need a p12 certificate file and a provisioning file.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21860 size-full\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key.png\" alt=\"cross platform development ios submit key\" width=\"833\" height=\"553\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key.png 833w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key-300x199.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key-768x510.png 768w\" sizes=\"(max-width: 833px) 100vw, 833px\" \/><\/a><\/p>\n<p>It\u2019s not clear from this user interface, but there are multiple steps required to create those files.<\/p>\n<h3>Create an App ID<\/h3>\n<p>To begin configuring the app to build for iOS, sign into your Apple account at <a href=\"https:\/\/developer.apple.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/developer.apple.com<\/a>. The first step involves registering an App Id. It represents a globally unique identifier (GUID) for your app. Every app requires a different App Id.<\/p>\n<p>Navigate to the \u201cCertificates, Identifiers, &amp; Profiles\u201d section, then the \u201cApp IDs\u201d option, then click the plus (+) button. Enter the name of the app, such as \u201cSimple Programmer Camera App.\u201d Next, under the \u201cApp ID Suffix\u201d section, choose \u201cWildcard App ID,\u201d then enter <strong>com.simpleprogrammer.*<\/strong> for the Bundle ID field. This option permits you to use a single App Id for multiple apps\u2014perfect for prototypes or how-to articles.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-App-ID.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21857 size-full\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-App-ID.png\" alt=\"cross platform development ios app id\" width=\"764\" height=\"871\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-App-ID.png 764w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/iOS-App-ID-263x300.png 263w\" sizes=\"(max-width: 764px) 100vw, 764px\" \/><\/a><\/p>\n<p>Ignore the App Services section and continue clicking through until the app has been registered.<\/p>\n<h3>Register an iOS Device<\/h3>\n<p>In order to use an iOS device for app development, you must add it to your Apple Developer account. Connect your iOS device to your computer, then open iTunes. Navigate to the device summary screen. Click the Serial Number once to reveal the unique device identifier (UDID) value:<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21864\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS.png\" alt=\"cross platform development register ios\" width=\"860\" height=\"442\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS.png 876w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS-300x154.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS-768x395.png 768w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>Then right-click and copy the UDID value:<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS-UDID-value-1.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21865 size-full\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS-UDID-value-1.png\" alt=\"cross platform development register iOS UDID value\" width=\"792\" height=\"411\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS-UDID-value-1.png 792w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS-UDID-value-1-300x156.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/register-iOS-UDID-value-1-768x399.png 768w\" sizes=\"(max-width: 792px) 100vw, 792px\" \/><\/a><\/p>\n<p>Back over in the Apple Developer site, on the \u201cCertificates, Identifiers, &amp; Profiles\u201d screen, navigate to \u201cDevices -&gt; All.\u201d Click the plus (+) button to add a new device. For the name field, enter something you\u2019ll remember, such as \u201cMatt\u2019s iPad mini.\u201d For the UDID field, paste in the GUID value we just copied from iTunes. Click the \u201cContinue\u201d button to finish registering the device.<\/p>\n<h3>Certificate Creation: Windows and Linux<\/h3>\n<p>During the app build process, PhoneGap Build will sign the app with a certificate file, which tells Apple and users that you are a verified developer.<\/p>\n<p>Fortunately, we can use OpenSSL to generate the p12 certificate on Windows or Linux. By doing so, you\u2019re able to write, debug, and test your app on an iOS device, all using PhoneGap Build and Windows\/Linux only.<\/p>\n<p>Start by downloading OpenSSL for Windows\/Linux from <a href=\"https:\/\/www.openssl.org\/\" target=\"_blank\" rel=\"noopener\">openssl.org<\/a>. Afterward, open up a command terminal <strong>as Admin<\/strong> and navigate to the OpenSSL bin folder. On my Windows system, it can be found in C:\\Program Files\\OpenSSL-Win32\\bin. The first command to run will create a 2,048 bit private key:<\/p>\n<p>openssl genrsa -out output\/privateKey.key 2048<\/p>\n<p>The next command will generate a certificate signing request (CSR) using that newly created private key:<\/p>\n<p>openssl req -new -key output\/privateKey.key -out output\/CertificateSigningRequest.certSigningRequest -subj \u201c\/emailAddress=your.email@email.com, CN=Matt Netkow \u2013 Dev, C=US\u201d<\/p>\n<p>Use everything as-is in this command, except the last few details: \u201cemail address\u201d should be your own, of course, and \u201cCN\u201d (common name) should be your name along with a designation of whether the certificate is for development or distribution. The \u201cc\u201d portion means country\u2014\u201cUS\u201d for the United States in this example, or another two-character country code.<\/p>\n<p>Back over on the Apple Developer account, we take the newly generated CSR and convert it to a certificate. On the \u201cCertificates, Identifiers, &amp; Profiles\u201d page, navigate to \u201cCertificates -&gt; All.\u201d Click the plus (+) button to get started. You\u2019ll be prompted to upload the CSR that we just created. After uploading the CSR, download the newly created certificate (a CER file) and copy it to the OpenSSL output folder.<\/p>\n<p>With the downloaded certificate in place, we now need to convert it into a PEM file:<\/p>\n<p>openssl x509 -in output\/ios_development.cer -inform DER -out output\/app_pem_file.pem -outform PEM<\/p>\n<p>For the last step, we convert the PEM file to the p12 certificate file that PhoneGap Build needs:<\/p>\n<p>openssl pkcs12 -export -inkey output\/privateKey.key -in output\/app_pem_file.pem -out output\/dev_p12.p12<\/p>\n<p>Before the p12 file is created, you\u2019re prompted to password protect it. With a p12 certificate in hand, skip to the \u201cCreate a Provisioning Profile\u201d section below.<\/p>\n<h3>Certificate Creation: Mac<\/h3>\n<p>In order to generate a certificate, you must first create a CSR from your Mac computer.<\/p>\n<p><strong>Generate a CSR<\/strong><\/p>\n<p>Begin by opening the Keychain Access program. Within the Keychain Access dropdown menu, select \u201cCertificate Assistant -&gt; Request a Certificate from a Certificate Authority.\u201d There are a few details to fill in:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>User Email Address: I recommend using the same email as your Apple developer program account.<\/li>\n<li>Common Name: Input the name of the certificate. I highly recommend using your personal name or company name along with some designation between \u201cdevelopment\u201d and \u201cdistribution.\u201d Since we\u2019re creating a development certificate here, let\u2019s use \u201cdevelopment.\u201d<\/li>\n<li>CA email address: Leave this empty. It\u2019s not actually required despite saying so.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-keychain.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21859 size-full\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-keychain.png\" alt=\"cross platform development ios keychain\" width=\"639\" height=\"467\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-keychain.png 639w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-keychain-300x219.png 300w\" sizes=\"(max-width: 639px) 100vw, 639px\" \/><\/a><\/p>\n<p>Choose the \u201cSaved to disk\u201d option because we want to upload this certificate request file to Apple right away. Next, click \u201cContinue,\u201d then save the file somewhere easily accessible. Consider using the common name you\u2019ve already entered above.<\/p>\n<p>Back over in the browser, on the \u201cCertificates, Identifiers, &amp; Profiles\u201d screen, navigate to \u201cCertificates -&gt; All.\u201d Click the plus (+) button to add a new certificate. Choose the \u201ciOS App Development\u201d option, then click \u201cContinue.\u201d Upload the recently created CSR file. Apple converts the CSR into a development certificate.<\/p>\n<p>Downloading the certificate gives us a CER file, but PhoneGap Build actually requires a p12. The CER file only contains the public key of the developer, but in order for PhoneGap Build to properly sign the app for Apple\u2019s acceptance, the public and private keys are required, which a p12 file provides.<\/p>\n<p><strong>Export the p12 Certificate<\/strong><\/p>\n<p>Double-click on the downloaded CER file to import it into the Keychain Access program. It shows up under the \u201clogin\u201d keychain and the \u201cMy Certificates\u201d category on the left-hand side. One year after the certificate has been created and\/or your Apple Developer account is renewed (also on a yearly basis), you\u2019ll need to go through this certificate request process again.<\/p>\n<p>We can export a p12 version of our certificate rather easily. Expand the iPhone Developer certificate, then select both items that appear, the certificate and private key. Select the certificate first, then hold the \u201ccommand\u201d key and click on the \u201cprivate\u201d key. Next, right-click and choose the \u201cexport two items\u201d option. You\u2019ll be prompted to save the export as a p12 file. As we did when saving the CSR, I recommend using the Common Name when saving the p12.<\/p>\n<h3>Create a Provisioning Profile<\/h3>\n<p>Certificates represent us and\/or our company and are used to sign all of the apps we create. <em>Provisioning profiles<\/em> allow us to control which Apple devices are allowed to run an app. We create a unique one for each app.<\/p>\n<p>Back over on the Apple Developer site, on the \u201cCertificates, Identifiers, &amp; Profiles\u201d screen, navigate to \u201cProvisioning Profiles -&gt; All.\u201d Click the plus (+) button. We\u2019re creating an app for local testing purposes, so choose \u201ciOS App Development\u201d instead of one of the Distribution options. Next, select the \u201cSimple Programmer Camera App\u201d App ID from the dropdown box.<\/p>\n<p>Next, select the certificate. It will be labeled in a format similar to \u201c[Your Name] (iOS Development).\u201d Then, select the iOS device that we added in a previous step. Finally, enter the Profile Name. Because you\u2019ll typically create many of these over time, it helps to specify the app and its purpose. In this case, \u201cSP Camera App \u2013 Dev\u201d works perfectly. Click \u201cContinue\u201d then download the profile.<\/p>\n<h3>Configure PhoneGap Build<\/h3>\n<p>With both the p12 and provisioning files in hand, we\u2019re ready to build our app on PhoneGap Build!<\/p>\n<p>Next, go to the iOS entry, click the \u201cNo Key Selected\u201d dropdown option, then choose \u201cAdd a Key.\u201d Enter a Title, then upload the p12 certificate and the provisioning file:<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21860 size-full\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key.png\" alt=\"cross platform development ios submit key\" width=\"833\" height=\"553\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key.png 833w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key-300x199.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submit-key-768x510.png 768w\" sizes=\"(max-width: 833px) 100vw, 833px\" \/><\/a><\/p>\n<p>Click \u201csubmit key.\u201d The build will fail right away\u2014click the yellow padlock icon and enter the certificate password, then click the \u201csubmit key\u201d button:<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submitKey-Step2.png\"><img decoding=\"async\" class=\"aligncenter wp-image-21861 size-full\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submitKey-Step2.png\" alt=\"cross platform development ios submitKey Step2\" width=\"785\" height=\"599\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submitKey-Step2.png 785w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submitKey-Step2-300x229.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2018\/06\/ios-submitKey-Step2-768x586.png 768w\" sizes=\"(max-width: 785px) 100vw, 785px\" \/><\/a><\/p>\n<p>Click the \u201cRebuild\u201d button to attempt another iOS build, which should complete successfully now.<\/p>\n<h3>Install the iOS App<\/h3>\n<p>And now, the moment we\u2019ve all been waiting for!<\/p>\n<p>After successfully creating a p12 certificate and provisioning profile, an iOS version should be created. Sign into PhoneGap Build on your mobile device, then tap the \u201cipa\u201d button to install the app.<\/p>\n<h2>What\u2019s Next?<\/h2>\n<p>We now have a fully implemented, web-based, cross-platform app that allows users to access the device\u2019s camera to take and display photos. Using PhoneGap Build, we created both an Android and an iOS version of the app using the same codebase.<\/p>\n<p>Interested in learning more about the cross-platform development approach? Check out my Pluralsight course, <a href=\"https:\/\/pluralsight.pxf.io\/c\/1218107\/424552\/7490?u=https%3A%2F%2Fapp.pluralsight.com%2Flibrary%2Fcourses%2Fphonegap-build-fundamentals\" target=\"_blank\" rel=\"noopener\">PhoneGap Build Fundamentals<\/a>. It covers everything you need to go from zero to app store, including in-depth coverage of native plugins, testing and debugging on mobile devices, and app store submission.<\/p>\n<p>After learning the fundamentals via my course, adopting a robust, mature web framework for serious app development will be a piece of cake! Two contenders I really like are <a href=\"https:\/\/reactjs.org\/\" target=\"_blank\" rel=\"noopener\">React<\/a> paired with <a href=\"https:\/\/facebook.github.io\/react-native\/\" target=\"_blank\" rel=\"noopener\">React Native<\/a> as well as <a href=\"https:\/\/ionicframework.com\/\" target=\"_blank\" rel=\"noopener\">Ionic<\/a>. With either of them, you can create apps that run everywhere; on the desktop, mobile devices, and more.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>Published on Web Code Geeks with permission by Matt Netkow, partner at our <a href=\"\/\/www.webcodegeeks.com\/join-us\/wcg\/\" target=\"_blank\" rel=\"noopener\">WCG program<\/a>. See the original article here: <a href=\"https:\/\/simpleprogrammer.com\/app-cross-platform-development-part-2\/\" target=\"_blank\" rel=\"noopener\">From Zero to App: The Cross-Platform Development Approach Simplified: Part Two<\/a><\/p>\n<p>Opinions expressed by Web Code Geeks contributors are their own.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>There\u2019s a lot of demand for mobile application developers these days, but learning all the available platforms and toolsets can be a costly, time-consuming challenge. The most popular solution to this problem is cross-platform application development. The goal of cross-platform development is to create software that seamlessly runs on multiple platforms using one set of &hellip;<\/p>\n","protected":false},"author":5134,"featured_media":927,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-21853","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>From Zero to App: The Cross-Platform Development Approach Simplified: Part Two - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"&quot;Interested to learn more about cross platform development? Then check out our article From Zero to App: The Cross-Platform Development Approach Simplified: Part Two!&quot;\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"&quot;Interested to learn more about cross platform development? Then check out our article From Zero to App: The Cross-Platform Development Approach Simplified: Part Two!&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-11T09:15:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matt Netkow\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matt Netkow\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/\"},\"author\":{\"name\":\"Matt Netkow\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f11a299addb078e8a46ffee9c07fb9bf\"},\"headline\":\"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two\",\"datePublished\":\"2018-06-11T09:15:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/\"},\"wordCount\":2910,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"articleSection\":[\"Web Dev\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/\",\"name\":\"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"datePublished\":\"2018-06-11T09:15:43+00:00\",\"description\":\"\\\"Interested to learn more about cross platform development? Then check out our article From Zero to App: The Cross-Platform Development Approach Simplified: Part Two!\\\"\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Web Dev\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/web-development\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f11a299addb078e8a46ffee9c07fb9bf\",\"name\":\"Matt Netkow\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0ef44e446d9e54e6f1483f06f8422e2fc5f2141620929ab912a3a604bc6b5d94?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0ef44e446d9e54e6f1483f06f8422e2fc5f2141620929ab912a3a604bc6b5d94?s=96&d=mm&r=g\",\"caption\":\"Matt Netkow\"},\"description\":\"Matt Netkow is a full stack developer &amp; hobbyist entrepreneur, specializing in .NET enterprise solutions and cross-platform web-based mobile application development. He writes about full stack and PhoneGap\/Cordova mobile application development at netkow.com. His Pluralsight course, PhoneGap Build Fundamentals, introduces developers to the cross-platform development approach using a web-based technology stack. It covers everything needed to go from zero to app store, including in-depth coverage of native plugins, testing and debugging on mobile devices, and app store submission.\",\"sameAs\":[\"https:\/\/simpleprogrammer.com\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/matt-netkow\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two - Web Code Geeks - 2026","description":"\"Interested to learn more about cross platform development? Then check out our article From Zero to App: The Cross-Platform Development Approach Simplified: Part Two!\"","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/","og_locale":"en_US","og_type":"article","og_title":"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two - Web Code Geeks - 2026","og_description":"\"Interested to learn more about cross platform development? Then check out our article From Zero to App: The Cross-Platform Development Approach Simplified: Part Two!\"","og_url":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2018-06-11T09:15:43+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","type":"image\/jpeg"}],"author":"Matt Netkow","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Matt Netkow","Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/"},"author":{"name":"Matt Netkow","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f11a299addb078e8a46ffee9c07fb9bf"},"headline":"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two","datePublished":"2018-06-11T09:15:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/"},"wordCount":2910,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","articleSection":["Web Dev"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/","url":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/","name":"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","datePublished":"2018-06-11T09:15:43+00:00","description":"\"Interested to learn more about cross platform development? Then check out our article From Zero to App: The Cross-Platform Development Approach Simplified: Part Two!\"","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/web-development\/cross-platform-development-part-two\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Web Dev","item":"https:\/\/www.webcodegeeks.com\/category\/web-development\/"},{"@type":"ListItem","position":3,"name":"From Zero to App: The Cross-Platform Development Approach Simplified: Part Two"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f11a299addb078e8a46ffee9c07fb9bf","name":"Matt Netkow","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0ef44e446d9e54e6f1483f06f8422e2fc5f2141620929ab912a3a604bc6b5d94?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0ef44e446d9e54e6f1483f06f8422e2fc5f2141620929ab912a3a604bc6b5d94?s=96&d=mm&r=g","caption":"Matt Netkow"},"description":"Matt Netkow is a full stack developer &amp; hobbyist entrepreneur, specializing in .NET enterprise solutions and cross-platform web-based mobile application development. He writes about full stack and PhoneGap\/Cordova mobile application development at netkow.com. His Pluralsight course, PhoneGap Build Fundamentals, introduces developers to the cross-platform development approach using a web-based technology stack. It covers everything needed to go from zero to app store, including in-depth coverage of native plugins, testing and debugging on mobile devices, and app store submission.","sameAs":["https:\/\/simpleprogrammer.com"],"url":"https:\/\/www.webcodegeeks.com\/author\/matt-netkow\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/21853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/5134"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=21853"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/21853\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/927"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=21853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=21853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=21853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}