App 多版本兼容

開發語言: PHP7+
開發框架: Laravel php

之前也對接過 app,每次更新版本時,並不考慮兼容之前版本的問題,當有新版本更新時,在客戶端直接強制更新,不然會退出。
剛剛接手的 app 有了這個需求,須要保留之前的版本,這樣對不想更新的用戶來講,體驗會更友好。 laravel

多版本有不少解決方案,我直接用 laravel 框架將我本身的方案寫出來,供你們參考。數據庫

大致上須要改動4個地方api

  • routes 文件夾下添加規則爲 app_1.phpapp_2.php這樣的路由文件
  • Controllers 控制器文件夾下添加 V1,V2文件夾
  • 獲取客戶端自定義的 header 頭部字段 X-version-code
  • 修改 RouteServiceProvider 文件

寫到這裏,相信你們應該瞭解了個人思路,下面開始一步步解釋。數組

新建路由文件

新建一個路由文件 api_1.php,內容以下app

Route::group(['namespace' => 'V1'], function () {
    // 這裏寫路由
});

命名空間 V1 對應控制器 V1文件夾,這樣當有請求時,會自動找到指定版本的控制器框架

判斷客戶端版本號

X-version-code 是客戶端自定義的字段,表示當前客戶端的版本號。而版本號是有服務端返回爲客戶端的。ide

  1. RouteServiceProvidermapApiRoutes 方法中添加以下代碼this

    protected function mapApiRoutes()  ~~~~
    {  
      $versionCode = request()->header('X-version-code') ?? AppService::getLatestRoute();  
      $routeFile = ! $versionCode ? 'api_1.php' : ('api_' . $versionCode . '.php');  
    
      Route::prefix('api')  
     ->middleware('api')  
     ->namespace($this->namespace)  
     ->group(base_path('routes/' . $routeFile));  
    }

    $versionCode 是從 header 頭部獲取到的版本號;
    若是客戶端沒有及時更新,那麼咱們就能夠直接獲取 headerX-version-code 的版本號;
    若是是第一次下載,咱們須要獲取 app 最新的版本,也就是最新的路由文件:
    獲取方式見 2spa

  2. AppService::getLatestRoute() 方法獲取最新版本號

    // AppService.php
    public static function getLatestRoute()  
    {  
      $files = glob(base_path('routes') . '/api*.php');  
      
      // 獲取路由文件的文件名
      $tmp = array_map(function ($item) {  
        return pathinfo($item)['filename'] ?? '';  
      }, $files);  
    
      // 對數組中的文件名進行倒敘排列
      rsort($tmp);  
    
     return explode('_', current($tmp))[1] ?? '';  
    }

如何返回版本號

  • 在每次發佈新版本時,將發佈的版本記錄存儲到數據庫
  • 定義一個接口,該接口返回 app 的最新版本號。
  • 在客戶端每次啓動時查詢接口的最新版本號。

假設接口中的版本號爲 A,存到客戶端本地的版本號爲 B 若是 A > B,表示須要更新。

相關文章
相關標籤/搜索