今天這篇要來寫關於「從外部瀏覽器跳轉APP」的功能實作

這個需求呢..其實也是在工作上遇到的

大致上來說就是客戶那邊有寫一個網頁,然後對方希望在手機端點擊後如果有安裝APP的情況下會跳轉APP

沒有APP的話就會跳轉到該APP的Google Play下載頁面...的這樣一個功能

恩...這功能乍聽之下還算簡單,就是從網頁跳轉APP麻。相關功能我看過

而就實際面來說,論及「從網頁跳到APP」這個功能含找資料我也花不到半小時就實裝完成了

Too Easy | Know Your Meme

 

但問題是接下來這句

沒有APP的話就會跳轉到該APP的Google Play下載頁面

1688805129985

 

身為一個在工作上不積極不努力不做死的原則,我跟主管說

「蛤?這個判斷要交給他們網頁的人去想辦法ㄅ」

 

然後主管就回我

「淦,他們的也不會啊」

 

 

...好啦這個行為不要學,我跟主管是有一定交情基礎的,他也知道我在講幹話但其實我很認真想推責任ww

於是這🐦差事就還是打到我頭上來了QQ

 

好吧廢話到此為止,接下來來先看一下功能吧

 

實作影片中因為時間長度的緣故我沒有將「沒裝APP」時的狀況給錄進去,不過在我的Code中沒裝APP時的跳轉是有實裝的喔!

最後是Github

->https://github.com/thumbb13555/AndroidBlogExamples/tree/main/OpenAppFromWebExample

 

Web的內容雖然也有包含在內,不過怕你找不到XD

->https://github.com/thumbb13555/AndroidBlogExamples/tree/main/OpenAppFromWebExample/Web

 

那開始吧!

 


 

1. 確認功能

 

首先看一下這個組圖

image

 

大致上跟據多方調查,目前在業界上大部分的相關功能都會是這樣遷移的

由於在JavaScript是無法去偵測Android內所有的APP的安裝情況,因此為了不對原先的頁面造成影響,所以通常都會再開一個頁面去做遷移判斷

OK,確認好遷移邏輯後我們就進入到實作

 


 

2. Android端實作

 

首先我們先從簡單的部分先實作

然而還挺意外的是....這次的難點居然不是在Android(笑

所以我就直接寫重點出來吧

 

在Android這邊的設置中,Android要決定的事情就是「連結

什麼意思?其實是這樣的

 

在這個外部呼叫APP的實作中,其實本質上他開啟APP的邏輯就是使用URL去開啟的

而Android這邊就是要決定這串URL的寫法

而決定這個URL的檔案沒什麼特別的,就是AndroidManifest.xml啦哈哈

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.OpenAppFromWebExample"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <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" />
                <!--格式: myapp://noah.liu/example?info=來自火星的Hello  -->
                <data
                    android:scheme="myapp"
                    android:host="noah.liu"
                    android:pathPrefix="/example"
                     />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

 

重點主要是在<intent-filter>的部分,由於我這個範例只有MainActivity一個頁面,因此被我標註粉底的部分寫在了<activity>底下

如果你是有多個畫面,那這段程式碼就要寫在該頁面之下囉!

 

再來我們仔細看一下決定URL的部分,如下

myapp://noah.liu/example?info=來自火星的Hello

對照這部分的Code的話,我想就一目了然了吧!

<data android:scheme="myapp" android:host="noah.liu" android:pathPrefix="/example"/>

至於最後面的

?info=來自火星的Hello

這部分是傳值的部分,我拉到後面再講

 

再來,來到Activity的部分,程式很少我們直接看

 

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //一定要檢查是否空值,否則會閃退
        if (getIntent().getData()!= null){
            String fromWeb = getIntent().getData().getQueryParameter("info");
            TextView tvFromWeb = findViewById(R.id.textview_Main);
            tvFromWeb.setText(fromWeb);
        }
    }
}

這一段程式碼就是拉取URL傳過來的資訊,而這個資訊內容就跟RESTful GET格式是完全一致的

我這裡姑且是有範例,但後續的應用就看個人囉 :)

 


 

3. Web端實作

 

好的,最後就是Web端的實作了

Web端程式碼是比較囉唆的,我在這裡只寫重點,程式碼僅以連結呈現

 

首先是按鈕畫面,重點只有這邊

MainPage.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>MainPage</title>
</head>
<body>
<div class="container">
    <div class="center">
        <a onclick="javascript:open_app();" class="styled">開啟APP</a>
    </div>
</div>
</body>
<script language="javascript">    

    function open_app(){
        window.open("SubPage.html");
    }
</script>
</html>

 

謎之聲:哈哈,不就是跳頁而已嗎(笑

 

再來才是重點了,來看看第二頁

SubPage.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>None</title>
</head>
<body onload="open()">
<h1>請稍候...</h1>
</body>
</html>
<script language="javascript">
  let app = 'myapp://noah.liu/example?info=來自火星的Hello';
  let appstore =
    'https://play.google.com/store/apps/details?id=com.noahliu.noisemeter';

  function open() {
    
    setTimeout(function () {
        window.location.href = app;
        setTimeout(function(){
            window.location.href = appstore;
            setTimeout(function(){
                window.close();
            },1000);
        },2000);
    }, 500);
  }
</script>

 

首先粉底白字的部分,這裡的意思就是在頁面開啟後直接執行Javascript程式碼的

再來紫底橘底的部分就是分別跳轉APP跟GooglePlay

 

而很有趣的是這部分的跳轉其實並非URL的網址跳轉,而是它會自動跳轉到GooglePlay

而這樣的設計使這個功能的使用者體驗更好,我還挺喜歡的XD

 


 

4. 實測

 

我這套程式當時在測試的時候也遇到了點小問題,就是我不知道該如何在Android的模擬器上執行我寫好的網頁

雖然啦,始之能夠執行的方法有很多種。像是開Node啊或者寫個簡單的Server執行程式都可以

 

但...我就不想那麼複雜麻XD

 

後來我想到了在VScode中有一個LiveServer的套件,該套件能夠開啟一個簡單的localhost本地網頁做執行

但很可惜的是我起先載了該套件後沒辦法在模擬器上執行

後來在朋友幫助下我有找到方法可以使這個網頁在模擬器執行,方法如下

 

1. 使用ifconfig(Windows: ipconfig)找出該電腦的IP

截圖 2023-07-08 下午7.37.02

 

2. 進入到LiveServer的設定,找到Setting

截圖 2023-07-08 下午7.39.03

 

3. 最後找到Host選項,打上剛剛查詢到的IP就可以囉! 

截圖 2023-07-08 下午7.41.57

 

 

好的,程式寫到這邊應該是可以順利執行囉~希望大家都有把功能做出來!

 

最後..

TK2

arrow
arrow

    碼農日常 發表在 痞客邦 留言(3) 人氣()