1. 程式人生 > 其它 >【討論】APP的免填邀請碼解決方案

【討論】APP的免填邀請碼解決方案

00x0 具體需求


app中已註冊的使用者分享一個含有邀請碼的二維碼,分享到朋友圈
新使用者在朋友圈開啟這個這個連結下載app.
新使用者安裝後開啟app後就自動繫結邀請碼
要求使用者不填寫任何東西

朋友老闆出差給出的需求,感覺挺有意思……搞搞!

00x1 初步分析

1.APP

2.無填寫

3.開啟APP自動繫結邀請碼

新使用者沒有填寫任何資訊,也就是說沒有任何有效標識能夠識別該使用者,我們最好的辦法就是從其他地方尋找有效標識,必要時可新增一個標識……

00x2 解決方案

想了很多,從其他地方尋找有效標識雖然可行但不穩定,所以我們只能新增一個標識了,那我們在哪新增標識呢?APK!對,只有APK是我們能夠掌握的。

先了解一下APK的結構:

APK其實就是一個壓縮檔案,但是與平常的壓縮檔案有所不同,將字尾名改為zip開啟後我們就可以看到如上結構。

Assets目錄,這是存放靜態檔案的目錄,嗯哼?靜態檔案意味著我們可以任意修改的,可以說是對APK進行了一次簡單的反編譯。

我們在Assets目錄放一個txt檔案,暫且命名為key.txt,裡面放上邀請碼,然後用APP啟動後讀取該靜態檔案就可以知道是誰邀請的了。

00x3 實現

我們先寫好一個app然後編譯打包簽名,得到一個APK檔案,我們將該APK檔案字尾改為ZIP留之待用,新使用者通過邀請連結到達下載頁面,後臺取得請求中的邀請碼將其寫出為一個新的key.txt,然後將key.txt加入到ZIP檔案覆蓋原key.txt(待用的ZIP裡可以不放key.txt),將ZIP的字尾改為APK後提供給使用者下載。


<?php 

/* 

php 新增一個檔案到zip壓縮檔案中 

參考程式碼
來源:https://www.jb51.net/article/62099.htm?tdsourcetag=s_pcqq_aiomsg

*/

$zip = new ZipArchive; 

if ($zip->open('app.zip') === TRUE) {//app.zip 是已經存在的zip檔案,注意中文檔名要注意編碼問題 

 $zip->addFile('key.txt');//新增新的檔案 具體路徑自己來唄

 $zip->close(); 

 echo 'ok'; 

} else { 

 echo 'failed'; 

} 

?>

00x4 問題

由於之前使用的安卓模擬器進行的測試所以在後續進行實機測試時才發現修改後的APK無法正常安裝。

原因

谷歌的簽名驗證機制

Android 7.0之前的apk簽名為v1方案(Jar Signature),Android 7.0之後推出了V2方案,且7.0之前是不支援V2的。

所以,我們之前那樣直接修改後是不能直接用的(我使用的安卓模擬器沒有簽名驗證),因此我們需要對我們修改後的APK再進行一次簽名。

00x5 問題解決方案

使用Android studio自帶的sdk中的apksigner.jar再次簽名

apksigner具體使用文件:https://developer.android.com/studio/command-line/apksigner

apksigner sign --ks 簽名檔案 --ks-key-alias 證書名(別名) --ks-pass pass:簽名密碼 --key-pass pass:密匙密碼 --out ouput.apk(輸出路徑) input.apk(輸入路徑)

或者使用jarsigner進行簽名

jarsigner -verbose -keystore [您的私鑰存放路徑] -signedjar [簽名後文件存放路徑] [未簽名的檔案路徑] [您的證書名稱]

#jarsigner的引數說明

-keystore 引數指定您的私鑰的絕對路徑,例如:C:\Users\wz\Desktop\sign_verification\abcAndroidKey.jks

-signedjar 引數指定簽名後apk檔案存放絕對的路徑,例如C:\Users\wz\Desktop\sign_verification\oppoemptyapk- release-signed.apk

[未簽名的檔案路徑] 指定要簽名apk檔案的絕對路徑,也就是從要認領應用的平臺下載到的,例如 C:\Users\wz\Desktop\sign_verification\oppoemptyapk-release-unsigned.apk

[您的證書名稱] 是指您建立金鑰時,您設定的證書名稱,其實就是簽名中的別名(即:keyAlias)