<?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>Cross Platform Dev Blog &#187; Uncategorized</title>
	<atom:link href="http://trigger.io/cross-platform-application-development-blog/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://trigger.io/cross-platform-application-development-blog</link>
	<description></description>
	<lastBuildDate>Wed, 16 May 2012 19:59:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How to build a location-based hybrid mobile app with reverse geocoding</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/05/15/how-to-build-a-location-based-hybrid-mobile-app-with-reverse-geocoding/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-build-a-location-based-hybrid-mobile-app-with-reverse-geocoding</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/05/15/how-to-build-a-location-based-hybrid-mobile-app-with-reverse-geocoding/#comments</comments>
		<pubDate>Tue, 15 May 2012 17:31:55 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1963</guid>
		<description><![CDATA[Over the weekend I released a new app on the App Store and Google Play and I wanted to share how I handled the geolocation features and GMaps integration. The app is location-based wine rating. You can track what wine you&#8217;ve consumed at restaurants by taking photos of labels and rating them. I hate going back [...]]]></description>
			<content:encoded><![CDATA[<p>Over the weekend I released a new app on the App Store and Google Play and I wanted to share how I handled the geolocation features and GMaps integration.</p>
<p>The app is location-based wine rating. You can track what wine you&#8217;ve consumed at restaurants by taking photos of labels and rating them. I hate going back to a restaurant and not knowing what we ordered last time &#8211; so I built this app! Check it out:</p>
<div style="height: 350px; margin: 0; padding: 0;">
<div class="alignleft" style="margin: 75px 20px 0 0; padding: 0;"><a href="http://itunes.apple.com/en/app/wine-box/id525182844?mt=8" target="_blank"><img title="ios" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/ios.jpg" alt="" width="133" height="43" /></a><a href="https://play.google.com/store/apps/details?id=io.trigger.forge4e85e53e8c2011e1931112313d1adcbe" target="_blank"><img title="android" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/android1.jpg" alt="" width="133" height="44" /></a></div>
<div class="alignleft" style="margin: 0 20px 0 0; padding: 0;"><a href="https://lh5.ggpht.com/raEvuj0z0r7wtOV5KE0WSJbYeQ3-a0smA3gNReGfzVu3oHGfpV23Pke46_z7j_hbGg"><img title="Rate Wine" src="https://lh5.ggpht.com/raEvuj0z0r7wtOV5KE0WSJbYeQ3-a0smA3gNReGfzVu3oHGfpV23Pke46_z7j_hbGg" alt="" width="184" height="307" /></a></div>
<div class="alignleft" style="margin: 0; padding: 0;"><a href="https://lh3.ggpht.com/GHSLmEyRymlySBw_bSoIIQ1JEv0CcjuvgZS1ISEjdajwotnu3rnDxBUV2OSVQdPPzxQ"><img title="Wine Map" src="https://lh3.ggpht.com/GHSLmEyRymlySBw_bSoIIQ1JEv0CcjuvgZS1ISEjdajwotnu3rnDxBUV2OSVQdPPzxQ" alt="" width="184" height="307" /></a></div>
</div>
<p>To build the app I used HTML, CSS, JavaScript and the Trigger.io platform to add native features and package it for the app stores, with these libraries:</p>
<ul>
<li><a title="How to build fast HTML5 mobile apps using backbone.js, zepto.js and trigger.io" href="http://trigger.io/cross-platform-application-development-blog/2012/03/02/how-to-build-fast-html5-mobile-apps-using-backbone-js-zepto-js-and-trigger-io/" target="_blank">Backbone and Zepto</a> libraries</li>
<li><a href="http://mustache.github.com/" target="_blank">Mustache templates</a></li>
<li>Trigger.io&#8217;s <a href="http://current-docs.trigger.io/modules" target="_blank">Forge API</a></li>
<li><a title="How to build hybrid mobile apps combining native UI components with HTML5" href="http://trigger.io/cross-platform-application-development-blog/2012/04/30/how-to-build-hybrid-mobile-apps-combining-native-ui-components-with-html5/" target="_blank">Trigger.io&#8217;s topbar and tabbar native UI components</a></li>
<li>Google Maps to plot the locations where I rated wine &#8211; in a similar way to how <a title="Using Geolocation and GMaps with  Trigger.io, Appnovation gets first-time App Store approval" href="http://trigger.io/cross-platform-application-development-blog/2012/05/08/using-geolocation-and-gmaps-with-trigger-io-appnovation-gets-first-time-app-store-approval/" target="_blank">Appnovation, one of our customers, created their location-based app</a></li>
<li>Google Maps&#8217; reverse geocoding API to be able to extract the address from the location</li>
</ul>
<p>I&#8217;ll mainly focus on the Google Maps integration part and assume existing knowledge of Backbone. But I&#8217;ll also try to highlight some other interesting snippets. We will cover how to:</p>
<ul>
<li>render the map at app startup for a fast user experience when the user clicks to view</li>
<li>load Google Maps asynchronously and place markers</li>
<li>get the current location and do a reverse geocoding lookup</li>
<li>control navigation between backbone views from the native tabbar</li>
</ul>
<p>There is a lot going on in the app so we&#8217;ll only look at snippets. For the full picture, you can <a href="https://github.com/amirnathoo/Wine-Box" target="_blank">see the code on GitHub</a>.</p>
<h2>Using the Forge build / test cycle</h2>
<p>Throughout the development of this app, I used <a title="How Forge works and why we’re proud of it" href="http://trigger.io/cross-platform-application-development-blog/2012/01/26/how-forge-works-and-why-were-proud-of-it/" target="_blank">Trigger.io&#8217;s Forge platform to run fast build / test cycles</a> in the device emulators so I could develop the flow with the native device features and the <a href="https://current-docs.trigger.io/modules" target="_blank">Forge API</a> already incorporated. Each time I change the code it was just a couple of seconds and two commands to see the changes:</p>
<pre>forge build

forge run ios</pre>
<p>If you want to try building the code as native apps yourself as you follow along this post, just <a title="Trigger.io Forge" href="https://trigger.io/forge" target="_blank">signup for free</a> and download the lightweight command-line tools to get started.</p>
<p>I also used <a href="http://trigger.io/cross-platform-application-development-blog/2012/05/04/screencast-trigger-io-catalyst-in-action-2/" target="_blank">Catalyst &#8211; a WebKit like debugger for mobile webviews</a> to see the logging output and debug the presentation and logic.</p>
<h2>Basic Structure</h2>
<p>The first step was to include all my JavaScript and HTML templates in my <a href="https://github.com/amirnathoo/Wine-Box/blob/master/index.html" target="_blank">index.html here</a>. Then I described the paths through the app in <a href="https://github.com/amirnathoo/Wine-Box/blob/master/router.js" target="_blank">router.js</a>:</p>
<pre>// Router
wine.types.Router = Backbone.Router.extend({
  routes: {
    "rateTab": "rateTab",
    "listTab": "listTab",
    "mapTab": "mapTab",
    "mapTab/:idx": "mapTab",
    "picture": "picture",
    "rate": "rate",
    "detail/:idx": "detail"
  },
  rateTab: function() {
    state.get('rateButton').setActive();
    forge.topbar.setTitle("Rate Wine");
    if (!state.get('currentPhoto')) {
      wine.router.navigate('picture', { trigger: true });
    } else {
      wine.router.navigate('rate', { trigger: true });
    }
  },
  listTab: function() {
    state.get('listButton').setActive();
    forge.topbar.setTitle("Wine List");
    state.get('list').show();
  },
  mapTab: function(idx) {
    state.get('mapButton').setActive();
    forge.topbar.setTitle("Wine Map");
    state.get('map').show(idx);
  },
  picture: function () {
    state.set('currentPhoto', null);
    var page = new wine.views.Picture();
    page.render().show();
  },
  rate: function() {
    var page = new wine.views.Rate();
    page.render().show();
  },
  detail: function(idx) {
    forge.logging.log('... Showing detail for index: '+idx);
    var page = new wine.views.Detail();
    page.render(idx).show();
  }
});
wine.router = new wine.types.Router();</pre>
<p>You can see that the mapTab is one of the routes and we can optionally pass it an index of a particular item to plot (when we don&#8217;t, all of the items will be plotted). Lets focus in on that map view.</p>
<h2>Pre-loading Google Maps view</h2>
<p>When we navigate to the mapTab in the router, we actually show a pre-existing map rather than initializing it there:</p>
<pre>mapTab: function(idx) {
  state.get('mapButton').setActive();
  forge.topbar.setTitle("Wine Map");
  state.get('map').show(idx);
}</pre>
<p>This is for a smoother experience since when the user clicks the map tab we&#8217;ve actually preloaded the map in the initialization code in <a href="https://github.com/amirnathoo/Wine-Box/blob/master/wine.js" target="_blank">wine.js</a>:</p>
<pre>state.set('map', new wine.views.Map());
state.get('map').render();
forge.logging.log('Pre-rendered map');</pre>
<p>In <a href="https://github.com/amirnathoo/Wine-Box/blob/master/views.js" target="_blank">views.js</a>, the render function of the wine.views.Map prototype looks like this:</p>
<pre>render: function() {
  var el = this.el;
  var script = document.createElement("script");
  script.type = "text/javascript";
  script.src = "http://maps.googleapis.com/maps/api/js?key=&lt;YOUR_API_KEY&gt;&amp;sensor=true&amp;callback=wine.util.initMap";
  document.body.appendChild(script);
  $('#map_container').append(el);
  return this;
}</pre>
<p>You can <a href="https://developers.google.com/maps/signup" target="_blank">signup for a Google Maps API key here</a>. In the render function, we asynchronously load the map by embedding the script tag for it. This can then be loaded in the background and initialized when ready. The div with id &#8216;map_container&#8217; is set to have width and height 100%, but is hidden until the show() function is called from the router. The callback function wine.util.initMap simply references the initMap function on the map view object.</p>
<h2>Placing markers and controlling navigation</h2>
<p>Here&#8217;s how we initialize the map with markers once the GMaps script has loaded:</p>
<pre>initMap: function() {
  forge.logging.log('... Initializing map');
  forge.geolocation.getCurrentPosition(function(position) {
    $(this.el).empty();
    state.set('currentCoords', position.coords);
    forge.logging.log('Set current position:');
    forge.logging.log(position.coords);
    var latLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude, true);
    var myOptions = {
      zoom: 15,
      center: latLng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    forge.logging.log('... Create map');
    state.get('map').gmap = new google.maps.Map(document.getElementById('map'), myOptions);
    forge.tools.getURL('img/blue-pin.png', function(src) {
      forge.logging.log('... Add position marker');
      state.set('currentMarker', new google.maps.Marker({
        position: latLng,
        title: "Current Position",
        icon: src,
        map: state.get('map').gmap,
        zIndex: -1
      }));
    });
    wine.photos.each(state.get('map').add);
    forge.logging.log('Created map ...');
  });
}</pre>
<p>This snippet shows how we center the map on, and set a custom marker icon for, the current position. We&#8217;ll use the default icon to plot the other locations (where we&#8217;ve previously taken photos of wine labels). Here&#8217;s what happens when we call :</p>
<pre>wine.photos.each(state.get('map').add);
// ...
add: function(item) {
  var latLng = new google.maps.LatLng(item.get('position').latitude, item.get('position').longitude, true);
  var marker = new google.maps.Marker({
    position: latLng,
    map: state.get('map').gmap,
    zIndex: 1
  });
  var idx = wine.photos.indexOf(item)
  google.maps.event.addListener(marker, 'click', function() {
    wine.router.navigate('detail/'+idx, { trigger: true });
    $('#map_container').hide();
  });
}</pre>
<p>Once the map is in place, you can see how simple it is to place markers for all the objects you wish to plot and then to control navigation when those markers are clicked using the call to :</p>
<pre>google.maps.event.addListener</pre>
<h2>Showing the map with all items or a specific item</h2>
<p>It only remains for us to display the map when the user navigates there, either to show the locations of all the items relative to the current position, or to focus on one item in particular. To do that, here is the show function:</p>
<pre>show: function(idx) {
  $('#map_container').show();
  wine.util.resetCurrentView(this);
  if (state.get('map').gmap) {
    google.maps.event.trigger(state.get('map').gmap, 'resize');
    var currentLatLng = new google.maps.LatLng(state.get('currentCoords').latitude, state.get('currentCoords').longitude, true);
    if (idx) {
      var item = wine.photos.at(idx);
      var latLng = new google.maps.LatLng(item.get('position').latitude, item.get('position').longitude, true);
      state.get('map').gmap.setCenter(latLng);
    } else {
      state.get('map').gmap.setCenter(currentLatLng);
    }
    state.get('currentMarker').setPosition(currentLatLng);
  } else {
    this.initMap();
    $('#map').html('&lt;div class="title"&gt;Loading...&lt;/div&gt;');
  }
  if (idx) {
    forge.topbar.addButton({
      text: 'Back',
      position: 'left',
      type: 'back'
    }, function() {
      $('#map_container').hide();
    });
  }
}</pre>
<p>The idx parameter is optionally passed in &#8211; this refers to the index of the item in our model that we want to focus on. The code branches depending on whether it is passed in. If it is not, the map centers on the current location, otherwise it centers on the location of that item.</p>
<p>There&#8217;s no guarantee that the map has loaded already when the view is shown since the Google Maps script is loaded asynchronously. This is why we also need to check for the maps existence and display &#8216;Loading&#8230;&#8217; text as a stop-gap.</p>
<h2>Getting the current location and reverse geocoding lookup</h2>
<p>That&#8217;s pretty much it for the map view, but there&#8217;s a couple more pieces to making the app work well with location.</p>
<p>In the map view functions, you&#8217;ll have seen references to the current location and it&#8217;s worth highlighting how we get that. In the initMap function, we used this call:</p>
<pre>forge.geolocation.getCurrentPosition</pre>
<p>We could use HTML5 geolocation instead, but the problem with that is it throws up an ugly warning to the user with the full path to the index.html file. Using the <a href="http://current-docs.trigger.io/modules/geolocation.html" target="_blank">forge.geolocation.getCurrentPosition</a> API we access true native geolocation and the warning message is much friendler:</p>
<p><a href="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/iOS-Simulator-Screen-shot-May-14-2012-3.13.37-PM1.png"><img class="aligncenter size-full wp-image-2092" title="Geolocation warning" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/iOS-Simulator-Screen-shot-May-14-2012-3.13.37-PM1.png" alt="" width="320" height="480" /></a></p>
<p>&nbsp;</p>
<p>The final piece is reverse geocoding: extracting an address from location data, because we want to show a list of the locations where we&#8217;ve taken photos of wine labels as well just plotting them on a map. To do that is simple with the v3 Google Maps API:</p>
<pre>getLocation: function(coords, timestamp) {
  forge.request.ajax({
    url: "http://maps.googleapis.com/maps/api/geocode/json?latlng="+coords.latitude+","+coords.longitude+"&amp;sensor=true",
    dataType: "json",
    success: function(response) {
      try {
        var photo = wine.photos.filter(function(item) {
          return item.get('timestamp') == timestamp;
        })[0];
        if (photo) {
          photo.set('location', response.results[0].formatted_address);
          $('#_'+timestamp+' .title').html(photo.get('location'));
        } else {
          forge.logging.log('No photo with timestamp: '+timestamp);
        }
      } catch(e) {
        forge.logging.log('--- Exception getting location --- ');
        forge.logging.log(e);
        forge.logging.log('--- Photo:');
        forge.logging.log(photo);
        forge.logging.log('--- Response:');
        forge.logging.log(response);
      }
    },
    error: function(response) {
      forge.logging.log('--- Error getting location, response:');
      forge.logging.log(response);
    }
  });
}</pre>
<h2>Controlling navigation from the native tabbar</h2>
<p>That&#8217;s it for the location part of the app, but if you look at the code, you can see a lot more going on, such as use of <a href="http://mustache.github.com/" target="_blank">Mustache templates</a>, the native camera using <a href="http://current-docs.trigger.io/modules/file.html#getimage" target="_blank">forge.file.getImage</a>, and a star rating input element (thanks to the <a href="http://www.yuiblog.com/blog/2010/08/24/developing-an-accessible-star-ratings-widget/" target="_blank">Yahoo! User Interface Blog</a> for the snippets).</p>
<p>But the remaining aspect I&#8217;d like to highlight is just how easy it is to configure a native tabbar to handle navigation in conjunction with backbone. Check-out this snippet from <a href="https://github.com/amirnathoo/Wine-Box/blob/master/main.js" target="_blank">main.js</a>:</p>
<pre>forge.tabbar.addButton({
  text: "Rate Wine",
  icon: "img/star.png",
  index: 0
}, function (button) {
  state.set('rateButton', button);
  button.onPressed.addListener(function () {
    wine.router.navigate('rateTab', { trigger: true });
  });
});

forge.tabbar.addButton({
  text: "Wine List",
  icon: "img/bottle.png",
  index: 1
}, function (button) {
  state.set('listButton', button);
  button.onPressed.addListener(function () {
    wine.router.navigate('listTab', { trigger: true });
  });
});

forge.tabbar.addButton({
  text: "Wine Map",
  icon: "img/map.png",
  index: 2
}, function (button) {
  state.set('mapButton', button);
  button.onPressed.addListener(function () {
    wine.router.navigate('mapTab', { trigger: true });
  });
});</pre>
<h2></h2>
<h2>Conclusion</h2>
<p>Using the Forge API and build/test cycle, backbone and other great libraries you can develop powerful, native mobile applications with relatively few lines of code. You can use native geolocation and the Google Maps API to add location-based features fast.</p>
<p>We hope this has whetted your appetite to try developing hybrid mobile apps incorporating Google Maps.</p>
<p>Questions, comments? Let us know at <a href="mailto:support@trigger.io" target="_blank">support@trigger.io</a>. We&#8217;d love to hear from you and help with your app plans. <a href="https://trigger.io/forge" target="_blank">Sign up now</a> to get started.</p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/05/15/how-to-build-a-location-based-hybrid-mobile-app-with-reverse-geocoding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New features: video capture, network status APIs available, WebSQL support, improved modal view</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/05/09/video-capture-network-status-apis-available-websql-support-improved-modal-view/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=video-capture-network-status-apis-available-websql-support-improved-modal-view</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/05/09/video-capture-network-status-apis-available-websql-support-improved-modal-view/#comments</comments>
		<pubDate>Wed, 09 May 2012 20:51:03 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1910</guid>
		<description><![CDATA[Our development team organizes themselves in two week sprints. We&#8217;ve just completed one and added some major new features to the platform. This sprint we added: Improved Modal View with styling options Video Capture API Network Status API WebSQL Support Improved Modal View forge.tabs.openWithOptions now allows you to customize the appearance of modal views on mobile. [...]]]></description>
			<content:encoded><![CDATA[<p>Our development team organizes themselves in two week sprints. We&#8217;ve just completed one and added some major new features to the platform. This sprint we added:</p>
<ul>
<li>Improved Modal View with styling options</li>
<li>Video Capture API</li>
<li>Network Status API</li>
<li>WebSQL Support</li>
</ul>
<div>
<h2>Improved Modal View</h2>
<p><a href="http://docs.trigger.io/en/v1.3/modules/tabs.html#openwithoptions">forge.tabs.openWithOptions</a> now allows you to customize the appearance of modal views on mobile.</p>
<p style="text-align: center;"><a href="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/iOS-Simulator-Screen-shot-May-9-2012-2.01.24-PM.png"><img class="aligncenter" title="Modal View" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/iOS-Simulator-Screen-shot-May-9-2012-2.01.24-PM.png" alt="" width="320" height="480" /></a></p>
<pre>forge.tabs.openWithOptions({
	url: 'https://trigger.io',
	title: 'TRIGGER.IO Homepage',
	tint: [41, 41, 41, 255],
	buttonText: 'Exit',
	buttonTint: [218, 174, 56,255]
});</pre>
</div>
<h2>Video Capture API</h2>
<p>New API <a href="http://docs.trigger.io/en/v1.3/modules/file.html#getvideo">forge.file.getVideo</a> allows you to develop apps that include video capture where the device supports that.</p>
<pre>file.getVideo([<em>params</em>], <em>success</em>, <em>error)</em></pre>
<table frame="void" rules="none">
<colgroup>
<col />
<col /></colgroup>
<tbody valign="top">
<tr>
<th>
<h3>Arguments:</h3>
<h3></h3>
</th>
<td>
<ul>
<li><strong>params</strong> (<em>object</em>) &#8212; object optional parameters.</li>
<li><strong>success</strong> (<em>function(file)</em>) &#8212; callback to be invoked when no errors occur (argument is the returned file)</li>
<li><strong>error</strong> (<em>function(content)</em>) &#8212; called with details of any error which may occur</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h2>Network Status API</h2>
<p>New API methods <a href="http://docs.trigger.io/en/v1.3/modules/is.html#is.connection.connected">forge.is.connection.connected</a> and <a href="http://docs.trigger.io/en/v1.3/modules/is.html#is.connection.wifi">forge.is.connection.wifi</a> let you change your apps&#8217; behavior according to the connection status.</p>
<pre>is.connection.connected()</pre>
<table frame="void" rules="none">
<tbody valign="top">
<tr>
<th>
<h3>Return boolean:</h3>
</th>
<td>  Returns true if a mobile device has an active internet connection.</td>
</tr>
</tbody>
</table>
<pre>is.connection.wifi()</pre>
<table frame="void" rules="none">
<tbody valign="top">
<tr>
<th>
<h3>Return boolean:</h3>
</th>
<td>  Returns true if a mobile device is connected via wifi.</td>
</tr>
</tbody>
</table>
<h2>WebSQL support</h2>
<p>The normal web database API is now available: <a href="http://www.w3.org/TR/webdatabase/" rel="nofollow">http://www.w3.org/TR/webdatabase/</a></p>
<p><strong>Note</strong>: not all browsers support Web SQL <a href="http://caniuse.com/#feat=sql-storage" rel="nofollow">http://caniuse.com/#feat=sql-storage</a></p>
<p>For example, one of the tests we run is similar to this:</p>
<pre>var db = openDatabase('mydb', '1.0', 'example database', 2 * 1024 * 1024);
db.transaction(function (tx) {
    tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)');
    tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "foobar")');
});

db.transaction(function (tx) {
    tx.executeSql('DROP TABLE foo');

    // known to fail - so should rollback the DROP statement
    tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "foobar")');
    forge.logging.error("INSERT into non-existent table succeeded!");
}, function (err) {
    forge.logging.info("error callback invoked, as expected");
});

db.transaction(function (tx) {
    tx.executeSql('SELECT * FROM foo', [], function (tx, results) {
        forge.logging.info("row: "+results);
    });
});</pre>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/05/09/video-capture-network-status-apis-available-websql-support-improved-modal-view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Geolocation and GMaps with  Trigger.io, Appnovation gets first-time App Store approval</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/05/08/using-geolocation-and-gmaps-with-trigger-io-appnovation-gets-first-time-app-store-approval/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-geolocation-and-gmaps-with-trigger-io-appnovation-gets-first-time-app-store-approval</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/05/08/using-geolocation-and-gmaps-with-trigger-io-appnovation-gets-first-time-app-store-approval/#comments</comments>
		<pubDate>Tue, 08 May 2012 18:17:11 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1884</guid>
		<description><![CDATA[We’ve been supporting enterprise development shop Appnovation in building their first Forge app. The app – for NeedAnAccountant.org – lets (Canadian) users find their nearest accountants, using our framework to wrap their app to native (packaged for iPhone and Android), handle cross-domain requests and native geolocation features through our API. Google Maps and Geolocation API integration [...]]]></description>
			<content:encoded><![CDATA[<p>We’ve been supporting enterprise development shop Appnovation in building their first Forge app. The app – for <a href="http://needanaccountant.org">NeedAnAccountant.org</a> – lets (Canadian) users find their nearest accountants, using our framework to wrap their app to native (packaged for iPhone and Android), handle cross-domain requests and native geolocation features through our API.</p>
<p><img class="alignnone" style="display: inline;" title="Need An Account screenshot" src="http://needanaccountant.org/Images/MobileAppScreenshot2.png" alt="" width="180" height="258" /><img class="alignnone" style="display: inline;" title="Need An Accountant screenshot" src="http://needanaccountant.org/Images/MobileAppScreenshot3.png" alt="" width="180" height="258" /><img class="alignnone" style="display: inline;" title="NeedAnAccount Screenshot" src="http://needanaccountant.org/Images/MobileAppScreenshot1.png" alt="" width="180" height="258" /></p>
<h3></h3>
<h3></h3>
<h3>Google Maps and Geolocation API integration</h3>
<p>Under the hood, the map is integrated with simple HTML and JavaScript with the standard Google Maps API, with calls to Trigger’s Forge handling geolocation:</p>
<pre>google.maps.Map.prototype.setCurrentLocation = function(fn) {
	forge.geolocation.getCurrentPosition(function(position) {
		map.currentLocation = {
			"lat": position.coords.latitude,
			"lng": position.coords.longitude
		}
		fn();
	}, function() {
		// Some dummy data if geolocation failed
		map.currentLocation = {
			"lat":undefined,
			"lng":undefined
		}
	});
	fn();
}</pre>
<p>Though it can be done with HTML5, geolocation is one feature that’s handled better through a bridge to native – using forge.geolocation. For one thing, this way we don’t push ugly pop-up confirmations to the user on every run.</p>
<p>Forge also handled cross-domain requests within the app – giving us a lot more freedom than a straightforward HTML5 mobile-app:</p>
<pre>forge.request.ajax({
	url: requestUrl,
	dataType: 'json',
	timeout: 5000,
	success: function(data, status) {
		forge.logging.info('[search-nearme] found '+status.length+' results near user');
		$("#loader").hide();
		displaySearchResultsMap(data);
	},
	error: function(status, errorThrown){
		forge.logging.error('[search-nearme] '+status);
		$("#loader").hide();
		$("#error").show();
	}
});</pre>
<h3>First-time App Store approval</h3>
<p>Best of all, the app was accepted into the iOS Store on its first submission – we’re proud to see our framework is strict, neat and tidy enough to pass through Apple’s approval process without any setbacks.</p>
<p>Many App Store rejections happen due to use of undocumented APIs or failing to include interface elements such as launch images. We made sure to implement our native wrapper to follow Apple’s documentation as closely as possible, so our customers don’t need to worry about it. Appnovation were able to <a href="http://current-docs.trigger.io/releasing.html">prepare their app</a>, and deploy it quickly, on deadline, with no hitches – keeping their client happy.</p>
<p>Canadians especially should check out the <a href="http://needanaccountant.org">NeedAnAccountant.org</a> app on <a href="http://itunes.apple.com/ca/app/need-an-accountant/id499894850?ls=1&amp;mt=8">iOS</a> and <a href="https://market.android.com/details?id=forge.generated.needanaccountant71adc1ee3a9011e18cda12313d1adcbe&amp;feature=search_result">Android</a> stores, and find out more about Appnovation’s work at <a href="http://www.appnovation.com">Appnovation.com</a>.</p>
<h3>Next steps for Appnovation</h3>
<p>When we first reached out to Appnovation, we realized that they are always interested in providing innovative solutions to their clients and we had one we figured they’d love to test out.</p>
<blockquote><p>“Anyone who has tried to deploy an HTML5 app in native iOS/Android wrappers will tell you how much of their time went into installing, setting up and correctly configuring each native project and IDE, the cumbersome build &amp; test cycles,” they told us. “Add code-signing certificates, and an unfamiliar XCode interface to the mix, and curve gets steeper for HTML5 developers.”</p></blockquote>
<p>So we’re psyched to hear they’re interested in our approach and will be making sure to look at Trigger for future projects if there is a technology fit. They have a killer roster of enormous, Fortune 500 clients that demand the highest-quality apps for their businesses. We’re proud to see our framework stacking up to such high standards.</p>
<p>Appnovation told us:</p>
<blockquote><p>“The great thing about Trigger is we never had to touch XCode or Eclipse. We learned a few simple shell commands: forge create, forge build, forge run, forge package. Trigger centralizes all configs in a single, intuitive JSON file, and we were off creating &amp; testing native builds in minutes.”</p></blockquote>
<p>Appnovation have been an awesome customer, and we thank them for all their kind words about using our framework.</p>
<p>Thanks, guys. Here’s to the next one.</p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/05/08/using-geolocation-and-gmaps-with-trigger-io-appnovation-gets-first-time-app-store-approval/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Screencast: Trigger.io Catalyst in action</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/05/04/screencast-trigger-io-catalyst-in-action-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=screencast-trigger-io-catalyst-in-action-2</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/05/04/screencast-trigger-io-catalyst-in-action-2/#comments</comments>
		<pubDate>Fri, 04 May 2012 17:45:40 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1873</guid>
		<description><![CDATA[Last week we shared our first screencast of Forge in action, walking you through the build-test workflow – this week, we wanted to show you how you can use Catalyst to easily test and debug your app. Check it out: Normally, debugging for mobile – without the same tools available as you get for web development – is a [...]]]></description>
			<content:encoded><![CDATA[<p>Last week <a href="http://trigger.io/cross-platform-application-development-blog/2012/04/23/screencast-showing-trigger-io-forge-in-action/">we shared our first screencast</a> of Forge in action, walking you through the build-test workflow – this week, we wanted to show you how you can use <a title="Trigger.io Catalyst debugging tool" href="https://trigger.io/catalyst">Catalyst</a> to easily test and debug your app. Check it out:</p>
<p><iframe src="http://player.vimeo.com/video/40978794" width="600" height="400" frameborder="0"></iframe></p>
<p>Normally, debugging for mobile – without the same tools available as you get for web development – is a real pain. Catalyst makes it simpler, giving you a full WebKit-like debugger for mobile.</p>
<p><a href="https://trigger.io/catalyst">Catalyst</a> is our hosted version of the <a href="http://people.apache.org/~pmuellr/weinre/">Weinre</a> project, and features a panel for debugging your Forge API calls, alongside areas to inspect your code and JavaScript log. You can use it with the regular mobile browser to debug mobile web pages as well as with Forge to debug HTML5 code that has been wrapped inside a native WebView.</p>
<p>In the video, I show how to debug the app we built in the <a title="Trigger.io Forge in action" href="http://trigger.io/cross-platform-application-development-blog/2012/04/23/screencast-showing-trigger-io-forge-in-action/">last screencast</a>, and test it live in the iPhone simulator. You can use Catalyst to:</p>
<ul>
<li>Navigate and alter the DOM, including styling with the Elements tab</li>
<li>Query JavaScript objects and test code inside the WebView with the Console tab</li>
<li>Observe network usage and execution order</li>
<li>Log debug messages to the console and track <a href="http://current-docs.trigger.io/">Forge API calls</a> when building hybrid apps  with <a href="https://trigger.io/">Trigger.io Forge</a></li>
</ul>
<p><a href="https://trigger.io/catalyst">Try it out </a>and let us know how you get on – firing all your support questions to <a href="mailto:support@trigger.io">support@trigger.io</a>, where we’ll gladly help you out.</p>
<p>We had a great response from last week’s video, and we’ll hope to do more of these down the line and drill a bit deeper into Forge – let us know what you’d like us to cover, and make sure you <a href="http://twitter.com/triggercorp">follow us on Twitter</a> to catch the next installment!</p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/05/04/screencast-trigger-io-catalyst-in-action-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>April round-up: Doubled usage (again!), Trigger Toolkit and v1.3 released</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/05/02/april-roundup-doubled-usage-again-trigger-toolkit-and-v1-3-released/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=april-roundup-doubled-usage-again-trigger-toolkit-and-v1-3-released</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/05/02/april-roundup-doubled-usage-again-trigger-toolkit-and-v1-3-released/#comments</comments>
		<pubDate>Wed, 02 May 2012 19:31:50 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1719</guid>
		<description><![CDATA[v1.3 Platform Upgrade We&#8217;ve launched the 1.3 version of our platform including a new visual toolkit to make it even simpler to use our cloud build service. Amongst the many changes and improvements over the past month that are rolled into this release, we added: Ability to run custom hooks: This enables you to add a [...]]]></description>
			<content:encoded><![CDATA[<h2>v1.3 Platform Upgrade</h2>
<p>We&#8217;ve launched the <a title="Trigger.io v1.3 Release Notes" href="http://docs.trigger.io/en/v1.3/release-notes.html" target="_blank">1.3 version of our platform</a> including a new visual toolkit to make it even simpler to use our cloud build service.</p>
<p>Amongst the many changes and improvements over the past month that are rolled into this release, we added:</p>
<ul>
<li><a title="Hooks" href="http://docs.trigger.io/en/v1.3/tools/hooks.html#tools-hooks" target="_blank">Ability to run custom hooks</a>: This enables you to add a pre-build step such as CoffeeScript compilation</li>
<li><a href="http://docs.trigger.io/en/v1.3/modules/file.html#modules-file" target="_blank">forge.file.getLocal API call</a>: to access files bundled with the app</li>
<li><a href="http://docs.trigger.io/en/v1.3/modules/file.html#modules-file" target="_blank">forge.file.cacheURL</a>: to download remote files and cache them locally. <a href="http://docs.trigger.io/en/v1.3/features/cache.html" target="_blank">Here&#8217;s an example of how to use it</a>.</li>
<li>True native <a href="http://docs.trigger.io/en/v1.3/modules/tabbar.html">tabbar</a> and <a href="http://docs.trigger.io/en/v1.3/modules/topbar.html">topbar</a>: easy headers and footers for your app</li>
<li>Deploy iOS apps <a href="http://docs.trigger.io/en/v1.3/tools/local-config.html?highlight=device#ios">straight to the device with</a>:<code>forge run ios --ios.device device</code></li>
</ul>
<p>To upgrade, the format of your <code>config.json</code> needs to be updated, but we&#8217;ve made that easy &#8211; just run:</p>
<pre>forge migrate</pre>
<h2>Trigger Toolkit</h2>
<p>Today we’re also releasing a new way to build and manage Forge apps, called the Trigger Toolkit.</p>
<p><img src="https://d2q0qd5iz04n9u.cloudfront.net/_ssl/proxy.php/http/gallery.mailchimp.com/be3630d26a7b6a1b797914991/images/Toolkit_Debug.png" alt="" width="800" align="none" /></p>
<p>This makes it even easier to use our cloud build service to create apps for iOS, Android and the web:</p>
<ul>
<li>Visual interface to create, build and run apps</li>
<li>Console to view status logged messages</li>
<li>Simple installer for OSX and Windows</li>
<li>Built-in documentation to speed up your development</li>
<li>Ability to get in touch with our support team easily from within our tools</li>
</ul>
<p>Oh, and the command-line tools come bundled with it, so you can still use them for all your automation needs.</p>
<p>We&#8217;d love your feedback, you can <a href="https://trigger.io/forge/toolkit">download it now</a> from our website.</p>
<p>Questions? Let us know on our <a href="http://stackoverflow.com/questions/tagged/trigger.io" target="_blank">StackOverflow tag</a> and we&#8217;ll respond straightaway.</p>
<h2>Doubled again &#8211; 20,000 actions in April!</h2>
<p>Finally, thanks so much to you for your continued support. We doubled usage again in April with more than 20,000 build, test and package actions:</p>
<p><a href="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/Forge-Actions-by-Month.png"><img class="aligncenter size-full wp-image-1852" title="Forge Actions by Month" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/05/Forge-Actions-by-Month.png" alt="" width="643" height="512" /></a></p>
<p>May is shaping up to be a fantastic month as well with many new features and fixes planned. Stay tuned on Hacker News and <a href="https://twitter.com/#!/triggercorp">Twitter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/05/02/april-roundup-doubled-usage-again-trigger-toolkit-and-v1-3-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to build hybrid mobile apps combining native UI components with HTML5</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/04/30/how-to-build-hybrid-mobile-apps-combining-native-ui-components-with-html5/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-build-hybrid-mobile-apps-combining-native-ui-components-with-html5</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/04/30/how-to-build-hybrid-mobile-apps-combining-native-ui-components-with-html5/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 17:50:30 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1749</guid>
		<description><![CDATA[Last week we showed a screencast of Trigger.io Forge in action, this week we&#8217;ll explain how you can use a native top bar and native tab bar along with your HTML / CSS and JavaScript in a hybrid app created with Trigger.io. We&#8217;ll add more native UI components in the future, but here&#8217;s how you can [...]]]></description>
			<content:encoded><![CDATA[<p>Last week we showed a <a title="Trigger.io Forge in Action" href="http://trigger.io/cross-platform-application-development-blog/2012/04/23/screencast-showing-trigger-io-forge-in-action/">screencast of Trigger.io Forge in action</a>, this week we&#8217;ll explain how you can use a native top bar and native tab bar along with your HTML / CSS and JavaScript in a hybrid app created with Trigger.io.</p>
<p>We&#8217;ll add more native UI components in the future, but here&#8217;s how you can get started creating a beautiful, responsive mobile apps for iOS and Android using just web technologies.</p>
<p><a href="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Recipe-App-in-iPhone.png"><img class="alignleft size-full wp-image-1756" title="Recipe App in iPhone" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Recipe-App-in-iPhone.png" alt="" width="224" height="437" /></a><a href="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Recipe-App-on-Android.png"><img class="alignright size-full wp-image-1757" title="Recipe App on Android" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Recipe-App-on-Android.png" alt="" width="308" height="437" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>These are screenshots of a simple recipe app that we created using the Trigger.io Forge native UI components, and we&#8217;ll explain how we built it. Along the way we&#8217;ll show you how to:</p>
<ul>
<li>Configure Trigger.io Forge to add native top bar and tab bar elements to your app</li>
<li>Style the native elements</li>
<li>Add listeners to and control the native elements from JavaScript</li>
</ul>
<p>Please feel free to base your own projects on this – it’s a great springboard for a new project! The code is hosted on github here: <a href="https://github.com/trigger-corp/forge-template-list-and-detail" target="_blank">https://github.com/trigger-corp/forge-template-list-and-detail</a></p>
<h2>Create your app and add a top bar</h2>
<p>You&#8217;ll need to use the Trigger.io Forge framework to be able to get native UI components using only web technologies. <a title="Trigger.io Forge signup" href="https://trigger.io/forge" target="_blank">Get started by signing-up</a>. There&#8217;s <a title="Documentation" href="http://current-docs.trigger.io" target="_blank">complete documentation on how to get setup</a> and once you&#8217;ve done that just run:</p>
<pre>forge create</pre>
<p>You&#8217;ll be prompted for the app name and once the command completes, you&#8217;ll be setup with the code for a &#8216;Hello World&#8217; app in the src subdirectory. Let&#8217;s start by adding a native top bar and testing that in the Android emulator.</p>
<p>Replace your existing src/config.json with this:</p>
<pre>{
    "author": "amir@trigger.io",
    "config_version": "2",
    "description": "View ingredients for your favorite recipes",
    "modules": {
        "is": true,
        "logging": {
            "level": "INFO"
        },
        "prefs": true,
        "request": {
            "permissions": []
        },
        "tools": true,
        <strong>"topbar": true</strong>
    },
    "name": "Recipe list",
    "platform_version": "v1.3",
    "version": "0.1"
}</pre>
<p>Enabling the topbar is as simple as setting: &#8220;topbar&#8221;: true in the modules configuration. Let&#8217;s also clean-up index.html until we&#8217;re ready to customize it:</p>
<pre>&lt;!DOCTYPE html&gt;
&lt;html&gt;
	&lt;head&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div class="content"&gt;
			Hello world!
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>You can then run and test the app so far using the following forge commands:</p>
<pre>forge build

forge run android --android.sdk ~/Desktop/android-sdk-macosx</pre>
<p><a href="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Native-topbar-on-Android.png"><img class="aligncenter size-full wp-image-1782" title="Native topbar on Android" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Native-topbar-on-Android.png" alt="" width="372" height="531" /></a></p>
<p>Any problems at this point? Check out our <a title="FAQ" href="http://docs.trigger.io/en/v1.3/faq.html" target="_blank">FAQ</a>, <a title="StackOverflow" href="http://stackoverflow.com/questions/tagged/trigger.io" target="_blank">ask the community on StackOverflow</a> or contact <a title="Support" href="mailto:support@trigger.io">support@trigger.io</a>.</p>
<h2>Configuring a tab bar</h2>
<p>Great! It turns out that adding the tab bar at the bottom is just as easy &#8211; you simply enable the module by adding &#8220;tabbar&#8221;: true to the src/config.json:</p>
<pre>{
    "author": "amir@trigger.io",
    "config_version": "2",
    "description": "View ingredients for your favorite recipes",
    "modules": {
        "is": true,
        "logging": {
            "level": "INFO"
        },
        "prefs": true,
        "request": {
            "permissions": []
        },
        "tools": true,
        "topbar": true,
        "tabbar": true
        },
    "name": "Recipe list",
    "platform_version": "v1.3",
    "version": "0.1"
}</pre>
<p>But before that will look good and behave well we need to add some buttons and listeners so we can execute JavaScript to handle the page transitions when you click on each tab. To do that, let&#8217;s add a JavaScript file called src/js/main.js:</p>
<pre>// A helper function so that when we change tab the web view scrolls to the top of the new page
var scrollTop = function () {
	setTimeout(function () {
		document.body.scrollTop = 0;
	}, 0);
}

// This is the method we are going to call when a tab button is pressed
var updateRecipes = function (search) {
	scrollTop();
	// For now just pop up a message with the tab which was pressed
	alert(search);
}

// Set a better title for the topbar
forge.topbar.setTitle("Recipe shopping list");

// Add our 3 tab buttons to the tabbar and add press listeners
var starterButton = forge.tabbar.addButton({
	text: "Starters",
	icon: "img/tomato.png",
	index: 0
}, function (button) {
	button.onPressed.addListener(function () {
		updateRecipes("starter");
	});
	// This is the default button, activate it immediately
	button.setActive();
	updateRecipes("starter");
});

var mainButton = forge.tabbar.addButton({
	text: "Mains",
	icon: "img/pizza.png",
	index: 1
}, function (button) {
	button.onPressed.addListener(function () {
		updateRecipes("main");
	});
});
var dessertButton = forge.tabbar.addButton({
	text: "Desserts",
	icon: "img/strawberry.png",
	index: 2
}, function (button) {
	button.onPressed.addListener(function () {
		updateRecipes("dessert");
	});
});</pre>
<p>Here we&#8217;ve using the forge.topbbar.setTitle API call to alter the title at the top, and then used forge.tabbar.addButton to configure the tab bar buttons including adding a listener to execute JavaScript when they are pressed. We reference this file from src/index.html:</p>
<pre>&lt;!DOCTYPE html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;script src="js/main.js"&gt;&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div class="content"&gt;
			Hello world!
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<pre></pre>
<p>You can find the images referenced in src/js/main.js in the <a href="https://github.com/trigger-corp/forge-template-list-and-detail" target="_blank">example code in Github</a>. You&#8217;ll also need to copy those across to your src/img directory.</p>
<p>Now if we build and test (this time on iOS), we see this:</p>
<p><a href="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Native-tabbar.png"><img class="aligncenter size-full wp-image-1794" title="Native tabbar" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Native-tabbar.png" alt="" width="371" height="719" /></a></p>
<h2>Creating list views and controlling navigation</h2>
<p>Ok, now we have the native UI elements in place, we need to create our list view and connect up the tabs so they trigger transitions.</p>
<p>We&#8217;ll use the lightweight zepto.js library to help us handle the DOM manipulation. We&#8217;ve blogged before on <a title="How to build fast HTML5 mobile apps using backbone.js, zepto.js and trigger.io" href="http://trigger.io/cross-platform-application-development-blog/2012/03/02/how-to-build-fast-html5-mobile-apps-using-backbone-js-zepto-js-and-trigger-io/">how to create fast HTML5 mobile apps using zepto.js and backbone.js</a>. We&#8217;ll create the recipe list using HTML / CSS / JavaScript in the main part of the view since it&#8217;s simple to create good-looking lists this way.</p>
<p>First, let&#8217;s embed the recipe data and the zepto.js library. You can do that by <a href="https://github.com/trigger-corp/forge-template-list-and-detail/tree/master/js" target="_blank">downloading data.js and zepto.js from the example in Github</a> and putting them in your src/js directory.</p>
<p>Then we update the updateRecipe function in src/js/main.js &#8211; this is called when a tab bar button is pressed:</p>
<pre>var updateRecipes = function (search) {
	scrollTop();
	$('.content').html('&lt;ul class="list"&gt;&lt;/ul&gt;');
	$.each(data[search], function (i, recipe) {
		var el = $('&lt;li&gt;&lt;img src="'+recipe.thumb+'"&gt;'+recipe.title+'&lt;/li&gt;');
		el.on('click', function () {
			scrollTop();
			$('.content').html('&lt;div class="recipe"&gt;&lt;h3&gt;'+recipe.title+'&lt;/h3&gt;&lt;img src="'+recipe.img+'"&gt;&lt;ul class="ingredients"&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="#" onclick="forge.tabs.open(\''+recipe.source+'\')"&gt;View full recipe&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;');
			$.each(recipe.ingredients, function (i, ingredient) {
				$('.ingredients').append('&lt;li&gt;'+ingredient+'&lt;/li&gt;');
			});
			forge.tabbar.setInactive();
		});
		$('.list').append(el);
	});
}</pre>
<p>Now to complete the app, all we need to do is add some simple styling to the list and reference the JavaScript files in src/index.html:</p>
<pre>&lt;!DOCTYPE html&gt;
&lt;html&gt;
	&lt;head&gt;
		&lt;style&gt;
			body, html, li, ul {
				padding: 0;
				margin: 0;
			}
			body {
				font-size: 1.2em;
			}
			.recipe {
				text-align: center;
			}
			.recipe img {
				max-width: 80%;
			}
			.recipe li {
				display: block;
				font-size: 0.9em;
				padding: 2px;
			}
			.list {
				margin: 0;
				padding: 0;
			}
			.list li {
				display: block;
				border-bottom: 1px solid #aaa;
				padding: 0;
				margin: 0;
				width: 100%;
				overflow: hidden;
				white-space: nowrap;
				text-overflow: ellipsis;
			}
			.list li img {
				height: 50px;
				width: 50px;
				padding: 2px 7px 2px 2px;
				vertical-align: middle
			}
		&lt;/style&gt;
		&lt;script src="js/zepto.js"&gt;&lt;/script&gt;
		&lt;script src="js/data.js"&gt;&lt;/script&gt;
		&lt;script src="js/main.js"&gt;&lt;/script&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;div class="content"&gt;
		&lt;/div&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>That&#8217;s it</h2>
<p>You should now be able to build and test the app to look like the screenshots at the top of this post. As an optional extra, you can also explore different styling for the topbar and tabbar by trying out the following API calls:</p>
<ul>
<li><a href="http://docs.trigger.io/en/v1.3/modules/topbar.html#settitleimage">forge.topbar.setTitleImage</a></li>
<li><a href="http://docs.trigger.io/en/v1.3/modules/topbar.html#settint">forge.topbar.setTint</a></li>
<li><a href="http://docs.trigger.io/en/v1.3/modules/tabbar.html#settint">forge.tabbar.setTint</a></li>
<li><a href="http://docs.trigger.io/en/v1.3/modules/tabbar.html#setactivetint">forge.tabbar.setActiveTint</a></li>
</ul>
<p>So now you can create rich hybrid apps, using real native UI components using Trigger.io! Let us know your feedback and how you get on.</p>
<p>Any problems at any point? Check out our <a title="FAQ" href="http://docs.trigger.io/en/v1.3/faq.html" target="_blank">FAQ</a>, <a title="StackOverflow" href="http://stackoverflow.com/questions/tagged/trigger.io" target="_blank">ask the community on StackOverflow</a> or contact <a title="Support" href="mailto:support@trigger.io">support@trigger.io</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/04/30/how-to-build-hybrid-mobile-apps-combining-native-ui-components-with-html5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Screencast: Trigger.io Forge in action</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/04/23/screencast-showing-trigger-io-forge-in-action/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=screencast-showing-trigger-io-forge-in-action</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/04/23/screencast-showing-trigger-io-forge-in-action/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 22:27:11 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1676</guid>
		<description><![CDATA[We’ve made it simple and super fast to build fully native apps, and we wanted to show that in action with this short video screencast. Check it out: Code In 5 minutes, I walk you through our demo photo-sharing app (the full code of which can be found on Github). The app is simple HTML, [...]]]></description>
			<content:encoded><![CDATA[<p>We’ve made it simple and <a href="http://trigger.io/cross-platform-application-development-blog/2012/02/24/why-trigger-io-doesnt-use-phonegap-5x-faster-native-bridge/">super fast</a> to build fully native apps, and we wanted to show that in action with this short video screencast. Check it out:</p>
<p><iframe src="http://player.vimeo.com/video/40698019" width="600" height="400" frameborder="0"></iframe></p>
<h2>Code</h2>
<p>In 5 minutes, I walk you through our demo photo-sharing app (the full code of which can be found <a href="https://github.com/trigger-corp/photo-log" target="_blank">on Github</a>). The app is simple HTML, CSS and JavaScript and put together in an everyday text editor — all very familiar, even for a new web developer.</p>
<p>Just a few extra Forge API methods like <a href="http://docs.trigger.io/en/v1.2/api/file.html#getimage" target="_blank">forge.file.getImage</a> that we use in the app to access native device features (in this case, the native camera) across platforms.</p>
<h2>Build</h2>
<p>The fun part is at the command line: building your code into native mobile apps using our cloud build service. Entering
<pre>> forge build</pre>
<p> will return the native builds (for each platform you’re developing for) to your local machine in seconds. If you&#8217;re keen to know how the magic happens behind the curtain, you can read up on it <a href="http://trigger.io/cross-platform-application-development-blog/2012/01/26/how-forge-works-and-why-were-proud-of-it/">here</a>.</p>
<h2>Test</h2>
<p>You can then run your builds right away using
<pre> forge run</pre>
<p>In the video, we run the app in the iPhone simulator and show you how the native features integrate into the app, and then how the same code can be deployed to the web, and you can use the web app as a way <a href="http://trigger.io/cross-platform-application-development-blog/2012/03/15/what-multi-platform-means-for-viral-loops/">to drive more traffic</a> to app-store downloads.</p>
<p>That’s it — no messing about with bloated IDEs or compiling, not a single line of native code, and a super fast build-and-test cycle.</p>
<h2>Try it yourself</h2>
<p>Let us know your thoughts on the video, we hope it helps — and if you like what you see, <a href="http://trigger.io/forge">why not try it yourself</a>. The initial setup gives you a bare-bones ‘hello world’ app, which you can build and run right away. Head to the <a href="http://current-docs.trigger.io/">docs</a> for the nitty-gritty and to read up on more Forge API methods and new native UI components — there’s a detailed tutorial there for getting started, and we’ll be happy to help you out on our support desk if you have any trouble. We’re available around the clock at <a href="mailto:support@trigger.io">support@trigger.io</a>.</p>
<p>We’ll be posting a followup screencast in the next couple of weeks on how to use <a href="https://trigger.io/catalyst/">Catalyst</a> to debug your apps, so subscribe to our blog or <a href="http://twitter.com/triggercorp">follow us on Twitter</a> to make sure you’re kept in the loop.</p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/04/23/screencast-showing-trigger-io-forge-in-action/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Future of Mobile: a case of HTML5 or iOS&#8230; really?</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/04/14/future-of-mobile-a-case-of-html5-or-ios-really/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=future-of-mobile-a-case-of-html5-or-ios-really</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/04/14/future-of-mobile-a-case-of-html5-or-ios-really/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 21:05:26 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1636</guid>
		<description><![CDATA[Business Insider recently published a presentation on the future of mobile. We&#8217;ve blogged about how developers are underestimating the shift to mobile so much of this presentation echoes our views with stats to back it: But when it comes to the eponymous future of mobile slide, they lists four possibilities: 1) Android gets its act together, OR 2) Microsoft completes [...]]]></description>
			<content:encoded><![CDATA[<p>Business Insider recently published a <a title="Future of Mobile according to Business Insider" href="http://www.businessinsider.com/the-future-of-mobile-deck-2012-3#-1" target="_blank">presentation on the future of mobile</a>.</p>
<p>We&#8217;ve blogged about how developers are <a title="Mobile shift: you've probably underestimated just how big this is" href="http://trigger.io/cross-platform-application-development-blog/2012/01/24/youve-probably-underestimated-just-how-big-this-is/">underestimating the shift to mobile</a> so much of this presentation echoes our views with stats to back it:</p>
<p><img class="aligncenter" title="Connected Devices Growth" src="http://static5.businessinsider.com/image/4f6b732f69bedd4a59000000-650/connected-devices-growth.jpg" alt="" width="650" height="428" /></p>
<p>But when it comes to the eponymous future of mobile slide, <a title="Future of Mobile" href="http://www.businessinsider.com/the-future-of-mobile-deck-2012-3#-22">they lists four possibilities</a>:</p>
<p>1) Android gets its act together, OR</p>
<p>2) Microsoft completes Hail Mary pass, OR</p>
<p>3) HTML5 nukes native apps, OR</p>
<p>4) Apple will take over the world</p>
<p>What?</p>
<p>It&#8217;s not credible that either HTML5 or Apple will rule everything, here&#8217;s why&#8230;</p>
<h3>Android&#8217;s share is growing</h3>
<p>This from an earlier slide in the same presentation:</p>
<p><a href="http://www.businessinsider.com/the-future-of-mobile-deck-2012-3#-16"><img class="aligncenter size-full wp-image-1651" title="Mobile OS Market Share" src="http://trigger.io/cross-platform-application-development-blog/wp-content/uploads/2012/04/Untitled.png" alt="" width="579" height="353" /></a></p>
<p>This growth is <em>despite</em> Android&#8217;s so-called fragmentation problems. Android’s share is growing because the carriers have flexibility in how they distribute it and end users could not care less about ‘fragmentation’.  That is a problem for developers, sure, but it is not affecting adoption by end-users.</p>
<p>iOS will continue to dominate the high-end consumer market, but Android’s growth means we’re not on a path to monopoly of the client-side software stack like Microsoft had with PCs. So Apple will make a lot of money, but how on earth are they going to “take over the world”?</p>
<p>It’s also way, way too early to rule out Microsoft – they should at least be able to get some traction in the enterprise just from taking advantage of their Sharepoint install base.</p>
<h3>It&#8217;s not possible to create Instagram with HTML5</h3>
<p>Instagram is used as an example in the deck itself. Thing is, Instagram kind of relies on you to be able to take photos using the camera on your mobile device, and you can’t do that in HTML5!</p>
<p>The fact is that on mobile devices consumers are <a title="Mobile App Usage Further Dominates Web" href="http://blog.flurry.com/bid/80241/Mobile-App-Usage-Further-Dominates-Web-Spurred-by-Facebook">using apps more and more than the mobile web</a>. So again the trends are against the thesis that HTML5 will nuke native… at least in the short-term.</p>
<p>But what about the next 5-10 years? Won’t all these native features be incorporated into HTML6? Perhaps current features like camera access will be, but I bet that by that time there’ll be a ton of new device types and underlying features that aren’t. The standardization process is slow, and you’d have to believe that innovation in mobile devices is slowing down to think that standards are catching up.</p>
<h3>Conclusion – competition is driving innovation and it’s a hybrid world</h3>
<p>Google, Microsoft and Apple are competing against each other to own client-side software stack by innovating fast. This competition and innovation is absolutely fantastic for end-users but <em>of course</em> the web and mobile web are going to be hugely important, and will act as a check and balance against the closed stacks.</p>
<p>This hybrid world does of course pose a problem for developers, but you’ll be happy to hear that Trigger.io has you covered whether you’re building for one mobile platform, or many. If you need to build power native mobile apps, with no compromises, using web technologies, then please <a title="Mobile Engine for Web Devs" href="https://trigger.io/forge">signup for our mobile engine for web devs</a>.</p>
<p>We’d love to hear your views on the future of mobile, let us know in the comments, on Hacker News, or email anytime at <a title="support@trigger.io" href="mailto:support@trigger.io">support@trigger.io</a></p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/04/14/future-of-mobile-a-case-of-html5-or-ios-really/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Pricing update &amp; Events roundup</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/04/03/pricing-update-events-roundup/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pricing-update-events-roundup</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/04/03/pricing-update-events-roundup/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 18:19:48 +0000</pubDate>
		<dc:creator>sahilio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1623</guid>
		<description><![CDATA[Pricing Update iOS, Android &#38; Web go free: we&#8217;ve updated our pricing to better support hobbyist developers while also offering businesses the features and support they need: With our Get Started plan, independent developers can now build for iOS, Android &#38; Web free of charge! In addition, you&#8217;ll be able to deploy apps with your [...]]]></description>
			<content:encoded><![CDATA[<h2 dir="ltr">Pricing Update</h2>
<p><strong><strong>iOS, Android &amp; Web go free: we&#8217;ve updated <a href="https://trigger.io/pricing/">our pricing</a> to better support hobbyist developers while also offering businesses the features and support they need:<br />
</strong></strong></p>
<ul>
<li>With our <strong>Get Started</strong> plan, independent developers can now build for iOS, Android &amp; Web <strong>free of charge</strong>! In addition, you&#8217;ll be able to deploy apps with your own branded splash screens and list them as both paid or free apps in the appstores, at no cost.</li>
</ul>
<ul>
<li>Our <strong>Go Pro</strong> plan is targeted at businesses who want more support and are interested in deploying to Windows Phone 7.</li>
</ul>
<ul>
<li>Finally, we have our <strong>Go Enterprise</strong> plan to help enterprise app developers leverage powerful CMS &amp; security integrations as well as personalized support to produce enterprise grade apps that can be deployed within an organization as well as directly to consumers.</li>
</ul>
<p>Contact us at <a href="mailto:support@trigger.io">support@trigger.io</a> if you have any questions at all.</p>
<h2>SF Beta Platform &amp; API Edition</h2>
<p><strong><a href="http://sfbeta.com/">SF Beta</a> brought together hundreds of developers interested in building apps: Last week we attended SF Beta as one of the 8 demo companies for their Platform &amp; API Edition.</strong></p>
<p>We were presenting next to awesome companies like Iron.io and Songza. It was incredible to see the number of developers who swarmed around our code-filled demo of our cross-platform app development framework.</p>
<p><em>“This is incredible and looks so much easier to use than other cross-platform frameworks we’ve tried in the past!” &#8211; That comment threw a smile on all of our faces!</em></p>
<p><em></em>Thanks for having us Christian @sfbeta!</p>
<p><img src="https://lh4.googleusercontent.com/rPQU4t6bqbaH0RuL00u6pGhl7wGag5UwesZpyOqMj72BmjsOrZLqQqQMydw5qJow2m052TKitLKNnd5PTWL7JMj1TLiy-YjfIc4mBpIztpay3FzDgaA" alt="" width="612px;" height="457px;" /></p>
<h2></h2>
<h2>SF HTML5 Meetup hosted at Trigger.io &amp; CFA HQ</h2>
<p style="text-align: center;"><img class="aligncenter" src="https://lh5.googleusercontent.com/MsCOXJfWAO7gbAPe1TtfUa3bnwthSH5z38rDhGhfV75HNPKMMIeJyLC_JgmuQV9U1oHt0-WU0OnJ1YhMU90SoWQePTkpL-RoKxDfp9gNr1Bkj91YSK0" alt="" width="283px;" height="212px;" /></p>
<p style="text-align: left;"><strong>Well over 300 developers stopped by our first hosted event last week to learn about what’s new with HTML5 from guest speaker <a href="http://smus.com/">Boris Smus</a> of Google: Last week we decided to host our very first event &#8211; SF HTML5 Meetup put on by the great folks at <a href="http://kaazing.com/">Kaazing</a>.</strong><img class="aligncenter" src="https://lh6.googleusercontent.com/9y6Z7xGMSi_JhGP61Q1mnwD4NVndIBsVmO-fPT76XpeJEZC-DqqLd2gefXgyHy5QAoU8XRiSbuWB80t7GAU5D-wc1qd_Keq9_TAismXrHhd3XEbe1HI" alt="" width="354px;" height="264px;" /></p>
<p style="text-align: left;">The turnout was amazing, beer flowing, code shown. Code For America, our roommates in the Storek building in SoMa, were kind enough to allow us to use their amazing space to put on an incredible first event. We plan to be involved with many of these meetups and hopefully continue to host a few. Check out the pictures below and <a href="http://www.sfhtml5.org/">visit the meetup page</a> to make sure you attend the next one!</p>
<p style="text-align: center;"><img class="aligncenter" src="https://lh3.googleusercontent.com/a4mLaWlBw9JAK804z8ovTgMzmiq60BL-j8PEgZMkz8FZkH5MfhVkJA0BzweDm6kFNCHGl0u8kkOguUCwUFYOXQOGe5yuzXKBZJJG9QLwMQcrAkqIZHI" alt="" width="159px;" height="213px;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/04/03/pricing-update-events-roundup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10K app build actions in March, added native UI components</title>
		<link>http://trigger.io/cross-platform-application-development-blog/2012/03/29/10k-app-build-actions-in-march-added-native-ui-components/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=10k-app-build-actions-in-march-added-native-ui-components</link>
		<comments>http://trigger.io/cross-platform-application-development-blog/2012/03/29/10k-app-build-actions-in-march-added-native-ui-components/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 00:53:18 +0000</pubDate>
		<dc:creator>Amir Nathoo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trigger.io/cross-platform-application-development-blog/?p=1575</guid>
		<description><![CDATA[When we launched Trigger.io just a few short months ago our goal was to provide web developers with an easy way to build native iOS, Android and web apps from a single HTML5 code base. No Objective-C, Java required. No need to use a particular IDE or get setup for local compiles. We were challenged [...]]]></description>
			<content:encoded><![CDATA[<p>When we launched <a title="Trigger.io" href="https://trigger.io">Trigger.io</a> just a few short months ago our goal was to provide web developers with an easy way to build native iOS, Android and web apps from a single HTML5 code base. No Objective-C, Java required. No need to use a particular IDE or get setup for local compiles.</p>
<p><img class="aligncenter" title="Forge commands" src="https://trigger.io/forge-static/img/trigger/demo-command-line-complete.png" alt="" width="370" height="190" /></p>
<p>We were challenged to not only provide a great service, but a great service that stood out in a competitive space. Our goal was to do that by providing both an extremely simple development process, and genuinely native UI components. The response received in the first few months has been overwhelming:</p>
<blockquote><p>“As a web developer wanting to create a quality mobile app this is exactly what I was looking for.”<br />
- Jake Gold &#8211; Co-founder,<a href="http://get.com/"> get.com</a></p></blockquote>
<blockquote><p>“Holy crap.<a href="https://twitter.com/#!/search/realtime/triggercorp"> @triggercorp</a>&#8216;s Forge platform is awesome. Now if only I could find more time&#8230; screw it, I&#8217;m done sleeping.”<br />
- Cameron Webb</p></blockquote>
<blockquote><p>“Your product is amazing, have never developed an android application more easily (don&#8217;t have to touch Java or go through annoying setup!). You guys have a great product here”<br />
- Andy Joslin</p></blockquote>
<p>&nbsp;</p>
<p>Nothing is more validating than when real customers use your product and are thrilled by their experience. While we appreciate the kind words from our users, we’re equally excited by their actions. Since launching the platform in January 2012 we’ve experienced triple figure growth every single month – and it isn’t slowing down!<br />
<img src="https://lh6.googleusercontent.com/VHaSDWQCr-APbD35mAPBoTI3Gq5eLjpU9R8dNzpihmDJwH3_IyVXSUB3pmtMVQvTO9_azVli8fWBJEazqGU4_UKXIkSicb0DtLe9CjeFE-nd4zoOzrs" alt="" width="643px;" height="514px;" /></p>
<p>In March alone we’ve had over 10,000 build actions performed through our command-line tools and cloud build service.</p>
<p>Earlier this month we launched <a href="http://trigger.io/cross-platform-application-development-blog/2012/03/12/introducing-%E2%80%98build-to-web%E2%80%99-simple-deployment-of-your-mobile-codebase-as-a-web-app/">Build to Web</a> so you can create websites, mobile websites and native wrapped iOS and Android applications from a single HTML5 code base. Last week, we released the <a title="Native Topbar" href="http://docs.trigger.io/en/v1.2/api/topbar.html">first of our native UI components</a>.</p>
<p>This makes Trigger.io’s Forge framework the only mobile framework available which combines a dead simple development process with real native UI components, and the ability to support all of web, Android and iOS from the same codebase.<br />
<strong id="internal-source-marker_0.18571492517367005"><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://trigger.io/cross-platform-application-development-blog/2012/03/29/10k-app-build-actions-in-march-added-native-ui-components/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

