是否在其他应用程序中安装iOS应用程序(ipa文件)?

是否在其他应用程序中安装iOS应用程序(ipa文件)?,ios,objective-c,ipa,Ios,Objective C,Ipa,我尝试编写一个应用程序,它可以从web服务器(ipa文件)下载一个应用程序并安装它。有人知道如何安装此ipa文件吗?我可以在应用程序内部使用OTA或使用命令行安装它吗?您可以通过OTA分发来完成此操作,请参阅 可在此处找到plist示例: 请注意,您需要Enterprise Developer程序,或者收集用户的UDID,并将其包含在您的临时资源调配配置文件中。因此,这里提供了一个针对越狱设备的即时解决方案,,它可以从您的应用程序中直接安装任何.ipa文件。您必须采取的步骤是: I.获得根访

我尝试编写一个应用程序,它可以从web服务器(ipa文件)下载一个应用程序并安装它。有人知道如何安装此ipa文件吗?我可以在应用程序内部使用OTA或使用命令行安装它吗?

您可以通过OTA分发来完成此操作,请参阅

可在此处找到plist示例:


请注意,您需要Enterprise Developer程序,或者收集用户的UDID,并将其包含在您的临时资源调配配置文件中。

因此,这里提供了一个针对越狱设备的即时解决方案,,它可以从您的应用程序中直接安装任何
.ipa
文件。您必须采取的步骤是:

I.获得根访问权限。您可以通过调用
setuid(0)来实现这一点
main()
函数。您需要在可执行文件上设置粘性权限位,并使用启动脚本

二,。解压缩
.ipa
文件。是的,没错-IPA只是伪装的ZIP文件。您可以使用开源库来实现这一点

三、 里面将有一个名为
Payload
的目录。实际的应用程序包(我们称之为
MyApp.app
)将驻留在该文件夹中

四、 在文件系统的
/var/mobile/Applications
目录中创建一个目录。这将是要安装的应用程序的容器沙盒。按照约定,此目录的名称应为UUID。例如,您可以为此使用以下代码段:

CFUUIDRef uuidObj = CFUUIDCreate(NULL);
CFStringRef uuid = CFUUIDCreateString(NULL, uuidObj);
CFRelease(uuidObj);

NSString *appPath = [@"/var/mobile/Applications" stringByAppendingPathComponent:(id)uuid];
[fmgr createDirectoryAtPath:appPath withIntermediateDirectories:YES attributes:nil error:NULL];
CFRelease(uuid);
V.通过循环查看
有效负载
目录的内容(在步骤2中获得)来查找应用程序包。将其复制到新创建的沙盒(名称为UUID字符串)。同时复制
iTunesMetadata.plist
iTunesArtwork
文件,以便iTunes为应用程序显示一个漂亮的图标并通知您更新。修复应用程序可执行文件的权限,使其可执行:

NSString *execName = [appInfoPlist objectForKey:@"CFBundleExecutable"];
NSString *execPath = [bundle stringByAppendingPathComponent:execName];
chmod(execPath.UTF8String, 0755);
六、 您需要告诉SpringBoard找到您的应用程序,然后重新加载其已安装的应用程序缓存,以使新安装的应用程序的图标显示在主屏幕上。为此,首先更新MobileInstallation属性列表文件中的应用程序列表。这里的
bundle
变量指的是应用程序bundle的文件系统位置,类似于
/var/mobile/applications/LONG\u UUID\u STRING/MyApp.app

#define kMobileInstallationPlistPath @"/var/mobile/Library/Caches/com.apple.mobile.installation.plist"
NSMutableDictionary *appInfoPlist = [NSMutableDictionary dictionaryWithContentsOfFile:[bundle stringByAppendingPathComponent:@"Info.plist"]];
[appInfoPlist setObject:@"User" forKey:@"ApplicationType"];
[appInfoPlist setObject:bundle forKey:@"Path"];
[appInfoPlist setObject:@{
    @"CFFIXED_USER_HOME" : appPath,
    @"HOME" : appPath,
    @"TMPDIR" : [appPath stringByAppendingPathComponent:@"tmp"]
} forKey:@"EnvironmentVariables"];
[appInfoPlist setObject:appPath forKey:@"Container"];

NSData *data = [NSData dataWithContentsOfFile:kMobileInstallationPlistPath];
NSMutableDictionary *mobileInstallation = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainersAndLeaves format:NULL error:NULL];
NSString *bundleID = [appInfoPlist objectForKey:@"CFBundleIdentifier"];
[[mobileInstallation objectForKey:@"User"] setObject:appInfoPlist forKey:bundleID];
[mobileInstallation writeToFile:kMobileInstallationPlistPath atomically:NO];
然后删除缓存的应用程序信息SpringBoard存储:

remove("/var/mobile/Library/Caches/com.apple.mobile.installation.plist");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-icons");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-icons.plist");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-smallicons");
remove("/var/mobile/Library/Caches/com.apple.springboard-imagecache-smallicons.plist");
remove("/var/mobile/Library/Caches/SpringBoardIconCache");
remove("/var/mobile/Library/Caches/SpringBoardIconCache-small");
remove("/var/mobile/Library/Caches/com.apple.IconsCache");
然后通知SpringBoard重新加载所有应用程序的列表:

Class __LSApplicationWorkspace = objc_getClass("LSApplicationWorkspace");
[(LSApplicationWorkspace *)[__LSApplicationWorkspace defaultWorkspace] invalidateIconCache:nil];
[(LSApplicationWorkspace *)[__LSApplicationWorkspace defaultWorkspace] registerApplication:[NSURL fileURLWithPath:bundle]];
notify_post("com.apple.mobile.application_installed");

你可以在越狱设备上完成。这样的解决方案可以接受吗?是的,可以接受,我怎么做?@QuangHuynh你试过搜索吗?也许你可以寻找试飞。他们为自己的应用程序提供了一个证书,该应用程序可以在OTA设备上安装其他IPA文件。@特洛伊木马我搜索了很多次,但只找到了OTA,或者通过越狱设备中的终端使用iFunbox、iTools…或IPA安装程序控制台安装IPA文件。我可以使用OTA技术而不使用Safari,而是使用objective-C代码吗?可以,只需使用itms服务URL调用UIApplication#openURL即可。下面是一个如何调用URL的示例:最后添加的URL是指向上述plist文件的链接。@Kerni如果我们使用此方法,苹果是否限制了应用程序的数量(100)?此方法不会更改任何配置文件要求和对应用程序进行签名。因此,对于临时配置文件,您仍然只能使用100台设备,只有企业配置文件没有此限制,但只能用于根据许可协议属于您公司的设备。我已尝试通过setuid(0)获取root,但我无法在/var/mobile/applications中创建文件夹,您能帮助我吗?谢谢。@QuangHuynh那么您是否在可执行文件上设置了粘性位并使用了启动shell脚本?没有这些就不行。@H2C03:我怎么能这样做?我是iOS新手,非常感谢。@QuangHuynh这不是iOS特有的,您只需要一个普通的shell脚本和可执行文件上的
chmod 7755
。@DeepikaLalra您应该试试解决方案吗?