用php作wap开发时遇到的问题

以前作过几个月的wap开发,本文我将简要的介绍一下我在作wap开发时遇到的一些问题,供大家借鉴.

更新说明:在类里出现的数字13是错误的,现在已经改成11了。数学没有学好,连手机号的长度都没有数清楚,这回人可丢大了。

1.文件格式
首先要遇到的问题肯定是文件格式,在作web开发时,大家都是用的html或xhtml,到了wap开发时,就得用wml了.什么是wml?大家可以去查更详细的资料,我这里只是略微的提到.在我看来wml类似于xml,有非常严格的格式,在作wap页面时,都得用wml来作为显示.

wml的语法非常简单,在用php作动态输出时,一定要发送一个头信息,标明本页面是wml,而不是别的什么*ml.

 CODE:
header("Content-type: text/vnd.wap.wml; charset=/"gb2312/"");

这里用的字符集是gb2312,在移动的平台上是没有任何问题的,但在联通的平台上就不行了,一定得用utf-8,为了更通用,还是用utf-8更安全.即

 CODE:
header("Content-type: text/vnd.wap.wml; charset=/"utf-8/"");

2.编码

上面说了字符集都应采用utf-8,这是一种容纳了多国语言的字符集,一个汉字是占双字节,utf-8占了4个字节,因此其容纳的信息量更大.在手机上编写的汉字,在将页面内码转成utf-8后,以后再打开就可能是一堆乱码.因此大家在作注释时,尽可能的用英文注释,省得以后看不懂.像editplus,ultraedit等工具都可以转文件内码.

3.适配

世界各大手机厂商真是有病,开发出的手机千奇百怪,可以支持的格式也是五花八门.比如铃声,有的可以支持,16,32,48和弦,支持mid,wmv,有的不完全支持;有的支持gif,png,bmp,有的也不完全支持.这虽然是把手机的档次和成本拉开了,但却苦了作手机开发的兄弟们了.因为不可避免的要对手机所能支持的图片,铃声等多媒体信息作出一个匹配,这个匹配的处理,我们一般叫做手机适配.
要作手机适配,我们一般得有如下资料.

1)一份详细的手机适配资料表,里面应详细的说明手机所能支持的铃声,图片格式,还得有手机型号等信息
2)要正确的获取手机的UA,什么是UA,就是(user agent),实际上就是用户的手机信息.

有了上面的东东我们才能做出适配.以下给出一个我写的在wap开发中用到的类,可以用来取手机号,手机UA.

 CODE:

<?php
/**
*  类名: mobile
*  描述: 手机信息类
*  其他: 偶然 编写
*/
class mobile
{
    /**
    *   函数名称:   getPhoneNumber
    *   函数功能:   取手机号
    *   输入参数:   none
    *   函数返回值: 成功返回号码,失败返回false
    *   其它说明:   说明
    */
    function getPhoneNumber()
    {
        if (isset($_SERVER['HTTP_X_NETWORK_INFO']))
        {
            $str1 = $_SERVER['HTTP_X_NETWORK_INFO'];
            $getstr1 = preg_replace('/(.*,)(11[d])(,.*)/i','/2',$str1);
            Return $getstr1;
        }
        elseif (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID']))
        {
            $getstr2 = $_SERVER['HTTP_X_UP_CALLING_LINE_ID'];
            Return $getstr2;
        }
        elseif (isset($_SERVER['HTTP_X_UP_SUBNO']))
        {
            $str3 = $_SERVER['HTTP_X_UP_SUBNO'];
            $getstr3 = preg_replace('/(.*)(11[d])(.*)/i','/2',$str3);
            Return $getstr3;
        }
        elseif (isset($_SERVER['DEVICEID']))
        {
            Return $_SERVER['DEVICEID'];
        }
        else
        {
            Return false;
        }
    }

    /**
    *   函数名称:   getHttpHeader
    *   函数功能:   取头信息
    *   输入参数:   none
    *   函数返回值: 成功返回号码,失败返回false
    *   其它说明:   说明
    */
    function getHttpHeader()
    {
        $str = '';
        foreach ($_SERVER as $key=>$val)
        {
            $gstr = str_replace("&","&",$val);
            $str.= "$key -> ".$gstr."/r/n";
        }
        Return $str;
    }

    /**
    *   函数名称:   getUA
    *   函数功能:   取UA
    *   输入参数:   none
    *   函数返回值: 成功返回号码,失败返回false
    *   其它说明:   说明
    */
    function getUA()
    {
        if (isset($_SERVER['HTTP_USER_AGENT']))
        {
            Return $_SERVER['HTTP_USER_AGENT'];
        }
        else
        {
            Return false;
        }
    }

    /**
    *   函数名称:   getPhoneType
    *   函数功能:   取得手机类型
    *   输入参数:   none
    *   函数返回值: 成功返回string,失败返回false
    *   其它说明:   说明
    */
    function getPhoneType()
    {
        $ua = $this->getUA();
        if($ua!=false)
        {
            $str = explode(' ',$ua);
            Return $str[0];
        }
        else
        {
            Return false;
        }
    }

    /**
    *   函数名称:   isOpera
    *   函数功能:   判断是否是opera
    *   输入参数:   none
    *   函数返回值: 成功返回string,失败返回false
    *   其它说明:   说明
    */
    function isOpera()
    {
        $uainfo = $this->getUA();
        if (preg_match('/.*Opera.*/i',$uainfo))
        {
            Return true;
        }
        else
        {
            Return false;
        }
    }

    /**
    *   函数名称:   isM3gate
    *   函数功能:   判断是否是m3gate
    *   输入参数:   none
    *   函数返回值: 成功返回string,失败返回false
    *   其它说明:   说明
    */
    function isM3gate()
    {
        $uainfo = $this->getUA();
        if (preg_match('/M3Gate/i',$uainfo))
        {
            Return true;
        }
        else
        {
            Return false;
        }
    }

    /**
    *   函数名称:   getHttpAccept
    *   函数功能:   取得HA
    *   输入参数:   none
    *   函数返回值: 成功返回string,失败返回false
    *   其它说明:   说明
    */
    function getHttpAccept()
    {
        if (isset($_SERVER['HTTP_ACCEPT']))
        {
            Return $_SERVER['HTTP_ACCEPT'];
        }
        else
        {
            Return false;
        }
    }

    /**
    *   函数名称:   getIP
    *   函数功能:   取得手机IP
    *   输入参数:   none
    *   函数返回值: 成功返回string
    *   其它说明:   说明
    */
    function getIP()
    {
        $ip=getenv('REMOTE_ADDR');
        $ip_ = getenv('HTTP_X_FORWARDED_FOR');
        if (($ip_ != "") && ($ip_ != "unknown"))
        {
            $ip=$ip_;
        }
        return $ip;
    }
}
?>

4.页面设计

作wap开发时,wap页面是非常简单的.比html来说是简单到不能再简单了.在wap1.0里是没有表格之类的乱七八糟的东西的.所有的标签都是写在一个叫card的标签之内.可以用<p></p>来分段.所以做页面的算是轻松了.

5.模拟器

作wap开发免不了要用各式各样的模拟器来测试,比较好的有m3gate,openwave,opera,还有一个叫winwap的,大家最好别用他来作测试,他的兼容性太好了,即使页面有错误都能给忽略掉.测试时跟用浏览器测试web页面一样,输入网址就可以了.没有比这更容易的事了.

6.注意事项

1)空格,特别是在定义DTD时,

 CODE:
echo "<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/" /"http://www. wapforum.org/DTD/wml_1.1.xml/">";

里面如果哪个地方少个空格,就有你受的了.以前写的时候用了页面重排之后,把一些空格给干掉了,整整找了两天才找出错误来,大家千万别步我的后尘.

2)标签,如果标签不成对,会提示错误,大家注意就是了,很容易修正.

以上是我的一些经验,写出来供大家参考,时间有限,写的比较仓促,有时间写一份更详细的为大家服务.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值