2013-07-17 32 views
3

我有一個.ipa文件(iOS應用程序),我讓用戶安裝即席(使用企業帳戶在專用服務器上進行無線傳輸)。動態更改服務器上的.ipa文件

挑戰在於應用程序在應用程序與應用程序之間有所區別。他們在應用程序內使用不同的徽標和不同的網址。

是否有可能在用戶下載之前動態更改服務器上的.ipa文件?

進一步說明:

我要強調,我不能爲每個應用程序的.ipa文件。我必須能夠更改開始屏幕,徽標併爲單個.ipa文件設置url變量。

我換句話說,我需要在每次有人想下載服務器時動態更改服務器上的.ipa文件。

我很想有:

我很想有關於如何做到這一點的Heroku一個或亞馬遜服務器上的例子/指南。沒有什麼花哨。基本上只需更改info.plist中的一個變量,然後再次對它進行編碼。

+1

作爲一名企業傢伙讀到這個問題後,我頭腦中首先想到的是:爲什麼?你可以隨意解釋你的後端情況嗎? – Dan

回答

7

正如已經指出,你可以簡單地解壓縮和重新壓縮創建自己的ipa。

您還需要添加一些不需要代碼簽名的資源。

最好的辦法是在ipa中創建一個新的(空的)目錄。目錄本身沒有簽名,但在設備上解壓,可以通過您的代碼進行檢測。

換言之:包含簽名的CodeResources文件在添加空目錄時不會更改。

一個簡單的測試,我只是做了,是要建立一個文件夾提及一個名爲「額外」的文件夾,裏面的內容都是使用百分號編碼解碼並顯示在彈出:

NSString *path = [[NSBundle mainBundle] pathForResource:@"extra" ofType:@""]; 
NSDirectoryEnumerator *direnum = [[NSFileManager defaultManager] enumeratorAtPath:path]; 
NSString *f; 
while (f = [direnum nextObject]) 
{ 
    NSString *decoded = [f stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:nil message:decoded delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease]; 
    [alert show]; 
} 

這可以用來發送潛意識消息給你的代碼。編碼百分比可以讓你放入任何你喜歡的角色。我測試了多達100個字符的文件名長度。

您還需要一些代碼來動態地將空的目錄下的Payload/yourapp.app/extra/添加到ipa,百分比編碼消息作爲它的文件名,例如, Payload/yourapp.app/extra/http%3A%2F%2Fstackoverflow.com%2F

更新:例如shell命令將目錄添加到IPA:

$ mkdir -p Payload/myapp.app/extra/http%3A%2F%2Fstackoverflow.com%2F 
$ zip -r myapp.ipa Payload/ 
updating: Payload/ (stored 0%) 
updating: Payload/myapp.app/ (stored 0%) 
updating: Payload/myapp.app/extra/ (stored 0%) 
adding: Payload/myapp.app/extra/http%3A%2F%2Fstackoverflow.com%2F/ (stored 0%) 
$ rm -r Payload/ 

你當然需要每次創建IPA的全新副本,或網址,將堆積在裏面的IPA。

+0

這可能是一個解決方案。所以你建議簡單地將文件夾命名爲我想改變的URL的名稱?它是否必須是一個文件夾?有一件事我還不清楚,就是如何在我的實際服務器(Heroku或Amazon S3)上壓縮/解壓縮我的.ipa文件。 –

+0

確實,是的,它已經是一個文件夾,爲了避免代碼簽名。我已經爲答案添加了一個小型shell腳本,顯示瞭如何將一個文件夾添加到zip歸檔文件中。 – mvds

+0

非常好。這可能是一個真正的解決方案。我也可以替換我的一些資產嗎?我有一個標誌(圖片),我想改變。或者是否會要求我再次對其進行代碼簽名?如果Payload位於Heroku或Amazon S3服務器上,您將如何運行這樣的腳本? –

1

是的,使用PHP,Python,Ruby或任何其他服務器端語言,您可以製作處理.ipa和.plist請求的路由。當這些進來你的服務器端程序可以確定哪個IPA和plist爲該URL提供服務。

將所有IPA及其信息存儲在數據庫中可能很有用,這將允許您的腳本在運行時生成完整的plist。

+0

非常好的答案。我明白你要去哪裏。雖然這不是一個解決方案。我試着在上面解釋一下。 –

+0

@HolgerEdwardWardlowSindbæk啊我看到 - 不,我看不出服務器可以有條件地編譯多個ios應用程序。也許可選功能是運行時? –

+0

主要功能是運行時(它基本上是一個鏈接,從應用程序更改爲應用程序),但我不知道如何動態更改此鏈接。如果我能夠以某種方式動態設置鏈接,那將會很棒。你能看到這樣做的可能嗎? –

3

我認爲你可以使用Jenkins建立這種類型的requirement.Just需要改變你的資源之前構建action.And它會產生新的

標誌IPA,
飛濺,
App_Identifier,
App_DisplayName,
即使您可以更改產品名稱。

徽標和飛濺可以由構建操作執行前的一些PHP腳本替換。

和App_Identifier,App_DisplayName,產品名稱,你可以使用

Config.xcconfig文件

對於config.xcconfig看看this link

對於防爆。請參閱我的Config.xcconfig文件信息

appDisplayName=My App 
appIdentifier=org.myComp.myApp 
productName=katWalk 

我使用插入值的變量。

對於產品名稱更改轉到 - >構建設置 - >包裝 - >產品

,並把與括號其次是美元符號($)作爲考勤記錄

enter image description here

與變量改變App_Identifier和app_DisplayName圍棋 - >程序 - Info.plist文件並更改變量名稱

enter image description here

現在,您需要在構建之前在config.xcconfig文件中更改該變量值,並且您的應用程序將準備好新徽標,Splash,標識符,顯示名稱和新產品名稱。

也許這將幫助你

+0

聽起來像一個選項。雖然我不確定如何與詹金斯做到這一點。我對詹金斯不是很熟悉。請記住,這一切都必須在線自動完成。所以用戶案例是有人進入mywebsite.com/their_personal_site/iPhone_app並點擊「下載」。在那個時候(或者當個人網站被製作時),新的應用程序應該準備好去。 –

+0

是的,我做了一個這樣的使用jenkins構建和改變我上面提到的以下事情。用戶上傳他的飛濺和標誌,並通過PHP或任何其他腳本,我們替換這些文件和重建與新的標識符,產品名稱,標識,飛濺和顯示名稱,並使用戶可以下載ipa。 – Warewolf

相關問題