2014-01-18 30 views
0

我們正在構建一個網絡應用程序,該應用程序爲用戶創建自己的移動應用程序並管理其個人資料中的內容提供了一種能力。移動應用程序對我們所有的用戶具有相似的功能,唯一不同的是它的內容。所以,當一個人來我們的網絡服務中創建一個移動應用程序,然後他添加一些新聞,照片等 - 他的移動應用程序應該只顯示他的新聞和照片,另一個人將擁有自己的移動應用程序與他自己的新聞和照片。識別來自JS的Phonegap移動應用程序

要獲取特定應用程序的內容,我們有唯一的API KEY,使用此API KEY移動應用程序將向我們的API發出請求以獲取唯一內容。

但主要問題是,我們不知道如何在移動應用程序中嵌入此API KEY。

這裏的情況是:

    我們使用PhoneGap的創建移動應用程序
  • ,原來的代碼是HTML + JS。爲了構建應用程序,我們使用Phonegap Build API,這需要從Github存儲庫或ZIP存檔提供JS應用程序。唯一不同的是內容(HTML + JS代碼庫對於每個用戶應用程序都是相同的),我們決定爲所有用戶應用程序使用單個Github存儲庫。此外,維護一個存儲庫比多個存儲庫更容易
  • 我們使用Phonegap Build API爲用戶自動創建移動應用程序。因此,當用戶按下「創建」時 - PhoneGap移動應用程序正在使用Github存儲庫代碼創建。 Phonegap Build API的'create'方法允許設置應用程序的標題,描述,版本,軟件包等。所以每個應用程序都有一些自定義設置。這些設置可以在應用程序構建發生前後進行配置,因此我們可以更改標題或版本或包。

在這種情況下,JS代碼在每個應用程序中都是相同的,我們無法硬編碼JS代碼中的唯一API密鑰以進行API調用。我們可以使用這些可配置的選項(標題,描述等),最好的是「包」,我們可以在其中設置唯一的應用程序標識符(例如「com.application.user1app」),但問題是我們可以'在應用程序構建完成後直接在設備上使用JS。我們已經找到了一些定製的phonegap插件,它們能夠在JS內部獲得應用程序版本或應用程序名稱,但它們已經過時或不再受到支持,Phonegap默認插件也沒有這個功能。由於我們不是原生的移動開發人員,所以編寫自定義插件是一個問題(或者您知道phonegap 3.1.0的任何插件會返回應用程序的軟件包名稱,這將有很大幫助)

問題是:您認爲,有沒有其他方法可以從構建應用程序的JS中識別具體用戶的應用程序在運行?確定移動應用程序應該在哪裏進行API調用? (如果我們不能硬編碼API KEY,並且沒有插件)。

我們的計劃並不嚴格,所以如果不存在任何其他方法,我們會要求一個自定義插件或修改應用程序創建過程的方案。 謝謝。

+0

你爲什麼不使用設備UUID,而不是一個API密鑰的?你可以爲每個設備獲得獨特的內容。如果你真的想使用API​​密鑰,它可以在第一次連接時發送到設備並存儲在本地存儲中。 – QuickFix

+0

@QuickFix,一個應用程序可以安裝在多個設備上,我們不需要識別設備,而是識別設備上運行的應用程序。一個應用程序適用於一個網站用戶,而不是一個設備。如果我們有很多用戶應用程序,我們想知道什麼應用程序向API發出請求,有關設備的信息不會提供此信息。要在第一次連接時向設備發送API密鑰,我們應該知道應用程序正在請求它,以獲取該應用程序的API密鑰。 –

回答

0

感謝@ spezzino和@codevision,我現在使用的解決方案有點像你的混合。 作爲移動應用構建(PhoneGap的)源代碼存儲在GitHub上,我帶着行動的順序如下:

1)當請求新的應用程序,client.json正在創建(使用GitHub的API)與以下內容:

{ "api-key": "applicationapikeygoeshere" } 

存儲庫現在將提交client.json文件。

2)構建請求發送到Phonegap Build API,它使用來自存儲庫的代碼。現在回購包含來自最新提交的client.json,所以應用程序也會擁有它。

3)成功完成Phonegap build client.json正從存儲庫中刪除(使用GitHub API)後,存儲庫達到初始狀態,我們將能夠使用此存儲庫構建下一個應用程序而不會發生衝突。

4)然後在移動應用程序client.json是通過獲取和requirejs解析,使用API​​密鑰

也許這不是很靈活和可擴展的,但我的問題在最短的和非常痛苦的解決方案,沒有爲每個應用程序使用額外的服務器進行構建或存儲庫。

順便說一句,作爲一箇中間步驟(2.5),我們正在創建一個參考(標籤)特定的提交,當上傳配置(再次,使用GitHub API)。所以在GutHub上,我們可以快速訪問所有版本。

GitHub API to create/delete files

GitHub API to create a reference to commit

1

如果修改了config.xml文件構建之前(包括包名和標題),你可以把一個apiKey那裏,然後用這個方法

$.get("config.xml", function(data){ 
    alert($(data).find('widget').attr('apiKey')); 
}); 


<widget id="com.example.hello" version="1.0.0" apiKey="API_KEY_HERE"> 
    <name>HelloWorld</name> 
    <description> 
     A sample Apache Cordova application that responds to the deviceready event. 
    </description> 
</widget> 
閱讀使用jQuery
+0

我也有過這樣的想法,並且在你的回答後現在已經測試過了。似乎這個用於構建的config.xml在構建之後不會被存儲。我已經下載了針對android的已編譯的* .apk應用程序,提取的文件和我發現的唯一config.xml是「/res/xml/config.xml」,但我無法通過AJAX訪問它。另外,我的應用程序包ID爲「com.phonegap.hello-world」,但是當我通過這些提取的文件搜索單詞「world」時,它什麼也沒給。搜索自定義的「apiKey」屬性也失敗了。 –

2

我會建議你將所有客戶特定的配置選項保存在單獨的JS文件中,我們將其命名爲client.js。 該文件將作爲您的構建過程的一部分生成,並且您可以將其與其他移動應用程序源代碼放在ZIP文件中。

client.js

var clientSettings = { 
    apiId: "API-ID", 
    apiSecret: "Your Secret", 
} 

client.js使用

if (clientSettings !== undefined) { 
    // Your mobile specific code goes here, take API keys, version, platform etc. 
    // what ether you put in client.js could be accessed from here 
} else { 
    // We are running from the browser. Go different path and use other API 
} 

,作爲預防措施,我會建議增加client.js到的.gitignore

+0

由於Phonegap構建服務對許多託管私有應用程序有限制,因此我們不得不拒絕使用ZIP歸檔(僅適用於私人應用程序),這不是我們處理歸檔的最佳解決方案。因此,我們需要修改每個將要構建的應用程序的client.js,或者使用自定義client.js爲每個應用程序提供github回購,這兩種方式似乎都不是我們的最佳解決方案 –

+0

順便說一下,我們使用Grunt構建JS項目,因此可以創建自定義的client.js,但我們不希望將其引入用戶應用程序構建過程中,因爲它會更復雜 - 使用grunt構建JS應用程序的額外服務器,爲該應用程序創建自己的存儲庫,然後才能執行我們現在擁有的操作。它需要更多的步驟來完成,現在我們只處理Github回購,而不關心JS部分 –

+0

您可以從www /文件夾根目錄中的config.xml文件中獲取平臺的值,如spezzino所述。在Cordova 3.3中,這個文件絕對適用於Android和iOS。 – codevision

相關問題