I’m experiencing a problem that i can’t seem to figure out.
Whenever i run my ionic app on a real iOS device it sometimes works perfectly and sometimes freezes (after the splash screen hides). I’m suspecting that a plugin is failing to load causing the app to break.
Here are some details, hopefully there’s a problem with my coding:
Cordova CLI: 6.0.0
Ionic Version: 1.2.4-nightly-1917
Ionic CLI Version: 1.7.14
Ionic App Lib Version: 0.7.0
ios-deploy version: 1.8.4
ios-sim version: 5.0.6
OS: Mac OS X El Capitan
Node Version: v5.4.1
Xcode version: Xcode 7.2.1 Build version 7C1002
These are the plugins i’m currently using:
cordova-plugin-console 1.0.2 "Console"
cordova-plugin-device 1.1.0 "Device"
cordova-plugin-inappbrowser 1.3.0 "InAppBrowser"
cordova-plugin-splashscreen 3.2.0 "Splashscreen"
cordova-plugin-statusbar 2.1.1 "StatusBar"
cordova-plugin-whitelist 1.2.0 "Whitelist"
cordova-plugin-x-toast 2.4.0 "Toast"
ionic-plugin-keyboard 1.0.8 "Keyboard"
phonegap-plugin-push 1.5.3 "PushPlugin"
app.js file:
angular.module('starter', ['ionic','ionic.service.core',
'starter.controllers', 'firebase', 'tagged.directives.autogrow', 'ui.calendar', 'ngCordova'])
.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
if (window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
cordova.plugins.Keyboard.disableScroll(true);
}
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
var push = new Ionic.Push();
push.register(function(token) {
console.log("Device token:",token.token);
var tokenRef = new Firebase('https://myfirebaseapp.firebase.com/PushTokens');
tokenRef.on('value', function(data){
console.log(data.val());
var exists = false;
data.forEach(function(child){
console.log(child.val());
if (child.val().token == token.token){
console.log('found match');
exists = true;
return true;
}
});
if (exists === false){
console.log('nothing found, add token');
tokenRef.push({ "token": token.token });
}
});
});
});
})
.config(function($stateProvider, $urlRouterProvider, $ionicConfigProvider) {
if (ionic.Platform.isIOS()){
$ionicConfigProvider.scrolling.jsScrolling(true);
}
$ionicConfigProvider.views.swipeBackEnabled(false);
$stateProvider
.state('app', {
url: '/app',
abstract: true,
templateUrl: 'templates/menu.html',
controller: 'AppCtrl'
})
.state('app.contacts', {
url: '/contacts',
views: {
'menuContent': {
templateUrl: 'templates/contacts.html',
controller: 'ContactsCtrl'
}
}
})
etc etc .......
});
my index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title></title>
<link href="lib/fullcalendar/dist/fullcalendar.css" rel="stylesheet">
<!-- compiled css output -->
<link href="css/ionic.app.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<!-- ionic/angularjs js -->
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="js/ng-cordova.min.js"></script>
<script src="lib/ionic-platform-web-client/dist/ionic.io.bundle.min.js"></script>
<!--<script src="js/ionic-ion-autoListDivider.js"></script>-->
<!-- cordova script (this will be a 404 during development) -->
<!-- Cordova is bootstrapped by ionic-platform-web-client, uncomment this if you remove ionic-platform-web-client... -->
<!-- <script src="cordova.js"></script> -->
<!-- your app's js -->
<!-- Firebase -->
<script src="js/firebase.js"></script>
<!-- AngularFire -->
<script src="js/angularfire.min.js"></script>
<script src="js/taggedAutogrow.min.js"></script>
<script src="js/md5.min.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
<script type="text/javascript" src="lib/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="lib/moment/min/moment.min.js"></script>
<script type="text/javascript" src="lib/fullcalendar/dist/fullcalendar.min.js"></script>
<script type="text/javascript" src="lib/fullcalendar/dist/gcal.js"></script>
<script type="text/javascript" src="lib/angular-ui-calendar/src/calendar.js"></script>
</head>
<body ng-app="starter">
<ion-nav-view></ion-nav-view>
</body>
</html>
This is my log output on a real iOS device when the app Freezes:
2016-02-15 20:13:15.388 My App Name[780:219212] Apache Cordova native platform version 4.0.1 is starting.
2016-02-15 20:13:15.392 My App Name[780:219212] Multi-tasking -> Device: YES, App: YES
2016-02-15 20:13:15.699 My App Name[780:219212] Using UIWebView
2016-02-15 20:13:15.705 My App Name[780:219212] [CDVTimer][handleopenurl] 0.474989ms
2016-02-15 20:13:15.712 My App Name[780:219212] [CDVTimer][intentandnavigationfilter] 6.397963ms
2016-02-15 20:13:15.713 My App Name[780:219212] [CDVTimer][gesturehandler] 0.388026ms
2016-02-15 20:13:15.756 My App Name[780:219212] [CDVTimer][splashscreen] 42.842031ms
2016-02-15 20:13:15.787 My App Name[780:219212] [CDVTimer][statusbar] 30.280054ms
2016-02-15 20:13:15.789 My App Name[780:219212] [CDVTimer][keyboard] 1.281977ms
2016-02-15 20:13:15.790 My App Name[780:219212] [CDVTimer][TotalPluginStartup] 84.995031ms
2016-02-15 20:13:15.807 My App Name[780:219212] active
2016-02-15 20:13:15.809 My App Name[780:219212] PushPlugin skip clear badge
2016-02-15 20:13:16.579 My App Name[780:219212] Resetting plugins due to page load.
2016-02-15 20:13:18.245 My App Name[780:219212] Finished load of: file:///var/mobile/Containers/Bundle/Application/1C64E20A-49FF-456D-BED0-969E234A8A54/My%20App%20Name.app/www/index.html#/app/notes
And here is a log output when the app Works! Please note this is the same build, i just hard closed and launched the app again:
2016-02-15 20:22:38.610 My App Name[785:220502] Apache Cordova native platform version 4.0.1 is starting.
2016-02-15 20:22:38.615 My App Name[785:220502] Multi-tasking -> Device: YES, App: YES
2016-02-15 20:22:38.965 My App Name[785:220502] Using UIWebView
2016-02-15 20:22:38.972 My App Name[785:220502] [CDVTimer][handleopenurl] 0.477016ms
2016-02-15 20:22:38.979 My App Name[785:220502] [CDVTimer][intentandnavigationfilter] 6.392002ms
2016-02-15 20:22:38.980 My App Name[785:220502] [CDVTimer][gesturehandler] 0.386953ms
2016-02-15 20:22:39.020 My App Name[785:220502] [CDVTimer][splashscreen] 39.930999ms
2016-02-15 20:22:39.050 My App Name[785:220502] [CDVTimer][statusbar] 29.722035ms
2016-02-15 20:22:39.052 My App Name[785:220502] [CDVTimer][keyboard] 1.286030ms
2016-02-15 20:22:39.053 My App Name[785:220502] [CDVTimer][TotalPluginStartup] 81.809998ms
2016-02-15 20:22:39.071 My App Name[785:220502] active
2016-02-15 20:22:39.073 My App Name[785:220502] PushPlugin skip clear badge
2016-02-15 20:22:39.848 My App Name[785:220502] Resetting plugins due to page load.
2016-02-15 20:22:43.562 My App Name[785:220502] Finished load of: file:///var/mobile/Containers/Bundle/Application/54A4B53F-F144-4CD3-BC76-A738BC266D93/My%20App%20Name.app/www/index.html#/app/notes
2016-02-15 20:22:43.970 My App Name[785:220502] Ionic Core: plugins are ready
2016-02-15 20:22:43.988 My App Name[785:220502] THREAD WARNING: ['StatusBar'] took '16.850830' ms. Plugin should use a background thread.
2016-02-15 20:22:43.991 My App Name[785:220502] Ionic Push: register
2016-02-15 20:22:44.008 My App Name[785:220566] Push Plugin register called
2016-02-15 20:22:44.009 My App Name[785:220566] PushPlugin.register: setting badge to false
2016-02-15 20:22:44.009 My App Name[785:220566] PushPlugin.register: clear badge is set to 0
2016-02-15 20:22:44.009 My App Name[785:220566] PushPlugin.register: better button setup
2016-02-15 20:22:44.017 My App Name[785:220566] GCM Sender ID (null)
2016-02-15 20:22:44.017 My App Name[785:220566] Using APNS Notification
2016-02-15 20:22:44.058 My App Name[785:220502] Push Plugin register success: <A valid token number removed for forum viewing>
2016-02-15 20:22:44.336 My App Name[785:220502] Device token: A valid token number removed for forum viewing
2016-02-15 20:22:44.550 My App Name[785:220502] Firebase is connected
Thank you.