在iOS

时间:2016-08-20 04:39:53

标签: ios objective-c objective-c-runtime

最近我想到了在部署后改变方法实现的想法

当我搜索关于目标c运行时的所有内容时,了解了方法调配方法交换实现等。

我知道有可能https://rollout.io/ 但我的想法是如何自己做简单的Hot Patching。

我的想法是使用webservice调用注入代码。 Web服务应该替代特定方法。 该字符串必须转换为可执行代码

我想知道的是...... 如何在现有的企业应用方法中注入代码。

对于前: 在目标c

中考虑这种方法
-(void)fetchTheResult{
     // some code lines
}

部署后,我想将方法​​实现更改为

-(void)fetchTheresult{

     NSLog(@"test log");
     //some Code lines
     //some more lines

}

请指导我实现这个目标的方法

2 个答案:

答案 0 :(得分:0)

这是一个很大的问题,你需要做一些研究来找出答案。这里有一些你可以研究的事情:

  • 首先您引用了Rollout,您可以遵循相同的想法并将更新作为JavaScript发送。你需要学习如何调用JavaScript,swizzle方法,以及可能动态添加方法 - 稍后会详细介绍。

    • 您可以调查的另一种方法是动态库加载 - 您可以在应用程序在运行时加载的库中打开并调用代码。因此,您可以将更新作为库发送。您仍然需要进行方法调配并可能动态添加方法......

    • 除了方法调配,您可能会发现需要动态添加方法 - 例如所以你有东西可以交换现有的实现。找到如何做到这一点的好地方是Mike Ash关于KVO的着作 - 去DuckDuckGo(或谷歌)

HTH

答案 1 :(得分:-1)

这并不像你想象的那么容易,至少在Objective C和其他类似的编译语言中。这种运行时对代码的更改只能在Javascript等解释语言中实现。

基本问题是,不允许应用程序自行更改可执行文件。 iOS和Android上的应用程序在沙盒环境中运行,因此只能访问有限的磁盘位置。

此外,在编译代码之后,代码不知道代码的哪一部分被转换并以机器语言存储。您必须了解编译器的基础知识才能理解这一点。在此过程中,代码会发生重大优化。