iOS8下代码安装/卸载APP

从我博客搬来的,原文iOS8下代码安装/卸载APP,写上了一些注释。不知道复制过来之后还有没有代码高亮,没有的话,直接看原文会好一点。当然,需要MobileInstallation这个Framework

#import <Foundation/Foundation.h>
#import <spawn.h>
#import <sys/wait.h>
#import <UIKit/UIKit.h>
/*!
*  @brief  Mobile Installation 的回调定义
*/
typedef void (*MobileInstallationCallback)(CFDictionaryRef information);
/*!
*  @brief  Mobile Installation 安装App (8.0)
*  @param  bundlePath          IPA文件路径
*  @param  parameters          unknown
*  @param  unknown1            unknown
*  @param  unknown2            unknown
*/
extern int MobileInstallationInstallForLaunchServices(CFStringRef bundlePath, CFDictionaryRef parameters, void *unknown1, void *unknown2) NS_AVAILABLE_IOS(8_0);
/*!
*  @brief  Mobile Installation 卸载App (8.0)
*  @param  bundleIdentifier    App的Bundle ID
*  @param  parameters          unknown
*  @param  callback            Mobile Installation 的回调
*  @param  unknown             unknown
*/
extern int MobileInstallationUninstallForLaunchServices(CFStringRefbundleIdentifier, CFDictionaryRef parameters, MobileInstallationCallbackcallback, void *unknown) NS_AVAILABLE_IOS(8_0);
/*!
*  @brief  为了稍后使用POSIX SPAWN
*/
extern char **environ;
/*!
*  @brief  更新SpringBoard图标, 依赖uicache
*/
void uicache(void);
void uicache(void){
    posix_spawnattr_t attr;
    posix_spawn_file_actions_t fact;
    pid_t pid;
    char cmd]="uicache";
    char *args[2];
args[0]=cmd;
args[1]=NULL;
    posix_spawnattr_init(&attr);
    posix_spawn_file_actions_init(&fact);
    posix_spawn(&pid,"/usr/bin/uicache",&fact,&attr,args,environ);
    int stat=0;
    waitpid(pid,&stat,0);
}
int main (int argc, const char * argv]){
    @autoreleasepool{
#pragma mark
#pragma mark - Install
        CFStringRef path = CFStringCreateWithCString(kCFAllocatorDefault, "/PATH/TO/IPA/FILE", kCFStringEncodingUTF8);
        MobileInstallationInstallForLaunchServices(path, NULL, NULL, NULL);
#pragma mark
#pragma mark - Uninstall
        CFStringRef identifier = CFStringCreateWithCString(kCFAllocatorDefault, "APP.BUNDLE.ID", kCFStringEncodingUTF8);
        if (identifier != NULL) {
            MobileInstallationUninstallForLaunchServices(identifier, NULL, NULL, NULL);
            CFRelease(identifier);
        }
#pragma mark
#pragma mark - UICache
        uicache();
    }
    return 0;
}
2 个赞

这个必须越狱吗

不错不错,向楼主学习。

:victory:实测可以用多谢分享!

是直接用这段代码替换,原始的main文件内容吗,我的能运行,bundle ID也换了。但是不能卸载,求指教

楼主我在iOS8下用您的代码替换了原来的main,更换了bundle ID,把安装的代码注释,运行不能卸载bundle ID指定的应用,怎么破

楼主我是这样操作的:
1、原始的main文件,全部注释掉,把你的源代码完整的粘进去。
2、把似有的API的库文件从系统中找到,然后在xcode中导入。
3、将CFStringRef path = CFStringCreateWithCString(kCFAllocatorDefault, “/PATH/TO/IPA/FILE”, kCFStringEncodingUTF8);
MobileInstallationInstallForLaunchServices(path, NULL, NULL, NULL);这两行与安装有关的代码注释。
4、把CFStringRef identifier = CFStringCreateWithCString(kCFAllocatorDefault, “bundle”, kCFStringEncodingUTF8);换成目标app的bundle ID
5、然后运行在8.0的越狱touch上,正常运行,但是没有任何效果,目标app还好端端的躺在那里

楼主,指导下吧,拜谢

需要签名才行,详见http://bbs.iosre.com/t/ios-entitlements/653

谢楼主的知道,已成功解决,拜谢