PHP、Android、iOS 的恩恩怨怨

其实应该更多的是互相的磨合与学习,但愿身边的人能够有本身的经验分享,与理解,互相进步才是你们须要的,做为一个 "年老" (我也是90后) 的开发者,我以为一代胜一代,将来才有胜算。额,好了,我不充当老师的角色了,去正题。javascript

1. 安卓中 a 标签的坑

在和客户端交互的过程当中,每每都有跳转的,而在我们 Web 开发中,默认的 href 属性一般是 #,而后经过获取标签绑定动做触发事件,这里有个坑,在与安卓交互过程当中会发现。html

<a href="#">click me</a>
// include zepto or jquery or other.
$(function () {
    $('a').on('tap, click', function () {
        alert('test');
        return false;
    });
});

上述代码中,会引发安卓交互中的一个坑,就是没点击一次,安卓都会在计数器上+1, 也就是,点击第一次,弹一次窗,点击第二次,会弹两次窗,如此类推。java

解决方法:jquery

<a href="javascript:void(0);">click me</a>

Fxied!!android

2. 安卓中交互的坑

我丢,安卓这个坑爹,在 js 交互中,没法传递对象,匿名函数等等的类型。也就是说,若是你的参数是接受一个对象的,你必须将她转成 String,并且安卓中的返回值也是只能返回 String,在我们接受以后须要将字符串转换成对象。web

简单 判断客户端类型的:ajax

isiOS: function () {
     if (this.ua.match(/android/i) == "android") {
         return false;
     }
     return true;
 },
 isAndroid: function () {
     if (this.ua.match(/android/i) == "android") {
         return true;
     }
     return false;
 }

解决方法:数据库

encode: function (data) {
     if ("" == data) {
         return {};
     }
     return JSON.stringify(data).replace(/"/g, '\'');
 },
 decode: function (data) {
     if ("" == data) {
         return "{}";
     }
     return JSON.parse(data.replace(/\'/ig,'\"'));
 }

在调用 iOS 或者 android 的时候,先将参数传递到 encode 处进行过滤。json

3. 判断页面是否在应用内打开

其实这个很简单,常常作 web 开发的都应该知道,我们天天都与 Http 协议打交道,而在 Http 中,有一个很重的的标识,就是 User-Agent,简称 UA,其实这个东西就像我们的门票同样,有着各类的信息在上面,其实就包括了不少的浏览器内核信息,版本信息,厂商等等......我们就是从这个地方入手,在客户端中定义本身的版本信息,与微信同样。今后告别什么 url 上加什么破参数啊什么的。浏览器

以个人经验来设计的话,通常按照这个格式:

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 {company} {appname} [{type}]/{version}

如: 腾讯,微信 [海外版本] 6.0.0

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 Tencent MicroMessager oversase/6.0.0

由于此处我还没太多接触客户端开发,暂时没有客户端代码演示.

us: window.navigator.userAgent.toLowerCase(),
is: function (name) {
    return tools.ua.match(eval("/" + name + "/i")) == name ? true : false;
}

Examples:

if (/* Is app inside */) {
    /* Operation */
} else {
    /* Is app outside */
    /* Operation */
}

Combine: In wechat

if (/* In wechat app */) {
    /* open share guide */
} else {
    if (/* In app */) {
        if (/* Is iOS */) {
            /* share iOS sdk */
        } else {
            /* share android sdk */
        }
    } else {
        /* share operation */
    }
}

4. 请善用你的 Http Status Code

曾几什么时候,我也是一个懵懂无知的骚年,链接口是干吗用的都不知道,大概也在 2014/8 月份左右,我对接口都是一种很敬畏的眼光去看待,直到如今,2016年,我更加视接口是一切数据库的来源,其价值是最至高无上的。可是由我接触接口(Application Programing Interface)开发以后,我发现目前的接口有好多问题,一个很明显的就是,为啥每一个接口都是 200,不该该啊,那非 200 响应的应该怎么办?有作处理吗?
直到后来,我推翻了这一现象,也说服了各方的人。我举一个 Ajax 的例子:

首先我先问一个问题,为什么 jquery 和 zepto 的 ajax 中,都有一个 error 回调?

$.ajax({
    // some code
    success: function () {},
    error: function () {}
});

请不要怀疑设计者的智商与知识,我猜他应该会比你聪明以及牛叉。这么作,确定有缘由的。其实这里的 error 就是为了让非 2xx 状态的时候进入的操做的。

如示例:

{
    status: 1
    content: {}
}

以上例子自己没有错误,仅以本身见解对上述进行评述

其实我们应该要善用自己已经有的东西,不须要再从新造多一个,吃力不讨好,那大家就开始好好补一补 Http Status code 相关的知识吧。

示例:

Request Method:GET
Status Code:200 OK

200 通常都是成功响应,
3xx
4xx
5xx

根据不一样的状态码进行不一样的处理机制,无需重复再作这一步骤了,其实设计者也很清晰设计出状态码的意义,应该善用。

5. 判断应用是否安装,若是安装,则打开,不然则跳去下载

其实这个有点无理取闹,可是又不得不去作,首先这个其实原理也是挺绕的

  1. 利用iframe尝试打开自定义scheme

  2. 跳转到下载地址

只是那个判断......

其实我是建议这些操做统一由一个地方去作,好比定义一个域名叫: down.xxx.com/应用id,后台读取应用id 相信信息,统一由一处转发。

function open () {
    var ifr = document.createElement('iframe');
   ifr.src = url;
   ifr.style.display = 'none';
   document.body.appendChild(ifr);
   window.setTimeout(function(){
       document.body.removeChild(ifr);
   }, 3000);
}

注意 iOS9 对这个有点不兼容,因此,谨慎,iOS7,iOS8,安卓都可以实现

获取版本信息:

var getVersion = function () {
  if (tools.client.isAndroid()) {
      return parseFloat(tools.ua.match(/Android\s(.*?);/i)[1]);
  }

  return parseFloat(tools.ua.match(/OS\s(.*?)\slike/i)[1].split('_').join('.'));
};

这里须要判断系统类型及版本:

if (/* iOS */) {
    if (/* iOS version less than 9.0 */) {
        /* try open scheme */
        /* redirect download link */
    } else {
        /* other operate */
    }
} else {
    /* try open url */
    /* redirect download link */
}

因此,因而可知其实这里的判断会不少,不少,不少。因此我墙裂建议都统一到一个地方作分发。

这里其实还须要判断是否微信,是否应用内打开,是不是分享出去的。

结合第 3 点的例子想一想,这里的 if ...... 其实仍是很恐怖的,我已经无路可退了......

相关文章
相关标签/搜索