Ios 动态更改服务器上的.ipa文件

Ios 动态更改服务器上的.ipa文件,ios,objective-c,iphone,Ios,Objective C,Iphone,我有一个.ipa文件(iOS应用程序),我允许用户临时安装(使用企业帐户在私有服务器上通过无线方式) 挑战在于,应用程序在不同的应用程序中有所不同。他们在应用程序中使用不同的徽标和url 在人们下载之前,是否可以动态更改服务器上的.ipa文件 进一步解释: $ mkdir -p Payload/myapp.app/extra/http%3A%2F%2Fstackoverflow.com%2F $ zip -r myapp.ipa Payload/ updating: Payload/ (stor

我有一个.ipa文件(iOS应用程序),我允许用户临时安装(使用企业帐户在私有服务器上通过无线方式)

挑战在于,应用程序在不同的应用程序中有所不同。他们在应用程序中使用不同的徽标和url

在人们下载之前,是否可以动态更改服务器上的.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文件的url变量

换句话说,每当有人想要下载.ipa文件时,我需要动态地更改服务器上的.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/

我希望有一个示例/指南,说明如何在heroku或amazon服务器上执行此操作。没什么特别的。基本上只需在info.plist中更改一个变量,然后再对其进行代码设计。

是的,使用PHP、Python、Ruby或任何其他服务器端语言,您可以创建一个处理.ipa和.plist请求的路由。当这些信息出现在服务器端程序中时,可以确定为该URL提供哪个ipa和plist

将所有ipa及其信息存储在数据库中可能很有用,这将允许您的脚本在运行时生成完整的plist。

我认为您可以使用Build来满足此类需求。只需在Build操作之前更改您的资源。它将使用新的

标志,
飞溅,
应用程序标识符,
应用程序显示名称,
甚至产品名称也可以更改

在执行构建操作之前,可以用一些php脚本替换徽标和splash

对于App\u标识符,App\u DisplayName,您可以使用的产品名称

Config.xcconfig文件

有关config.xcconfig,请参见

有关示例,请参见my Config.xcconfig文件信息

appDisplayName=My App
appIdentifier=org.myComp.myApp
productName=katWalk
我取插入值的变量

要更改产品名称,请转到->构建设置->打包->产品

将变量名与大括号和美元($)符号放在一起,如下所示

要更改App_标识符和App_DisplayName,请转到->App-Info.plist文件并将变量名称更改为

现在,您需要在构建之前更改config.xcconfig文件中的变量值,您的应用程序将准备好新徽标、飞溅、标识符、显示名称和新产品名称。


这可能会帮助您

正如前面所述,您只需重新解压缩即可创建自己的ipa

您还需要添加一些不需要代码签名的资源

最好是在ipa中创建一个新的(空)目录。目录本身没有签名,但在设备上提取,并且可以被代码检测到

换句话说:添加空目录时,包含签名的
CodeResources
文件不会更改

我刚刚做的一个简单测试是创建一个文件夹引用一个名为“extra”的文件夹,该文件夹的内容使用百分比编码解码并显示在弹出窗口中:

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

更新:将目录添加到ipa的shell命令示例:

$ 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副本,否则URL将堆积在ipa内部的
/extra/
下。

回答得很好。我知道你要去哪里。但这并不是一个很好的解决方案。我试着在上面解释得更好一些。@Holgeredawardlowsindbæk啊,我明白了-不,我明白服务器不可能有条件地编译多个ios应用程序。也许可选功能是运行时?主要功能是运行时(它基本上是一个从一个应用到另一个应用的链接),但我不知道如何动态更改此链接。如果我能以某种方式动态设置链接,那就太棒了。你能看到这样做的可能性吗?那可能是一个解决办法。所以你建议简单地命名文件夹,我要更改的url的名称?它必须是一个文件夹吗?有一件事我还不清楚,那就是如何在我的实际服务器(Heroku或Amazon S3)上压缩/解压我的.ipa。没错,它必须是一个文件夹,以避免代码签名。我在答案中添加了一个小的shell脚本,展示了如何将文件夹添加到zip存档。非常好。这可能是一个真正的解决方案。我还可以替换我的一些资产吗?我有一个标志(图像),我想改变。还是需要我重新编码签名?如果负载在Heroku或Amazon S3服务器上,您将如何运行这样的脚本?我不知道Heroku或Amazon,这是一个不同的主题,适合单独的问题。我认为,如果不重新进行代码签名,就不可能替换/删除/添加资产。你可以用目录名对图像的实际数据进行编码,但这需要相当繁琐的编程。我已经用iOS 7.1对它进行了测试,它仍然在工作。听起来像是一个选项。不过我不知道怎么和詹金斯一起做。我对詹金斯不太熟悉。记住,所有这些都必须在线自动完成。因此,用户案例是有人进入mywebsite.com/they_personal_site/iPhone_应用程序并单击“下载”。在那一刻(或当个人网站制作完成时),新的应用程序应该准备好了。是的,我使用jenkins build制作了一个类似的应用程序,并更改了我上面提到的以下内容。用户上传了他的splash和logo,并通过php或其他我们需要的脚本