站長資訊網
        最全最豐富的資訊網站

        H5啟動APP原生頁面的實例方法

        許久沒有寫博客了,最近有個H5啟動APP原生頁面的需求,中間遇上一些坑,看了些網上的實現方案,特意來總結下

        一、需要判斷客戶端的平臺以及是否在微信瀏覽器中訪問

        1、客戶端判斷

        在啟動APP時,Android和IOS系統處理的方式是不一樣的,Android這邊由于開放,可以在瀏覽器中通過<a>標簽以及meta標簽的方式,讓瀏覽器app獲取手機打開應用的權限進而啟動APP。

        而在IOS這邊,IOS9以后的系統,則可以在APP開發過程中加入配置和邏輯代碼編寫,系統在瀏覽器即將訪問到某個域名前就把這個域名對應的APP打開,這個有點閃,封閉還是有封閉的好處。

        所以首先要在客戶端判斷,是Android系統還是IOS系統,判斷代碼如下

        function isInIos(){var userAgentInfo = navigator.userAgent ,          Agents = ["iPhone" , "iPad", "iPod"];for(var v = 0; v < Agents.length; v++) {if (userAgentInfo.indexOf(Agents[v]) > 0) {          return true;          }      }return false;  }

        2、是否在微信內置瀏覽器中

        無論是在哪個平臺的客戶端Android/IOS,在微信的平臺上訪問都有一個問題,那就是無法啟動客戶端,這是微信為了安全性考慮的限制,android這邊屏蔽schema協議,除非公司是微信的伙伴加入了白名單才能

        使用,IOS系統可以去訪問app對應appstore的下載頁,但是微信經常屏蔽appstore的這個網址,進而訪問不到。比較方便的做法就是在微信瀏覽器中,無論是IOS還是android都去應用寶的下載(IOS 這邊最后會到

        appstore中)頁面打開。我這邊的需求是提示用戶點擊“…”用默認瀏覽器打開。

        判斷是否是在微信中,代碼如下:

        function isInWx(){var agent = window.navigator.userAgent.toLowerCase();return agent.match(/MicroMessenger/i) == 'micromessenger';  }

        二、原理

        首先無論是andorid還是IOS端,在瀏覽器中通過JS都是無法判斷該手機是否裝有某APP的,即使這個瀏覽器有權限讀取手機應用列表,也沒有一個固定的對外API讓咱們進行查詢。而H5啟動APP本質上是通過

        URL scheme打開APP,一個APP可以設置一個或多個打開自己的URL scheme,瀏覽器去訪問某一個APP的URL scheme,然后若系統安裝有這個APP,則會請求權限去打開這個APP。其實也算是瀏覽器app

        打開另一個app,iOS就可以使用 UIApplication 的 canOpenUrl 方法來檢測URL scheme 是否能打開對應的APP,而android也是類似的方式。當然如果JS跳轉URL scheme沒有反應,也意味著這個手機沒有

        裝這個app。

        三、android平臺

        首先編輯AndroidManifest.xml,主要是增加第二個<intent-filter>

        <activity android:name=".activity.LoadingActivity"  android:label="${APP_NAME}"  android:screenOrientation="portrait"  android:theme="@style/FirstActivityTheme">  <intent-filter>  <action android:name="android.intent.action.MAIN" />      <category android:name="android.intent.category.LAUNCHER" />  </intent-filter>  <intent-filter>  <action android:name="android.intent.action.VIEW" />      <category android:name="android.intent.category.DEFAULT" />      <category android:name="android.intent.category.BROWSABLE" />      <data android:host="android"android:scheme="wushang" />  </intent-filter></activity>

        比如此處wushang就是scheme,這個最好是app的唯一標識符,要不然在H5喚醒時,會出現一個選擇框,選擇啟動哪一個APP。而host表示啟動該頁面,其實這個更應該用com.android.sky這樣的包名來替代更好。

        這樣的情況完整的URL就是wushang://android?data=sky,后面是參數傳遞。在Activity中可以用如下代碼獲取參數

        public void onCreate(Bundle savedInstanceState) {                    Uri uridata = this.getIntent().getData();                    String mydata = uridata.getQueryParameter("data");              }

        之后在進行字符串截取還是什么鬼的都隨意啦。

        接下來來談談前端代碼,這里有兩種情況

        1、頁面在刷新進入時,請求權限喚起APP

        這個比較簡單,就只用在頁面的頂部head中加入meta標簽即可

        <meta http-equiv="refresh" content="0;url=wushang://android?data=sky">

        這個標注當頁面刷新即去訪問這個鏈接,進而啟動APP。但是存在一個問題,如果是蘋果系統的Safari瀏覽器的話,訪問有這個meta的頭,會給出錯誤提示,所以這個頭部可以在后端進行頁面渲染時通過客戶端的

        總類在加上去。

        2、通過點擊事件喚起APP

        最簡單的辦法當然是直接使用a標簽,如下

        <a href="wushang://android">open Android app</a>

        但是在實際使用時,是需要對客戶端的平臺類型還有是否在微信內置瀏覽器中進行判斷的,所以這樣的做法肯定是不行的。

        接下來談談在開發過程中,遇到的一個問題,記錄下。因為這邊移動端使用的工具庫庫是zepto,采用的點擊事件是tap,但是在用tap進行處理是經常要點很多下,才能喚起APP

        <script type="text/javascript">    $('#go').tap(function(){        window.location.href = "wushang://android";    });</script>

        具體原因不知,可能是tap事件采用的是輕點觸碰。然后摸索了下,才用click事件,或者直接在a標簽上標注處理函數就沒有這問題

        <a id="go" >open Android app</a><a href="javascript:startApp()">     open</a><script src="../res/lib/zepto.min.js?1.1.11"></script><script src="../res/lib/public.js?1.1.11"></script><script>$('#go').click(function () {       if(publicFun.isIos()){            alert('it is IOS')         }else{            window.location.href = "wushang://android";         }      });function startApp(){       if(publicFun.isIos()){            alert('it is IOS')         }else{            window.location.href = "wushang://android";         }      }</script>

        所以決定以后遇到這類問題,就用這兩種方式了。下面是實際的處理函數

         window.startApp = function(){     //啟動APP if(publicFun.isInWx()){     //微信中alert("請在瀏覽器中打開");       }else{      //非微信中if(publicFun.isIos()){    //IOS系統,直接去itunes中,既可以下載也可以打開window.location.href = "https://itunes.apple.com/cn/app/[name]/id[id]";          }else{      //android系統,通過定時器的方式,判斷是否安裝有APPvar hasApp = true , t = 1000;              setTimeout(function () {  //沒有安裝APP則跳轉至應用寶下載,延時時間設置為2秒  if(!hasApp) window.location.href = "http://a.app.qq.com/o/simple.jsp?pkgname=[name]";              } , 2000);var t1 = Date.now();              window.location.href = "wushang://android";              setTimeout(function () {    //t的時間就是出發APP啟動的時間,若APP啟動了,再次返回頁面時t2這行代碼執行,hasApp即為true。反之若APP沒有啟動即為false  var t2 = Date.now();                hasApp = !(!t1 || t2 - t1 < t + 150);              } , t);          }       }    }

        其實有個非常簡單的辦法,就是直接跳轉應用寶。無論是在android還是IOS,以及微信非微信。應用寶的下載頁面都有下載和打開兩個功能(如果是在IOS平臺,它是通過連接app store的方式)

        四、IOS平臺

        針對ios9及以上的打不開問題,實際上ios9提供了更好的解決方案————通用鏈接。

        這是iOS9推出的一項功能,如果你的應用支持Universal Links(通用鏈接),那么就能夠方便的通過傳統的HTTP鏈接來啟動APP(如果iOS設備上已經安裝了你的app,不需要額外做任何判斷等),或者打開網頁(iOS設備上沒有安裝你的app)?;蛟S可以更簡單點來說明,在iOS9之前,對于從各種從瀏覽器,Safari、UIWebView或者 WKWebView中喚醒APP的需求,我們通常只能使用scheme。

        以上來自網上關于通用鏈接的介紹,對于前端簡單點講就是你訪問一個http的url,如果這個url帶有你提交給開發平臺的配置文件中匹配規則的內容,ios系統會去嘗試打開你的app,如果打不開,系統就會在瀏覽器中轉向你要訪問的鏈接。很好的一個屬性,因為通過這個屬性在ios9上我們能夠繞過微信的攔截從而打開app。

        所以上面的點擊事件,僅僅是去訪問app store,因為若app已安裝,在瀏覽器訪問時,就已經去到APP中了。

        這些都是IOS配置上的東西,就不多寫了。至于傳參,以及頁面定向,其實也就是相當于在UIWebView中獲取當前連接的URL,然后進行字符串拆分以及校驗,即可判斷去哪個頁,以及獲取參數值。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 欧美精品免费在线| 岛国精品一区免费视频在线观看| 香蕉久久夜色精品升级完成| 欧美亚洲国产精品久久蜜芽| 人人妻人人澡人人爽人人精品97 | 亚洲精品乱码久久久久久蜜桃| 91精品日韩人妻无码久久不卡| 国产精品无码a∨精品| 亚洲精品第一国产综合境外资源| 国产成人高清精品免费观看| 国产精品区一区二区三在线播放 | 91精品国产91久久综合| 亚洲高清专区日韩精品| 久久性精品| 国产精品男男视频一区二区三区| 精品国产品香蕉在线观看75| 国产精品视频一区二区噜噜 | 国产精品毛片无遮挡| 亚洲国产精品成人久久 | 久久五月精品中文字幕| 国产亚洲精品高清在线| 久久99国产精品久久99| HEYZO无码综合国产精品227| 最新国产精品精品视频| 亚洲AV蜜桃永久无码精品| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产精品高清在线| 国产精品 视频一区 二区三区| 2023国产精品自拍| 四虎精品8848ys一区二区| 青青草国产精品欧美成人| 国产精品久久亚洲不卡动漫| 国产福利视精品永久免费| 999国内精品永久免费视频| 99在线精品视频在线观看| 99精品国产丝袜在线拍国语| 99re6在线精品免费观看| 国产精品久久一区二区三区| 日本人精品video黑人| 亚洲精品小视频| 国产精品综合久久第一页|