最近自己在做一个小程序,想实现一个一键设置手机壁纸的功能。但在iOS公开的API里找不到相关的方法,只能从私有API入手。

网上有不少教程,不过都不是很详细。从google和https://stackoverflow.com能找到比较详细的描述。

想要使用私有API首先需要知道相关API的声明,可以知己搜索,也可以使用class-dump自己搞定。下面说下详细过程。

首先下载class-dump。直接放到usr/local/bin文件夹中就可以使用。

xcode 8.3.2下私有API路径在

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk/System/Library/PrivateFrameworks

直接使用class-dump导出

sudo class-dump -H /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk/System/Library/PrivateFrameworks/UIFoundation.framework -o /Users/xxxx/Desktop/Frameworks

导出后是一堆.h文件。

导出后就是怎么使用的问题了。搜索到不少都说将这些.h封装成framework来使用,然后设置search path 为  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk/System/Library/PrivateFrameworks。

试过之后并不太好用,因为有些类的声明定义在公开的API都是没有的,也可能是我用的不对,有了解的朋友请多指教。

有些头文件可以直接拖入到工程就可以使用了,一般来说是一些category. 更通用的方法是直接自己写一个,然后声明私有API的方法。

具体如下:

#import <UIKit/UIKit.h>

@interface UIFont (Private)

- (_Bool)isVertical;
- (double)_bodyLeading; @end

这样可以直接用UIFont来调用这两个方法了。

还有一种是使用runtime的方式,应该说这是一个更加通用的方法。

下面以设置手机壁纸的例子来讲解(iOS 10以下有效)

直接class-dump photoKit的framework。查看相关的头文件,可以看到 PLWallpaperImageViewController.h 和 PLStaticWallpaperImageViewController.h。

查看相关的方法,可以猜到和设置壁纸有关的几个方法。

- (id)initWithUIImage:(id)arg1;
- (void)setImageAsHomeScreenAndLockScreenClicked:(id)arg1;
- (void)setImageAsLockScreenClicked:(id)arg1;
- (void)setImageAsHomeScreenClicked:(id)arg1;

使用runtime初始化并调用方法

_image = [UIImage imageNamed:@"1.jpg"];

Class class = NSClassFromString(@"PLStaticWallpaperImageViewController");

_wallPaper = [[class alloc] performSelector:NSSelectorFromString(@"initWithUIImage:") withObject:_image];

[_wallPaper setValue:@(YES) forKeyPath:@"allowsEditing"];

[_wallPaper  setValue:@(YES) forKeyPath:@"saveWallpaperData"]; //

[_wallPaper performSelector:NSSelectorFromString(@"setImageAsHomeScreenClicked:") withObject:nil];

//也可以使用
//[_wallPaper performSelector:@selector(setImageAsHomeScreenClicked:) withObject:nil];

这样就完成了壁纸的设置 。

iOS 私有API调用的更多相关文章

  1. class-dump获取iOS私有api

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

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

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

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

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

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

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

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

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

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

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

  7. 坑爹的私有API

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

  8. iOS - APP审核Guideline 2.5.1被拒,使用了私有API

    最近iOS 审核被拒,说是使用了私有API:com.apple.springboard.lockcomplete 具体内容如下: 发件人 Apple . Performance: Software R ...

  9. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

随机推荐

  1. Webpack的加载器

    一.什么是加载器(loaders)loaders 用于转换应用程序的资源文件,他们是运行在nodejs下的函数 使用参数来获取一个资源的来源并且返回一个新的来源(资源的位置),例如:你可以使用load ...

  2. 理解HDFS

    综述 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区并存储到若干台单独的计算机上.HDFS是hadoop的主要分布式存储系统,一个HDFS集群主要包括NameNode用来管理 ...

  3. 多线程&定时器Timer&同步&线程通信&ThreadLocal

    1.多线程 线程状态分为:新建状态.就绪状态.运行状态.阻塞状态.死亡状态 对象等待池的阻塞状态:运行状态执行了wait方法 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的 ...

  4. nginx日志切割配置

    编辑虚拟主机文件 /etc/nginx/conf.d/default.conf  在server段添加如下配置 if ($time_iso8601 ~ "^(\d{4})-(\d{2})-( ...

  5. Linux中SVN的备份与恢复

    linux中SVN备份有三种方式 1.svnadmin dump 是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供版本恢复机制. 缺点是版本数过大,增长到数万以上,那么dump ...

  6. Spring MVC核心技术

    目录 异常处理 类型转换器 数据验证 文件上传与下载 拦截器 异常处理 Spring MVC中, 系统的DAO, Service, Controller层出现异常, 均通过throw Exceptio ...

  7. Java基础学习笔记八 Java基础语法之接口和多态

    接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  8. Leetcode 17.——Letter Combinations of a Phone Number

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  9. beat冲刺计划安排

    1. 团队成员 组长:郭晓迪 组员:钟平辉 柳政宇 徐航 曾瑞 2. 主要计划安排如下: 3. 详细日程任务安排

  10. Linux进程调度分析

    原文:http://www.2cto.com/os/201112/113229.html 操作系统要实现多进程,进程调度必不可少. 有人说,进程调度是操作系统中最为重要的一个部分.我觉得这种说法说得太 ...