際際滷

際際滷Share a Scribd company logo
The Contextual Experience
                    of the Mobile Web
                                    Jeff Carouth
                              ZendCon, October 19, 2011




Wednesday, October 19, 2011
Howdy!


                        (Yeah, Im from Texas.)
                        PHP Developer since 2003
                        Web and mobile developer at Texas
                        A&M University



Wednesday, October 19, 2011
This is not a presentation
                      about development



Wednesday, October 19, 2011
nor is it about design




Wednesday, October 19, 2011
its about the collision of
                the two on the mobile web.



Wednesday, October 19, 2011
The Big Three

                    The context of the mobile web is the
                    speci鍖c environment and expectations
                      a user or visitor of your website or
                       application brings when he or she
                     accesses it while mobile or using a
                                mobile device.


Wednesday, October 19, 2011
Environment, expectations, and intent

                              Mobile and mobility

                              Devices and capabilities




Wednesday, October 19, 2011
In my opinion, design plays
                     a major role in mobile
                            success.



Wednesday, October 19, 2011
Wednesday, October 19, 2011
Wednesday, October 19, 2011
The question then becomes
                how can you accommodate
                  both a 27 iMac and an
                          iPhone?


Wednesday, October 19, 2011
Or, more accurately, how
                       can you accommodate
                        browsers of differing
                              widths?


Wednesday, October 19, 2011
Obvious Answer: Layouts




Wednesday, October 19, 2011
Optionredirect




Wednesday, October 19, 2011
User Agent snif鍖ng


                              If UA indicates mobile device
                               redirect to separate mobile site, or
                                provide a link to a separate mobile
                               site



Wednesday, October 19, 2011
function mobile_device_detect(/* bunch of params */) {
      $mobile_browser   = false;
      $user_agent       = $_SERVER['HTTP_USER_AGENT'];
      $accept           = $_SERVER['HTTP_ACCEPT'];

             switch(true){
                 case (preg_match('/ipad/i',$user_agent));
                     $mobile_browser = $ipad;
                     $status = 'Apple iPad';
                     if(substr($ipad,0,4)=='http'){
                         $mobileredirect = $ipad;
                     }
                 break;
             }

             if($mobile_browser==true){
                 header('Location: '.$redirect);
                 exit;
             }
  }                           http://detectmobilebrowsers.mobi
Wednesday, October 19, 2011
Or Show A Link




Wednesday, October 19, 2011
Problems with this method


                              Perhaps your user wants your full site.
                          Theyll likely miss any links
                               and alert boxes are terrible.




Wednesday, October 19, 2011
Optionlayout switching




Wednesday, October 19, 2011
function is_mobile() {
      $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
      if (in_array(
          substr($user_agent, 0, 4),
          array('ipod','cell',...))) {
        return true;
      }
      if (strpos($_SERVER['HTTP_ACCEPT'], 'wap') != false) {
        return true;
      }
      if (preg_match(
          "/(android|blackberry|ipod|palm|...))/i",
          $user_agent)) {
        return true;
      }
      return false;
    }



Wednesday, October 19, 2011
if (is_mobile()) {
        require_once "mobile-layout.php";
    } else {
        require_once "desktop-layout.php";
    }




Wednesday, October 19, 2011
Thats very basic, and
                               largely unreliable.



Wednesday, October 19, 2011
We can use a device
                        database to improve the
                         accuracy of matches.



Wednesday, October 19, 2011
Choices


                        WURFL (Wireless Universal Resource
                        FiLe)
                              Device Atlas




Wednesday, October 19, 2011
class Bootstrap
        extends Zend_Application_Bootstrap_Abstract
    {
        protected function _mobileLayoutSwitch() {
            $this->bootstrap('useragent');
            $this->bootstrap('layout');
            $uaType = $this->getResource('useragent')
                            ->getDevice()
                            ->getType();
            if ($uaType === 'mobile') {
                $this->getResource('layout')
                    ->setLayout('mobile');
            }
        }
    }




Wednesday, October 19, 2011
protected function _mobileLayoutSwitch() {
        $this->bootstrap('useragent');
        $this->bootstrap('layout');
        $resolution = $this->getResource('useragent')
                        ->getDevice()
                        ->getFeature('resolution_width');
        if ($resolution < 320) {
            $layout = 'poor';
        } elseif ($resoution < 480) {
            $layout = 'medium';
        } else {
            $layout = 'desktop';
        }
        $this->getResource('layout')->setLayout($layout);
    }




Wednesday, October 19, 2011
It works


                              But we can do better.
                         We can apply the mantra: branch on
                        features not user agents to our
                        mobile layouts.



Wednesday, October 19, 2011
The problem with user
                                agents is: they lie.



Wednesday, October 19, 2011
Optionresponsive layout




Wednesday, October 19, 2011
So, how many of you
                        remember liquid or 鍖uid
                                layouts?



Wednesday, October 19, 2011
Responsive breakpoints




Wednesday, October 19, 2011
Techniques

                 All in one CSS 鍖le
                 Base CSS 鍖le and one CSS 鍖le for each
                class of device
                       Major breakpoints in <link> media
                      attribute
                        Minor breakpoints in device stylesheet


Wednesday, October 19, 2011
<link rel=stylesheet type=text/css
        href=styles/base.css media="screen,handheld" />

    <link rel=stylesheet type=text/css
        href=styles/mobile.css
        media="only screen and (min-width: 320px)" />

    <link rel=stylesheet type=text/css
        href=styles/desktop.css
        media="only screen and (min-width: 720px)" />



    /* mobile.css */
    @media screen and (min-width: 480px) {
        /* styles for this class of mobile browser */
    }

    @media screen and (min-width: 640px) {
        /* iPad maybe? */
    }
Wednesday, October 19, 2011
Desktop and iPad




Wednesday, October 19, 2011
A couple mobile devices


       iPhone 3GS                           iPhone 4
                                Nexus One




Wednesday, October 19, 2011
Thats great, but we havent
                   really solved the device
                          context yet.



Wednesday, October 19, 2011
Problem: limited bandwidth




Wednesday, October 19, 2011
All we adjusted for is width


                         Images are the same size for desktops
                        as they are for mobile
                          This is bad.Very bad.
                              Solution?



Wednesday, October 19, 2011
JavaScript-based image
                                       resize




                                            Credit: http://jedimsieer.deviantart.com/
Wednesday, October 19, 2011
<img src=/jcarouth/the-contextual-experience-of-the-mobile-web/"images/sample-small.jpg?full=images/sample-
    large.jpg" />

    (function(win) {
      /* code */
      var loadLarge = win.screen.availWidth > 480;
      if (!loadLarge) {
        return;
      }
      // more code...
      imgs = document.getElementsByTagName("img");
      for ( var i = 0, il = imgs.length; i < il; i++) {
          src = imgs[i].getAttribute("src");
          fullImgSrc = src.match( /(?|&)full=(.*)&?/ ) && RegExp.$2;
          if( fullImgSrc ) {
              imgs[i].src = fullImgSrc;
          }
      }
      //more code...
    })(this);


                              https://github.com/鍖lamentgroup/Responsive-Images

Wednesday, October 19, 2011
Alternative


                              Do the work on the server.
                         (You know, like in the 1990s when
                        JavaScript was Evil(tm))




Wednesday, October 19, 2011
The Process

                   Device requests page from server.
                  Service asks device for its device pro鍖le
                 (cookie?)
                   No pro鍖le available, build one from base.
                   Load resources based on pro鍖le.
                   Deliver content AND pro鍖le to device.

Wednesday, October 19, 2011
I havent seen this
                              implemented yet.



Wednesday, October 19, 2011
The mobility context




Wednesday, October 19, 2011
Wednesday, October 19, 2011
The Go To Example


                        Geolocation
                        i.e., driving directions or stores near
                        me




Wednesday, October 19, 2011
Do you trust directions
                           from my site, or from
                              Google Maps?



Wednesday, October 19, 2011
Right. I use Google Maps
                                   too.



Wednesday, October 19, 2011
So lets use geolocation for
                        something else.



Wednesday, October 19, 2011
Working on a CRM


                              Sales agent travels to Switzerland
                         Give a listing of leads/customers in
                        the area.




Wednesday, October 19, 2011
HTML5 Geolocation API

     if (navigator.geolocation) {
         navigator.geolocation.getCurrentPosition(
             function (position) {
                 callGeonamesWebservice(
                     position.coords.latitude,
                     position.coords.longitude);
             },
             function (error) {
                 //handle error
             }
         );
     }



Wednesday, October 19, 2011
<geonames>
        <code>
            <postalcode>8775</postalcode>
            <name>Luchsingen</name>
            <countryCode>CH</countryCode>
            <lat>46.98017</lat>
            <lng>8.99868</lng>
            <adminCode1/>
            <adminName1/>
            <adminCode2/>
            <adminName2/>
            <adminCode3>1631</adminCode3>
            <adminName3/>
            <distance>2.2072</distance>
        </code>
    </geonames>




Wednesday, October 19, 2011
Fetch Data From Your App




Wednesday, October 19, 2011
function findCustomersByPostalCode(
            $postalCodes,
            $recency) {
        //some SQL
        //where postal_code in $postalCodes
        //and last_contact between $recency and today

               return $customers;
    }




Wednesday, October 19, 2011
Thats just one example.
            Mobility context is absolutely
                application-speci鍖c



Wednesday, October 19, 2011
Recap

                         Many options for dealing with device
                        context
                              User Agent snif鍖ng
                               Redirect
                               Layout switch
                              Responsive design

Wednesday, October 19, 2011
Recap (cont.)


                         Users want to complete a task, not
                        always informative in nature.
                         Mobile is quickly shifting from a nice-
                        to-have to a must have component of
                        your projects.



Wednesday, October 19, 2011
What about jQuery Mobile
                    and other mobile
                       frameworks?



Wednesday, October 19, 2011
Thank you!




Wednesday, October 19, 2011
Questions?

                              Contact me
                               jcarouth@gmail.com
                               @jcarouth
                               jcarouth on Freenode
                              Rate at: http://joind.in/3786


Wednesday, October 19, 2011

More Related Content

The Contextual Experience of the Mobile Web

  • 1. The Contextual Experience of the Mobile Web Jeff Carouth ZendCon, October 19, 2011 Wednesday, October 19, 2011
  • 2. Howdy! (Yeah, Im from Texas.) PHP Developer since 2003 Web and mobile developer at Texas A&M University Wednesday, October 19, 2011
  • 3. This is not a presentation about development Wednesday, October 19, 2011
  • 4. nor is it about design Wednesday, October 19, 2011
  • 5. its about the collision of the two on the mobile web. Wednesday, October 19, 2011
  • 6. The Big Three The context of the mobile web is the speci鍖c environment and expectations a user or visitor of your website or application brings when he or she accesses it while mobile or using a mobile device. Wednesday, October 19, 2011
  • 7. Environment, expectations, and intent Mobile and mobility Devices and capabilities Wednesday, October 19, 2011
  • 8. In my opinion, design plays a major role in mobile success. Wednesday, October 19, 2011
  • 11. The question then becomes how can you accommodate both a 27 iMac and an iPhone? Wednesday, October 19, 2011
  • 12. Or, more accurately, how can you accommodate browsers of differing widths? Wednesday, October 19, 2011
  • 15. User Agent snif鍖ng If UA indicates mobile device redirect to separate mobile site, or provide a link to a separate mobile site Wednesday, October 19, 2011
  • 16. function mobile_device_detect(/* bunch of params */) { $mobile_browser = false; $user_agent = $_SERVER['HTTP_USER_AGENT']; $accept = $_SERVER['HTTP_ACCEPT']; switch(true){ case (preg_match('/ipad/i',$user_agent)); $mobile_browser = $ipad; $status = 'Apple iPad'; if(substr($ipad,0,4)=='http'){ $mobileredirect = $ipad; } break; } if($mobile_browser==true){ header('Location: '.$redirect); exit; } } http://detectmobilebrowsers.mobi Wednesday, October 19, 2011
  • 17. Or Show A Link Wednesday, October 19, 2011
  • 18. Problems with this method Perhaps your user wants your full site. Theyll likely miss any links and alert boxes are terrible. Wednesday, October 19, 2011
  • 20. function is_mobile() { $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); if (in_array( substr($user_agent, 0, 4), array('ipod','cell',...))) { return true; } if (strpos($_SERVER['HTTP_ACCEPT'], 'wap') != false) { return true; } if (preg_match( "/(android|blackberry|ipod|palm|...))/i", $user_agent)) { return true; } return false; } Wednesday, October 19, 2011
  • 21. if (is_mobile()) { require_once "mobile-layout.php"; } else { require_once "desktop-layout.php"; } Wednesday, October 19, 2011
  • 22. Thats very basic, and largely unreliable. Wednesday, October 19, 2011
  • 23. We can use a device database to improve the accuracy of matches. Wednesday, October 19, 2011
  • 24. Choices WURFL (Wireless Universal Resource FiLe) Device Atlas Wednesday, October 19, 2011
  • 25. class Bootstrap extends Zend_Application_Bootstrap_Abstract { protected function _mobileLayoutSwitch() { $this->bootstrap('useragent'); $this->bootstrap('layout'); $uaType = $this->getResource('useragent') ->getDevice() ->getType(); if ($uaType === 'mobile') { $this->getResource('layout') ->setLayout('mobile'); } } } Wednesday, October 19, 2011
  • 26. protected function _mobileLayoutSwitch() { $this->bootstrap('useragent'); $this->bootstrap('layout'); $resolution = $this->getResource('useragent') ->getDevice() ->getFeature('resolution_width'); if ($resolution < 320) { $layout = 'poor'; } elseif ($resoution < 480) { $layout = 'medium'; } else { $layout = 'desktop'; } $this->getResource('layout')->setLayout($layout); } Wednesday, October 19, 2011
  • 27. It works But we can do better. We can apply the mantra: branch on features not user agents to our mobile layouts. Wednesday, October 19, 2011
  • 28. The problem with user agents is: they lie. Wednesday, October 19, 2011
  • 30. So, how many of you remember liquid or 鍖uid layouts? Wednesday, October 19, 2011
  • 32. Techniques All in one CSS 鍖le Base CSS 鍖le and one CSS 鍖le for each class of device Major breakpoints in <link> media attribute Minor breakpoints in device stylesheet Wednesday, October 19, 2011
  • 33. <link rel=stylesheet type=text/css href=styles/base.css media="screen,handheld" /> <link rel=stylesheet type=text/css href=styles/mobile.css media="only screen and (min-width: 320px)" /> <link rel=stylesheet type=text/css href=styles/desktop.css media="only screen and (min-width: 720px)" /> /* mobile.css */ @media screen and (min-width: 480px) { /* styles for this class of mobile browser */ } @media screen and (min-width: 640px) { /* iPad maybe? */ } Wednesday, October 19, 2011
  • 34. Desktop and iPad Wednesday, October 19, 2011
  • 35. A couple mobile devices iPhone 3GS iPhone 4 Nexus One Wednesday, October 19, 2011
  • 36. Thats great, but we havent really solved the device context yet. Wednesday, October 19, 2011
  • 38. All we adjusted for is width Images are the same size for desktops as they are for mobile This is bad.Very bad. Solution? Wednesday, October 19, 2011
  • 39. JavaScript-based image resize Credit: http://jedimsieer.deviantart.com/ Wednesday, October 19, 2011
  • 40. <img src=/jcarouth/the-contextual-experience-of-the-mobile-web/"images/sample-small.jpg?full=images/sample- large.jpg" /> (function(win) { /* code */ var loadLarge = win.screen.availWidth > 480; if (!loadLarge) { return; } // more code... imgs = document.getElementsByTagName("img"); for ( var i = 0, il = imgs.length; i < il; i++) { src = imgs[i].getAttribute("src"); fullImgSrc = src.match( /(?|&)full=(.*)&?/ ) && RegExp.$2; if( fullImgSrc ) { imgs[i].src = fullImgSrc; } } //more code... })(this); https://github.com/鍖lamentgroup/Responsive-Images Wednesday, October 19, 2011
  • 41. Alternative Do the work on the server. (You know, like in the 1990s when JavaScript was Evil(tm)) Wednesday, October 19, 2011
  • 42. The Process Device requests page from server. Service asks device for its device pro鍖le (cookie?) No pro鍖le available, build one from base. Load resources based on pro鍖le. Deliver content AND pro鍖le to device. Wednesday, October 19, 2011
  • 43. I havent seen this implemented yet. Wednesday, October 19, 2011
  • 46. The Go To Example Geolocation i.e., driving directions or stores near me Wednesday, October 19, 2011
  • 47. Do you trust directions from my site, or from Google Maps? Wednesday, October 19, 2011
  • 48. Right. I use Google Maps too. Wednesday, October 19, 2011
  • 49. So lets use geolocation for something else. Wednesday, October 19, 2011
  • 50. Working on a CRM Sales agent travels to Switzerland Give a listing of leads/customers in the area. Wednesday, October 19, 2011
  • 51. HTML5 Geolocation API if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( function (position) { callGeonamesWebservice( position.coords.latitude, position.coords.longitude); }, function (error) { //handle error } ); } Wednesday, October 19, 2011
  • 52. <geonames> <code> <postalcode>8775</postalcode> <name>Luchsingen</name> <countryCode>CH</countryCode> <lat>46.98017</lat> <lng>8.99868</lng> <adminCode1/> <adminName1/> <adminCode2/> <adminName2/> <adminCode3>1631</adminCode3> <adminName3/> <distance>2.2072</distance> </code> </geonames> Wednesday, October 19, 2011
  • 53. Fetch Data From Your App Wednesday, October 19, 2011
  • 54. function findCustomersByPostalCode( $postalCodes, $recency) { //some SQL //where postal_code in $postalCodes //and last_contact between $recency and today return $customers; } Wednesday, October 19, 2011
  • 55. Thats just one example. Mobility context is absolutely application-speci鍖c Wednesday, October 19, 2011
  • 56. Recap Many options for dealing with device context User Agent snif鍖ng Redirect Layout switch Responsive design Wednesday, October 19, 2011
  • 57. Recap (cont.) Users want to complete a task, not always informative in nature. Mobile is quickly shifting from a nice- to-have to a must have component of your projects. Wednesday, October 19, 2011
  • 58. What about jQuery Mobile and other mobile frameworks? Wednesday, October 19, 2011
  • 60. Questions? Contact me jcarouth@gmail.com @jcarouth jcarouth on Freenode Rate at: http://joind.in/3786 Wednesday, October 19, 2011