4 Replies Latest reply on Jun 7, 2016 1:41 AM by ettiennel77485580

    How do I run/preview apk file for testing purposes before app store submission?

    ettiennel77485580

      Good day,

       

      I have managed to create a PhoneGap Android app up to the point where I can actually download the apk file.

       

      When I click on the ip address in the desktop app a webpage opens with the desired result. When I manually install the apk file on my android device for testing purposes there is an Apache Cordova icon to identify the app (although I did replace all the icons with my apps icons) On opening, the app only says 'Device is ready'.

       

      I tried to test the app with the PhoneGap Developer App downloaded from Google Play. Checked the ip address repeatedly but it only times out with a message saying "Unable to download archive from server. Unable to properly connect to server" Maybe the apk file is fine but I'd rather make sure and see what it is going to look like before trying to submit it to Google Play.

       

      I tried to download numerous emulators and none of them wanted to install for some reason...

       

      If anybody can help with an easy solution I would really appreciate it.

       

      Thank you very much.

        • 1. Re: How do I run/preview apk file for testing purposes before app store submission?
          kerrishotts Adobe Community Professional

          Please share, if you can:

           

          1. config.xml, index.html (at least the head and container where your app renders), index.js (at least where you start the app), project structure [with any identifying information removed if you wish]

          2. devices and associated operating system versions you are testing on

          3. You mention downloading the APK -- are you using PhoneGap Build? If you aren't, please list your exact build steps.

          4. What versions of PhoneGap/Cordova & plugins you are using

          5. Any frameworks (and versions) you are using

          6. What kind of emulators were you trying to use?

          • 2. Re: How do I run/preview apk file for testing purposes before app store submission?
            ettiennel77485580 Level 1

            Thanks for your reply.

             

            1. config.xml

            <widget xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0" id="tv.kruiskyk.app" version="1.0.0">
              <name>Kruiskyk Tv</name>
              <description>Kruiskyk Tv App</description>
              <author href="http://kruiskyk.tv" email="taken-out-for-scrapers">Kruiskyk</author>
              <content src="index.html"/>
              <preference name="DisallowOverscroll" value="true"/>
              <preference name="android-minSdkVersion" value="14"/>
              <plugin name="cordova-plugin-battery-status" source="npm" spec="~1.1.1"/>
              <plugin name="cordova-plugin-camera" source="npm" spec="~2.1.1"/>
              <plugin name="cordova-plugin-media-capture" source="npm" spec="~1.2.0"/>
              <plugin name="cordova-plugin-console" source="npm" spec="~1.0.2"/>
              <plugin name="cordova-plugin-contacts" source="npm" spec="~2.0.1"/>
              <plugin name="cordova-plugin-device" source="npm" spec="~1.1.1"/>
              <plugin name="cordova-plugin-device-motion" source="npm" spec="~1.2.0"/>
              <plugin name="cordova-plugin-device-orientation" source="npm" spec="~1.0.2"/>
              <plugin name="cordova-plugin-dialogs" source="npm" spec="~1.2.0"/>
              <plugin name="cordova-plugin-file" source="npm" spec="~4.1.1"/>
              <plugin name="cordova-plugin-file-transfer" source="npm" spec="~1.5.0"/>
              <plugin name="cordova-plugin-geolocation" source="npm" spec="~2.1.0"/>
              <plugin name="cordova-plugin-globalization" source="npm" spec="~1.0.3"/>
              <plugin name="cordova-plugin-inappbrowser" source="npm" spec="~1.3.0"/>
              <plugin name="cordova-plugin-media" source="npm" spec="~2.2.0"/>
              <plugin name="cordova-plugin-network-information" source="npm" spec="~1.2.0"/>
              <plugin name="cordova-plugin-splashscreen" source="npm" spec="~3.2.1"/>
              <plugin name="cordova-plugin-statusbar" source="npm" spec="~2.1.2"/>
              <plugin name="cordova-plugin-vibration" source="npm" spec="~2.1.0"/>
              <plugin name="cordova-plugin-whitelist" source="npm" spec="~1.2.1"/>
              <icon src="icon.png"/>
              <platform name="android">
                <icon src="www/res/icon/android/drawable-ldpi-icon.png" density="ldpi"/>
                <icon src="www/res/icon/android/drawable-mdpi-icon.png" density="mdpi"/>
                <icon src="www/res/icon/android/drawable-hdpi-icon.png" density="hdpi"/>
                <icon src="www/res/icon/android/drawable-xhdpi-icon.png" density="xhdpi"/>
                <icon src="www/res/icon/android/drawable-xxhdpi-icon.png" density="xxhdpi"/>
                <icon src="www/res/icon/android/drawable-xxxhdpi-icon.png" density="xxxhdpi"/>
                <splash src="www/res/screen/android/drawable-land-ldpi-screen.png" density="land-ldpi"/>
                <splash src="www/res/screen/android/drawable-land-mdpi-screen.png" density="land-mdpi"/>
                <splash src="www/res/screen/android/drawable-land-hdpi-screen.png" density="land-hdpi"/>
                <splash src="www/res/screen/android/drawable-land-xhdpi-screen.png" density="land-xhdpi"/>
                <splash src="www/res/screen/android/drawable-land-xxhdpi-screen.png" density="land-xxhdpi"/>
                <splash src="www/res/screen/android/drawable-land-xxxhdpi-screen.png" density="land-xxxhdpi"/>
                <splash src="www/res/screen/android/drawable-port-ldpi-screen.png" density="port-ldpi"/>
                <splash src="www/res/screen/android/drawable-port-mdpi-screen.png" density="port-mdpi"/>
                <splash src="www/res/screen/android/drawable-port-hdpi-screen.png" density="port-hdpi"/>
                <splash src="www/res/screen/android/drawable-port-xhdpi-screen.png" density="port-xhdpi"/>
                <splash src="www/res/screen/android/drawable-port-xxhdpi-screen.png" density="port-xxhdpi"/>
                <splash src="www/res/screen/android/drawable-port-xxxhdpi-screen.png" density="port-xxxhdpi"/>
              </platform>
              <platform name="ios">
                <icon src="www/res/icon/ios/icon.png" platform="ios" width="57" height="57"/>
                <icon src="www/res/icon/ios/icon@2x.png" platform="ios" width="114" height="114"/>
                <icon src="www/res/icon/ios/icon-40.png" platform="ios" width="40" height="40"/>
                <icon src="www/res/icon/ios/icon-40@2x.png" platform="ios" width="80" height="80"/>
                <icon src="www/res/icon/ios/icon-50.png" platform="ios" width="50" height="50"/>
                <icon src="www/res/icon/ios/icon-50@2x.png" platform="ios" width="100" height="100"/>
                <icon src="www/res/icon/ios/icon-60.png" platform="ios" width="60" height="60"/>
                <icon src="www/res/icon/ios/icon-60@2x.png" platform="ios" width="120" height="120"/>
                <icon src="www/res/icon/ios/icon-60@3x.png" platform="ios" width="180" height="180"/>
                <icon src="www/res/icon/ios/icon-72.png" platform="ios" width="72" height="72"/>
                <icon src="www/res/icon/ios/icon-72@2x.png" platform="ios" width="144" height="144"/>
                <icon src="www/res/icon/ios/icon-76.png" platform="ios" width="76" height="76"/>
                <icon src="www/res/icon/ios/icon-76@2x.png" platform="ios" width="152" height="152"/>
                <icon src="www/res/icon/ios/icon-small.png" platform="ios" width="29" height="29"/>
                <icon src="www/res/icon/ios/icon-small@2x.png" platform="ios" width="58" height="58"/>
                <icon src="www/res/icon/ios/icon-small@3x.png" platform="ios" width="87" height="87"/>
                <splash src="www/res/screen/ios/Default-568h@2x~iphone.png" platform="ios" width="640" height="1136"/>
                <splash src="www/res/screen/ios/Default-667h.png" platform="ios" width="750" height="1334"/>
                <splash src="www/res/screen/ios/Default-736h.png" platform="ios" width="1242" height="2208"/>
                <splash src="www/res/screen/ios/Default-Landscape-736h.png" platform="ios" width="2208" height="1242"/>
                <splash src="www/res/screen/ios/Default-Landscape@2x~ipad.png" platform="ios" width="2048" height="1536"/>
                <splash src="www/res/screen/ios/Default-Landscape~ipad.png" platform="ios" width="1024" height="768"/>
                <splash src="www/res/screen/ios/Default-Portrait@2x~ipad.png" platform="ios" width="1536" height="2048"/>
                <splash src="www/res/screen/ios/Default-Portrait~ipad.png" platform="ios" width="768" height="1024"/>
                <splash src="www/res/screen/ios/Default@2x~iphone.png" platform="ios" width="640" height="960"/>
                <splash src="www/res/screen/ios/Default~iphone.png" platform="ios" width="320" height="480"/>
              </platform>
              <platform name="wp8">
                <icon src="www/res/icon/wp8/ApplicationIcon.png" platform="wp8" width="99" height="99"/>
                <icon src="www/res/icon/wp8/Background.png" platform="wp8" width="159" height="159"/>
                <splash src="www/res/screen/wp8/screen-portrait.jpg" platform="wp8" width="768" height="1280"/>
              </platform>
              <platform name="windows">
                <icon src="www/res/icon/windows/Square150x150Logo.scale-100.png" platform="windows" width="150" height="150"/>
                <icon src="www/res/icon/windows/Square30x30Logo.scale-100.png" platform="windows" width="30" height="30"/>
                <icon src="www/res/icon/windows/StoreLogo.scale-100.png" platform="windows" width="50" height="50"/>
                <splash src="www/res/screen/windows/SplashScreen.scale-100.png" platform="windows" width="620" height="300"/>
                <icon src="www/res/icon/windows/StoreLogo.scale-240.png" platform="windows" width="120" height="120"/>
                <icon src="www/res/icon/windows/Square44x44Logo.scale-100.png" platform="windows" width="44" height="44"/>
                <icon src="www/res/icon/windows/Square44x44Logo.scale-240.png" platform="windows" width="106" height="106"/>
                <icon src="www/res/icon/windows/Square70x70Logo.scale-100.png" platform="windows" width="70" height="70"/>
                <icon src="www/res/icon/windows/Square71x71Logo.scale-100.png" platform="windows" width="71" height="71"/>
                <icon src="www/res/icon/windows/Square71x71Logo.scale-240.png" platform="windows" width="170" height="170"/>
                <icon src="www/res/icon/windows/Square150x150Logo.scale-240.png" platform="windows" width="360" height="360"/>
                <icon src="www/res/icon/windows/Square310x310Logo.scale-100.png" platform="windows" width="310" height="310"/>
                <icon src="www/res/icon/windows/Wide310x150Logo.scale-100.png" platform="windows" width="310" height="150"/>
                <icon src="www/res/icon/windows/Wide310x150Logo.scale-240.png" platform="windows" width="744" height="360"/>
                <splash src="www/res/screen/windows/SplashScreenPhone.scale-240.png" platform="windows" width="1152" height="1920"/>
              </platform>
              <access origin="http://kruiskyk.tv" subdomains="true"/>
              <allow-intent href="http://*/*"/>
              <allow-intent href="https://*/*"/>
              <allow-intent href="tel:*"/>
              <allow-intent href="sms:*"/>
              <allow-intent href="mailto:*"/>
              <allow-intent href="geo:*"/>
              <platform name="android">
                <allow-intent href="market:*"/>
              </platform>
              <platform name="ios">
                <allow-intent href="itms:*"/>
                <allow-intent href="itms-apps:*"/>
              </platform>
            </widget>
            

             

            index.html

            <!DOCTYPE html>
            <!--
                Copyright (c) 2012-2016 Adobe Systems Incorporated. All rights reserved.
            
            
                Licensed to the Apache Software Foundation (ASF) under one
                or more contributor license agreements.  See the NOTICE file
                distributed with this work for additional information
                regarding copyright ownership.  The ASF licenses this file
                to you under the Apache License, Version 2.0 (the
                "License"); you may not use this file except in compliance
                with the License.  You may obtain a copy of the License at
            
            
                http://www.apache.org/licenses/LICENSE-2.0
            
            
                Unless required by applicable law or agreed to in writing,
                software distributed under the License is distributed on an
                "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
                 KIND, either express or implied.  See the License for the
                specific language governing permissions and limitations
                under the License.
            -->
            <html>
            
            
            <head>
                <meta charset="utf-8" />
                <meta name="format-detection" content="telephone=no" />
                <meta name="msapplication-tap-highlight" content="no" />
                <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
                <!-- This is a wide open CSP declaration. To lock this down for production, see below. -->
                <meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline'; style-src 'self' 'unsafe-inline'; media-src *" />
                <!-- Good default declaration:
                * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
                * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
                * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
                    * Enable inline JS: add 'unsafe-inline' to default-src
                    * Enable eval(): add 'unsafe-eval' to default-src
                * Create your own at http://cspisawesome.com
                -->
                <!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: 'unsafe-inline' https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *" /> -->
            
            
                <link rel="stylesheet" type="text/css" href="css/index.css" />
                <title>Kruiskyk Tv App</title>
            
              <script>
              document.addEventListener("deviceready", onDeviceReady, false); 
            function onDeviceReady() {
                // Now safe to use the Codova API
             window.location="http://kruiskyk.tv"; }
                </script>
            
            </head>
            
            
            <body>
                <div class="app">
                    <h1>Kruiskyk Tv</h1>
                    <div id="deviceready" class="blink">
                        <p class="event listening">Besig om te laai...</p>
                        <p class="event received">Goeie Nuus In Jou Taal</p>
                    </div>
                </div>
                <script type="text/javascript" src="cordova.js"></script>
                <script type="text/javascript" src="js/index.js"></script>
                <script type="text/javascript">
                    app.initialize();
                </script>
            </body>
            
            
            </html>
            

             

            index.js

            /*
             * Licensed to the Apache Software Foundation (ASF) under one
             * or more contributor license agreements.  See the NOTICE file
             * distributed with this work for additional information
             * regarding copyright ownership.  The ASF licenses this file
             * to you under the Apache License, Version 2.0 (the
             * "License"); you may not use this file except in compliance
             * with the License.  You may obtain a copy of the License at
             *
             * http://www.apache.org/licenses/LICENSE-2.0
             *
             * Unless required by applicable law or agreed to in writing,
             * software distributed under the License is distributed on an
             * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
             * KIND, either express or implied.  See the License for the
             * specific language governing permissions and limitations
             * under the License.
             */
            var app = {
                // Application Constructor
                initialize: function() {
                    this.bindEvents();
                },
                // Bind Event Listeners
                //
                // Bind any events that are required on startup. Common events are:
                // 'load', 'deviceready', 'offline', and 'online'.
                bindEvents: function() {
                    document.addEventListener('deviceready', this.onDeviceReady, false);
                },
                // deviceready Event Handler
                //
                // The scope of 'this' is the event. In order to call the 'receivedEvent'
                // function, we must explicitly call 'app.receivedEvent(...);'
                onDeviceReady: function() {
                    app.receivedEvent('deviceready');
                },
                // Update DOM on a Received Event
                receivedEvent: function(id) {
                    var parentElement = document.getElementById(id);
                    var listeningElement = parentElement.querySelector('.listening');
                    var receivedElement = parentElement.querySelector('.received');
            
            
                    listeningElement.setAttribute('style', 'display:none;');
                    receivedElement.setAttribute('style', 'display:block;');
            
            
                    console.log('Received Event: ' + id);
                }
            };
            

             

            2. Windows 7 and a Samsung GT-S7580 Mobile Device.

            3. Yes, I am using PhoneGap Build.

            4. Phonegap v0.3.3 and no additional plugins.

            5. No frameworks.

            6. Bluestacks, Genymotion, Droid4x

             

            Thank you very much.

            • 3. Re: How do I run/preview apk file for testing purposes before app store submission?
              kerrishotts Adobe Community Professional

              You're taking an odd route to launching an external site in PhoneGap, but I think your issue is the misconfiguration of your whitelist for this purpose. See https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-whitelist/#navigation-w hitelist . In short, you need an allow-navigation tag for the domain you wish to redirect to.

               

              That said, I highly advise against doing this: PhoneGap is not intended to be used simply as a redirect to an external site, and Apple will reject if you attempt to submit an app that does this. Generally a home page bookmark will suffice in these cases.

               

              Instead, keep as much of your code local and use XHR (AJAX) to communicate with your backend. If you need hot code pushes, you can do that (CodePush).

              • 4. Re: How do I run/preview apk file for testing purposes before app store submission?
                ettiennel77485580 Level 1

                Thank you very much for your good advice and I do agree with your suggestions