转载:http://www.jianshu.com/p/6167b9ce7af8

有朋友在做类似iTool的功能,跟我聊起来,这几天闲,就写了一个demo,不是正经做这个,还很粗略,具体干货诸位等这位朋友自己发文吧。

DEMO

https://github.com/liulishuo/testAppList

思路

iOS9白名单的上限是50个,如果想绕过这个限制,扫描系统中所有app的状态,只有使用私有API,需要用到的类有两个:LSApplicationWorkspace、LSApplicationProxy,知道类的名字我们就可以依靠runtime得到这个类,以及这个类的所有方法,OC的方法望文生义,接下来就可以慢慢尝试。

实现

  • 得到LSApplicationWorkspace、LSApplicationProxy
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
Class LSApplicationProxy_class = object_getClass(@"LSApplicationProxy");
  • 得到类的所有方法与成员变量(编程小翁)

    //获取不到成员变量
    int count = 0;
    Ivar *members = class_copyIvarList([LSApplicationProxy_class class], &count);
    for (int i = 0 ; i < count; i++) {
    Ivar var = members[i];
    const char *memberName = ivar_getName(var);
    const char *memberType = ivar_getTypeEncoding(var);
    NSLog(@"%s: %s",memberType,memberName);
    } NSLog(@"count: %d",count);
    //获取不到有用的方法
    count = 0;
    Method *memberMethods = class_copyMethodList(LSApplicationProxy_class, &count);
    for (int i = 0; i < count; i++) {
    SEL name = method_getName(memberMethods[i]);
    NSString *methodName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];
    NSLog(@"member method:%@", methodName);
    } NSLog(@"count: %d",count);

    因为函数class_copyIvarList、class_copyMethodList有时不能返回有用的结果,所以我们使用class-dump(有朋友反映xcode7的库导不出来,大家用源码自己build一个吧),导出类的头文件。
    导出MobileCoreServices.framework的所有头文件:

    class-dump -H /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/MobileCoreServices.framework  -o /Users/credit/Desktop/header004

    -o后面是输出路径 改成你需要的。

MobileCoreServices.framework的所有头文件

LSApplicationProxy

LSApplicationWorkspace
  • 得到app列表

虽然没有注释,但是我们可以猜到这个方法应该可以得到app列表

- (id)allApplications;

但是他是实例方法,我们先要拿到一个LSApplicationWorkspace实例

+ (id)defaultWorkspace;

代码如下

NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
NSArray *appList = [workspace performSelector:@selector(allApplications)];
  • 遍历app列表
    applist里的每一个元素都是LSApplicationProxy 比对其头文件,把对应的属性打印出来研究,
    属性略多,不想自己写的朋友,请看我的demo

    遍历数组

YY

微信

注意groupContainers数组的内容,我们可以拿到group id,可不可以拿到公共存储区的数据呢?

 NSUserDefaults *share = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.tencent.xin"];
NSLog(@"%@",share.dictionaryRepresentation);

然而并没有,那有没有共享数据的目录呢?

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.tencent.xin"];

返回值为nil

app不在group.com.tencent.xin这个组内,咱的冒牌货强写是无效的,因为这个标识符已经被正品占用了。

App Groups

还有什么好玩的? 试试这个

[workspace performSelector:@selector(uninstallApplication:withOptions:) withObject:@"XXX" withObject:nil];

workspace 是LSApplicationWorkspace实例,@"XXX"这里填你获取到的applicationIdentifier

模拟器可以正常卸载app,真机不行。
更多API,大家可以自己尝试一下。

文/cocoa(简书作者)
原文链接:http://www.jianshu.com/p/6167b9ce7af8
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS-私有API与runtime的更多相关文章

  1. class-dump获取iOS私有api

    转自:http://blog.csdn.net/sunyuanyang625/article/details/41440167 获取各类iOS私有api 安装工具class-dump 资源地址http ...

  2. iOS 私有API调用

    最近自己在做一个小程序,想实现一个一键设置手机壁纸的功能.但在iOS公开的API里找不到相关的方法,只能从私有API入手. 网上有不少教程,不过都不是很详细.从google和https://stack ...

  3. (iOS)私有API的使用(原创)

    最近在做企业级程序,需要搞设备的udid等信息,但是ios7把udid私有化了,不公开使用.所以研究了一下ios的私有api. 调查了一下文章,发现这方面的文章不多,国内更是不全,高手们都懒得写基础教 ...

  4. IOS私有API的使用(转)

    最近在做企业级程序,需要搞设备的udid等信息,但是ios7把udid私有化了,不公开使用.所以研究了一下ios的私有api.   调查了一下文章,发现这方面的文章不多,国内更是不全,高手们都懒得写基 ...

  5. iOS私有api检测工具使用

    背景:这两天提审了一款新的APP,由于项目中使用了老版本的TZImagePicker中访问了私有API,导致提审失败. 预审经验分享: https://baijiahao.baidu.com/s?id ...

  6. //暴力打开某个APP iOS 私有API LSApplicationWorkspace

    //暴力打开某个APP = .= 如果可以打开.直接打开不解释 +(BOOL)isOpenApp:(NSString*)appIdentifierName { Class LSApplicationW ...

  7. ios中通过调试来使用私有api

    转自:http://blog.csdn.net/cubepeng/article/details/11284173 OS不允许使用ios私有api,使用私有api可以获得意想不到的效果 ,同时使用私有 ...

  8. 坑爹的私有API

    iOS私有API扫描工作总结 背景 苹果提供的iOS开发框架分PrivateFramework和Framework,PrivateFramework下的库是绝对不允许在提交的iOS应用中使用的,只允许 ...

  9. Apple 如何知道你使用了私有API

    大约有三种方式 otool -L这个工具可以清晰的列出你链接所有的库 像IO.Kit是不允许使用的 nm -u 这个工具可以清晰的列出你所有链接符号如 C方法 OC方法 检查所有Selecter的字符 ...

  10. 怎么获取iOS的私有API

    前言 作为iOS开发人员,相信大多数伙伴都对怎么获取iOS的私有API很有兴趣,最近通过查找资料,总结了以下三种方法,希望对你有用. 第一种(class-dump) 不得不说这是一个很棒的工具,安装和 ...

随机推荐

  1. SQL Server 跨网段(跨机房)复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...

  2. jQuery 2.0.3 源码分析 样式操作

    根据API分类 CSS addClass() jQuery.cssHooks .hasClass() .removeClass() .toggleClass() .addClass() 对元素的样式操 ...

  3. tn文本分析语言(三):高级语法

    标签(空格分隔): 未分类 高级操作 1.脚本表达式 用双引号包含的脚本被称为脚本表达式,目前支持嵌入Python. 脚本表达式只能在顺序表达式中使用.代码可以在三个位置存在: |位置|功能|例子| ...

  4. 在ASP.NET Web API项目中使用Hangfire实现后台任务处理

    当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送.由于推送这个具体功能,我们采用了第三方的服务.而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现 ...

  5. PHP中有关正则表达式的函数集锦

    之前学正则表达式的目的是想从网上抓取点小说啊,文档啊,还有获取相应的视频连接然后批量下载.当时初学PHP根本不知道PHP有专门抓包的工具,就像Simple_html_dom.php(在我的其他博文中有 ...

  6. JavaWeb:EL表达式

    JavaWeb:EL表达式 说明 1.Expression Language语言,一种用于JSP文件中的数据访问的语言. 2.能够简化JSP文件中该数据访问的代码,可用来替代传统的基于<%= % ...

  7. Oracle配置数据库诊断

    环境:RHEL 6.4 + Oracle 11.2.0.4 1. 设置ADR 2. 使用Support Workbench 3. 恢复块介质 Reference 1. 设置ADR 1.1 查看v$di ...

  8. 微信小程序小技巧系列《二》show内容展示,上传文件编码问题

    作者:gou-tian 来自:github show内容展示 尝试用微信小程序的template组件实现.同时,尝试页面间转跳时传参,在目标页面引入模板文件实现 写的更少,做的更多 篇幅有限详细代码此 ...

  9. [java] 深入理解内部类: inner-classes

    [java] 深入理解内部类: inner-classes // */ // ]]>   [java] 深入理解内部类: inner-classes Table of Contents 1 简介 ...

  10. MVC中实现加载更多

    需要实现的功能: 数据太多想初次加载部分数据,在底部加上“加载更多”按钮 点击后加载第二页数据(从数据库只取指定页数据)后接在已有数据后面(类似于android中的下拉加载更多) 每次加载时显示“正在 ...