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 ...... 其實仍是很恐怖的,我已經無路可退了......

相關文章
相關標籤/搜索