เขียนโค๊ดให้ Run mobile web อัตโนมัติ

Friday, August 29th, 2008

ตอนนี้กระแสของการทำเว็บบนมือถือกำลังระบาดหนักเพราะตอนนี้แทบทุกคนล้วนแล้วแต่มีมือถือแทบทุกคน บางคน 2-3 เครื่องก็มี บริการหลายๆ อย่างหันไปให้บริการบนมือถือมากยิ่งขึ้น มาคิดถึงเขียนโปรแกรมบนมือถือเมื่อก่อน สมัยนั้นจะเขียนโปรแกรมด้วย wml (Wireless Application Protocol) ซะเป็นส่วนมาก และโดยมากเว็บที่มีบริการผ่าน w@p ก็มักจะใช้ URL เป็น

wap.xxx.com
xxx.com/wap/

อะไรทำนองนี้ ซึ่งผมเองก็เขียน w@b site เล่นอยู่เหมือนกัน เป็นการแสดงซื้อขายล่าสุด แต่หลังๆก็เลิกทำเพราะแทบไม่มีคนใช้งานบนมือถือ แหมก็ช่วงนั้นค่า GPRS อย่างแพง ช้า แถมคิดเป็นไบต์อีกใครจะมาเล่น

มาอีกช่วงหนึ่ง Pocket PC หรือ PDA เริ่มระบาดหนัก อีกทั้งใน Pocket PC ก็สามารถใช้งานบราวเซอร์ได้ด้วย แถมรองรับพวก html , Xhtml ก็เลยทำให้สามารถเขียนอะไรได้ง่ายมากขึ้น ยังมีโปรแกรมเมอร์หลายๆคนยังคงคิดว่า การเขียนสคริปเพื่อใช้งานบน Pocket PC ต้องเป็นภาษาเฉพาะ PHP ใช้งานบนมือถือไม่ได้ หากเป็นเมื่อก่อนไม่เถียงครับ แต่ตอนนี้ ใช้งานได้ปกติครับ เขียน PHP เหมือนเว็บปกติเลย แต่ต้องดีไซน์ขนาดให้มันพอเหมาะ พอดีเท่านั้น ซึ่งหลังๆมาก็จะเปลี่ยนชื่อ URL มาเป็น

ppc.xxx.com
xxx.com/ppc/
pda.xxx.com
xxx.com/pda/

อะไรประมาณนี้ ซึ่งเห็นเยอะกับ URL ในลักษณะนี้ อย่างของ tarad.com ก็มีให้บริการทั้ง w@p และ Pocket PC ครับ
อย่าง w@p ก็จะเป็นประมาณนี้ http://wap.tarad.com/belong2u
หรือ Pocket PC หรือ PDA ก็จะเป็น http://pda.tarad.com/belong2u

และในปัจจุบันคนเริ่มหันมาใช้กะ URL แบบนี้ครับ

http://m.xxx.xom
ซึ่งสดๆร้อนๆผมเพิ่งได้รับ SMS จาก SCB Easy net ว่าสามารถเข้าเช็คเงินได้ผ่านมือถือได้ที่ http://m.scbeasy.com ก็ลองใช้แล้วครับ โอเคเลยทีเดียว

อ่ะเข้าเรื่อง กรณีที่จะทำเว็บให้มันเลือกอัตโนมัติเลยหล่ะจะทำไง ว่าใช้เครื่องอะไรเปิดจะได้เปิดโปรแกรมให้ถูกต้อง เช่น ใช้ PC เปิดเว็บก็เข้าหน้าเว็บปกติ หากเข้าด้วย Pocket PC ก็ไปในหน้าของ Pocket PC หรือ แม้แต่ดูผ่าน iphone หรือ ipod ก็ไปอีกหน้านึง

หลักการมันก็เพียงแค่นั่งดึงเอาค่า HTTP_USER_AGENT มาทำการตรวจสอบก็เท่านั้นเอง ผมลองเขียนโค๊ด บรรทัดเดียว ดังนี้

<?php echo $_SERVER[’HTTP_USER_AGENT’] ;?>
ผมทดสอบผ่านเครื่อง PC ก็ได้ผลดังนี้
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; MEGAUPLOAD 2.0)

ผมทดสอบผ่าน HTC Touch ของผมแสดงผลดังนี้
PPC;240×320;HTC_P3450/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mozilla/4.0 (compatible;MSIE 6.0; Windows CE; IEMobile 7.6)

ได้ค่านี้มาก็เอามาเปรียบเทียบค่าโดยการเขียนฟังก์ชั่นเช็คค่ามันซะ แล้วก็กำหนดให้มัน redirect ไปที่ไหน โดยสามารถเขียนแบบนี้ได้

<?php

function detect_mobile_device(){
 
  // check if the user agent value claims to be windows but not windows mobile
  if(stristr($_SERVER[’HTTP_USER_AGENT’],’windows’)&&!stristr($_SERVER[’HTTP_USER_AGENT’],’windows ce’)){
    return false;
  }
  // check if the user agent gives away any tell tale signs it’s a mobile browser
  if(eregi(’up.browser|up.link|windows ce|iemobile|mini|mmp|symbian|midp|wap|phone|pocket|mobile|pda|psp’,$_SERVER[’HTTP_USER_AGENT’])){
    return true;
  }
  // check the http accept header to see if wap.wml or wap.xhtml support is claimed
  if(stristr($_SERVER[’HTTP_ACCEPT’],’text/vnd.wap.wml’)||stristr($_SERVER[’HTTP_ACCEPT’],’application/vnd.wap.xhtml+xml’)){
    return true;
  }
  // check if there are any tell tales signs it’s a mobile device from the _server headers
  if(isset($_SERVER[’HTTP_X_WAP_PROFILE’])||isset($_SERVER[’HTTP_PROFILE’])||isset($_SERVER[’X-OperaMini-Features’])||isset($_SERVER[’UA-pixels’])){
    return true;
  }
  // build an array with the first four characters from the most common mobile user agents
  $a = array(
                    ‘acs-’=>’acs-’,
                    ‘alav’=>’alav’,
                    ‘alca’=>’alca’,
                    ‘amoi’=>’amoi’,
                    ‘audi’=>’audi’,
                    ‘aste’=>’aste’,
                    ‘avan’=>’avan’,
                    ‘benq’=>’benq’,
                    ‘bird’=>’bird’,
                    ‘blac’=>’blac’,
                    ‘blaz’=>’blaz’,
                    ‘brew’=>’brew’,
                    ‘cell’=>’cell’,
                    ‘cldc’=>’cldc’,
                    ‘cmd-’=>’cmd-’,
                    ‘dang’=>’dang’,
                    ‘doco’=>’doco’,
                    ‘eric’=>’eric’,
                    ‘hipt’=>’hipt’,
                    ‘inno’=>’inno’,
                    ‘ipaq’=>’ipaq’,
                    ‘java’=>’java’,
                    ‘jigs’=>’jigs’,
                    ‘kddi’=>’kddi’,
                    ‘keji’=>’keji’,
                    ‘leno’=>’leno’,
                    ‘lg-c’=>’lg-c’,
                    ‘lg-d’=>’lg-d’,
                    ‘lg-g’=>’lg-g’,
                    ‘lge-’=>’lge-’,
                    ‘maui’=>’maui’,
                    ‘maxo’=>’maxo’,
                    ‘midp’=>’midp’,
                    ‘mits’=>’mits’,
                    ‘mmef’=>’mmef’,
                    ‘mobi’=>’mobi’,
                    ‘mot-’=>’mot-’,
                    ‘moto’=>’moto’,
                    ‘mwbp’=>’mwbp’,
                    ‘nec-’=>’nec-’,
                    ‘newt’=>’newt’,
                    ‘noki’=>’noki’,
                    ‘opwv’=>’opwv’,
                    ‘palm’=>’palm’,
                    ‘pana’=>’pana’,
                    ‘pant’=>’pant’,
                    ‘pdxg’=>’pdxg’,
                    ‘phil’=>’phil’,
                    ‘play’=>’play’,
                    ‘pluc’=>’pluc’,
                    ‘port’=>’port’,
                    ‘prox’=>’prox’,
                    ‘qtek’=>’qtek’,
                    ‘qwap’=>’qwap’,
                    ’sage’=>’sage’,
                    ’sams’=>’sams’,
                    ’sany’=>’sany’,
                    ’sch-’=>’sch-’,
                    ’sec-’=>’sec-’,
                    ’send’=>’send’,
                    ’seri’=>’seri’,
                    ’sgh-’=>’sgh-’,
                    ’shar’=>’shar’,
                    ’sie-’=>’sie-’,
                    ’siem’=>’siem’,
                    ’smal’=>’smal’,
                    ’smar’=>’smar’,
                    ’sony’=>’sony’,
                    ’sph-’=>’sph-’,
                    ’symb’=>’symb’,
                    ‘t-mo’=>’t-mo’,
                    ‘teli’=>’teli’,
                    ‘tim-’=>’tim-’,
                    ‘tosh’=>’tosh’,
                    ‘treo’=>’treo’,
                    ‘tsm-’=>’tsm-’,
                    ‘upg1′=>’upg1′,
                    ‘upsi’=>’upsi’,
                    ‘vk-v’=>’vk-v’,
                    ‘voda’=>’voda’,
                    ‘wap-’=>’wap-’,
                    ‘wapa’=>’wapa’,
                    ‘wapi’=>’wapi’,
                    ‘wapp’=>’wapp’,
                    ‘wapr’=>’wapr’,
                    ‘webc’=>’webc’,
                    ‘winw’=>’winw’,
                    ‘winw’=>’winw’,
                    ‘xda-’=>’xda-’
                  );
  // check if the first four characters of the current user agent are set as a key in the array
  if(isset($a[substr($_SERVER[’HTTP_USER_AGENT’],0,4)])){
    return true;
  }
}

function detect_iphone(){
  if(eregi(’iphone’,$_SERVER[’HTTP_USER_AGENT’])||eregi(’ipod’,$_SERVER[’HTTP_USER_AGENT’])){
    return true;
  }
}

// example 1 - detect and redirect mobile browsers
if(detect_mobile_device()){
  header(’Location: show.php?name=mobile’);
  exit;
}

// example 2 - detect and redirect desktop browsers
if(!detect_mobile_device()){
  header(’Location: show.php?name=web’);
  exit;
}

// example 3 - send iphone to specific site
if(detect_iphone()){
  header(’Location: show.php?name=iphone’);
  exit;
}

?>

ฟังก์ชั่นก็เขียนในลักษณะแนวๆนี้แทบทั้งนั้น สำหรับฟังก์ชั่นนี้ผมก็เอามาจาก http://www.andymoore.info/php-to-detect-mobile-phones/ ก็สามารถนำไปใช้ได้เลยนะครับหากขี้เกียจเขียนแล้ว

ในตัวอย่างจะเห็นว่าผมเขียน
header(’Location: show.php?name=web’);
เอาไว้ เพื่อทดสอบเวลามันไปไหน และ ส่งค่าไปถูกต้องหรือไม่ โดยคราวนี้ผมได้ลองทดสอบอีกรอบโดยการสร้างไฟล์ที่ชื่อ show.php โดยเขียนโค๊ดแบบนี้

<?php
echo $_GET[’name’];
?>
<br /><br />
<?php
echo $_SERVER[’HTTP_USER_AGENT’] ;
?>

ผมทดสอบผ่านเครื่อง PC ก็ได้ผลดังนี้
web

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; MEGAUPLOAD 2.0)

ผมทดสอบผ่าน HTC Touch ของผมแสดงผลดังนี้
mobile

PPC;240×320;HTC_P3450/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mozilla/4.0 (compatible;MSIE 6.0; Windows CE; IEMobile 7.6)

ซึ่งจากการตรวจสอบถือว่าถูกต้องครับ ดังนั้นเราสามารถเอาค่ามาใช้ได้เลยว่าใช้โทรศัพท์รุ่นไหน อย่างไร แล้วจะกำหนดเงื่อไขอะไรต่อไปก็จัดการทำเองเลย หวังว่าคงไม่ยากสำหรับคนที่อยากทำเว็บที่ใช้งานได้ทั้งคอมพิวเตอร์ และ มือถือนะครับ

อ่านเพิ่มเติมเรื่อง w@p ได้จากที่นี่
http://www.expert2you.com/view_article.php?art_id=236
http://en.wikipedia.org/wiki/Wireless_Application_Protocol

Editor's Talk!

สวัสดีคนที่หลงเดินทางเข้ามายัง Blog ของผม อาจจะด้วยความไม่ตั้งใจ หรือ ตั้งใจเข้ามาก็ตาม ก่อนอื่นผมก็ต้องขอออกตัวก่อนว่า Blog ของผมมันจะมีสาระบ้าง หรือ ไม่มีสาระเลย ก็แล้วแต่อารมณ์ช่วงไหนอยากเขียนอะไร อย่าเหมาว่า Blog ผมจะต้องมีแต่ความรู้เหมือน Blog ของคนอื่นๆ นะครับ
สำหรับ Blog นี้ ผมสามารถใช้คำพูดใดๆก็ได้ตามที่ผมเห็นสมควร เพราะมันคือ Blog ของกู(ผม) บางครั้งผมเขียนไปกระทบใครก็ขออภัยไว้ ณ. ที่นี้ด้วย ก็ไม่มีอะไรมากครับ ขอบคุณที่เข้ามาอ่าน Blog ของผมนะครับ

นายแม็ค

ค้นหา :