Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
190 lines (189 loc) · 36.5 KB
/
Copy pathindex.html
File metadata and controls
190 lines (189 loc) · 36.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>SilverFruity</title>
<meta name="generator" content="VuePress 1.8.2">
<link rel="icon" href="/favicon.ico">
<meta name="description" content="">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<meta name="robots" content="all">
<meta name="author" content="SilverFruity">
<meta name="keywords" content="SilverFruity,iOS开发,iOS热更新,iOS热修复,OCRunner,OCRunner热修复,OCRunner热更新,iOS13 URL Scheme,iOS libffi,iOS圆角阴影边框,SFImageMaker">
<link rel="preload" href="/assets/css/0.styles.76394d41.css" as="style"><link rel="preload" href="/assets/js/app.642360de.js" as="script"><link rel="preload" href="/assets/js/3.96dd975e.js" as="script"><link rel="preload" href="/assets/js/1.a1bdfc9f.js" as="script"><link rel="preload" href="/assets/js/18.a87dbe2d.js" as="script"><link rel="prefetch" href="/assets/js/10.25bf899d.js"><link rel="prefetch" href="/assets/js/11.157d52a3.js"><link rel="prefetch" href="/assets/js/12.8a8b1872.js"><link rel="prefetch" href="/assets/js/13.1dae41fb.js"><link rel="prefetch" href="/assets/js/14.e4e4de80.js"><link rel="prefetch" href="/assets/js/15.c4b76f8c.js"><link rel="prefetch" href="/assets/js/16.011f3196.js"><link rel="prefetch" href="/assets/js/17.6311839b.js"><link rel="prefetch" href="/assets/js/19.9d3706b6.js"><link rel="prefetch" href="/assets/js/20.b24ad8a1.js"><link rel="prefetch" href="/assets/js/21.929dacda.js"><link rel="prefetch" href="/assets/js/22.220fde3c.js"><link rel="prefetch" href="/assets/js/23.0b29fee2.js"><link rel="prefetch" href="/assets/js/4.75bd731a.js"><link rel="prefetch" href="/assets/js/5.9f13c650.js"><link rel="prefetch" href="/assets/js/6.6d7a0f1d.js"><link rel="prefetch" href="/assets/js/7.e4f440fa.js"><link rel="prefetch" href="/assets/js/8.428a0490.js"><link rel="prefetch" href="/assets/js/9.c59f4e54.js">
<link rel="stylesheet" href="/assets/css/0.styles.76394d41.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container no-sidebar" data-v-1156296a><div data-v-1156296a><div id="loader-wrapper" class="loading-wrapper" data-v-d48f4d20 data-v-1156296a data-v-1156296a><div class="loader-main" data-v-d48f4d20><div data-v-d48f4d20></div><div data-v-d48f4d20></div><div data-v-d48f4d20></div><div data-v-d48f4d20></div></div> <h3 class="title" data-v-d48f4d20>SilverFruity</h3> <p class="description" data-v-d48f4d20></p></div> <div class="password-shadow password-wrapper-out" style="display:none;" data-v-4e82dffc data-v-1156296a data-v-1156296a><h3 class="title" data-v-4e82dffc data-v-4e82dffc>SilverFruity</h3> <p class="description" data-v-4e82dffc data-v-4e82dffc></p> <label id="box" class="inputBox" data-v-4e82dffc data-v-4e82dffc><input type="password" value="" data-v-4e82dffc> <span data-v-4e82dffc>Konck! Knock!</span> <button data-v-4e82dffc>OK</button></label> <div class="footer" data-v-4e82dffc data-v-4e82dffc><span data-v-4e82dffc><i class="iconfont reco-theme" data-v-4e82dffc></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-4e82dffc>vuePress-theme-reco</a></span> <span data-v-4e82dffc><i class="iconfont reco-copyright" data-v-4e82dffc></i> <a data-v-4e82dffc><span data-v-4e82dffc>SilverFruity</span>
<span data-v-4e82dffc>2017 - </span>
2021
</a></span></div></div> <div class="hide" data-v-1156296a><header class="navbar" data-v-1156296a><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" aria-current="page" class="home-link router-link-exact-active router-link-active"><img src="/logo.png" alt="SilverFruity" class="logo"> <span class="site-name">SilverFruity</span></a> <div class="links"><div class="color-picker"><a class="color-button"><i class="iconfont reco-color"></i></a> <div class="color-picker-menu" style="display:none;"><div class="mode-options"><h4 class="title">Choose mode</h4> <ul class="color-mode-options"><li class="dark">dark</li><li class="auto active">auto</li><li class="light">light</li></ul></div></div></div> <div class="search-box"><i class="iconfont reco-search"></i> <input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" aria-current="page" class="nav-link router-link-exact-active router-link-active"><i class="iconfont reco-home"></i>
Home
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-category"></i>
Category
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/categories/笔记/" class="nav-link"><i class="undefined"></i>
笔记
</a></li><li class="dropdown-item"><!----> <a href="/categories/翻译/" class="nav-link"><i class="undefined"></i>
翻译
</a></li><li class="dropdown-item"><!----> <a href="/categories/OpenSource/" class="nav-link"><i class="undefined"></i>
OpenSource
</a></li><li class="dropdown-item"><!----> <a href="/categories/逆向/" class="nav-link"><i class="undefined"></i>
逆向
</a></li><li class="dropdown-item"><!----> <a href="/categories/OCRunner/" class="nav-link"><i class="undefined"></i>
OCRunner
</a></li></ul></div></div><div class="nav-item"><a href="/tag/" class="nav-link"><i class="iconfont reco-tag"></i>
Tag
</a></div><div class="nav-item"><a href="/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
TimeLine
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-message"></i>
Contact
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://github.com/SilverFruity" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-github"></i>
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask" data-v-1156296a></div> <aside class="sidebar" data-v-1156296a><div class="personal-info-wrapper" data-v-828910c6 data-v-1156296a><img src="/avatar.png" alt="author-avatar" class="personal-img" data-v-828910c6> <h3 class="name" data-v-828910c6>
SilverFruity
</h3> <div class="num" data-v-828910c6><div data-v-828910c6><h3 data-v-828910c6>13</h3> <h6 data-v-828910c6>Articles</h6></div> <div data-v-828910c6><h3 data-v-828910c6>12</h3> <h6 data-v-828910c6>Tags</h6></div></div> <ul class="social-links" data-v-828910c6></ul> <hr data-v-828910c6></div> <nav class="nav-links"><div class="nav-item"><a href="/" aria-current="page" class="nav-link router-link-exact-active router-link-active"><i class="iconfont reco-home"></i>
Home
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-category"></i>
Category
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/categories/笔记/" class="nav-link"><i class="undefined"></i>
笔记
</a></li><li class="dropdown-item"><!----> <a href="/categories/翻译/" class="nav-link"><i class="undefined"></i>
翻译
</a></li><li class="dropdown-item"><!----> <a href="/categories/OpenSource/" class="nav-link"><i class="undefined"></i>
OpenSource
</a></li><li class="dropdown-item"><!----> <a href="/categories/逆向/" class="nav-link"><i class="undefined"></i>
逆向
</a></li><li class="dropdown-item"><!----> <a href="/categories/OCRunner/" class="nav-link"><i class="undefined"></i>
OCRunner
</a></li></ul></div></div><div class="nav-item"><a href="/tag/" class="nav-link"><i class="iconfont reco-tag"></i>
Tag
</a></div><div class="nav-item"><a href="/timeline/" class="nav-link"><i class="iconfont reco-date"></i>
TimeLine
</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title"><i class="iconfont reco-message"></i>
Contact
</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://github.com/SilverFruity" target="_blank" rel="noopener noreferrer" class="nav-link external"><i class="iconfont reco-github"></i>
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div> <!----></nav> <!----> </aside> <div class="password-shadow password-wrapper-in" style="display:none;" data-v-4e82dffc data-v-1156296a><h3 class="title" data-v-4e82dffc data-v-4e82dffc></h3> <!----> <label id="box" class="inputBox" data-v-4e82dffc data-v-4e82dffc><input type="password" value="" data-v-4e82dffc> <span data-v-4e82dffc>Konck! Knock!</span> <button data-v-4e82dffc>OK</button></label> <div class="footer" data-v-4e82dffc data-v-4e82dffc><span data-v-4e82dffc><i class="iconfont reco-theme" data-v-4e82dffc></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-4e82dffc>vuePress-theme-reco</a></span> <span data-v-4e82dffc><i class="iconfont reco-copyright" data-v-4e82dffc></i> <a data-v-4e82dffc><span data-v-4e82dffc>SilverFruity</span>
<span data-v-4e82dffc>2017 - </span>
2021
</a></span></div></div> <div data-v-1156296a><div class="home-blog"><div class="hero" style="text-align:center;overflow:hidden;background:url(/assets/img/bg.2cfdbb33.svg) center/cover no-repeat;height:450px;"><div><!----> <h1>
SilverFruity
</h1> <p class="description">
Road is underfoot - 。-.
</p></div></div> <div class="home-blog-wrapper"><div class="blog-list"><div class="abstract-wrapper" data-v-5a259143><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/OCRunner/second/OCRunner-PatchFile.html" data-v-ff2c8be0>OCRunner - 二进制补丁文件的实现</a></div> <div class="abstract" data-v-ff2c8be0><p>二进制补丁的主要目的是优化JSON补丁,所以先从JSON补丁说起。</p>
<h2 id="前言"><a class="header-anchor" href="#前言">#</a> 前言</h2>
<p>OCRunner 最初的时候是打算只使用 Json 补丁的,可当在我能力范围内对JSON补丁进行了压缩以后,发现 Json 补丁的大小仍不能接受的,太多的冗余字符了。在我思考了一段时间后,发现可以使用 Json 补丁的数据结构,以二进制数据的形式来消除这些冗余字符,大幅降低补丁的大小,所以二进制补丁的初衷是为了优化 Json 补丁的冗余字符,所以我们将先从 Json 补丁说起。</p>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>3/10/2021</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>hotfix</span><span class="tag-item" data-v-1ff7123e>iOS</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/OCRunner/first/OCRunner-SimpleOCRunner.html" data-v-ff2c8be0>OCRunner-实现一个简单版 OCRunner</a></div> <div class="abstract" data-v-ff2c8be0><p>在正文开始前,我们先看看给出的语法树解释执行.gif,OCRunner的核心解释执行部分也是如此。</p>
<p><img src="./eval_ast.gif" alt=""></p>
<p><a href="https://www.iteye.com/blog/rednaxelafx-492667" target="_blank" rel="noopener noreferrer">本图出自: 虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩<OutboundLink/></a></p>
<p>如果你让我仅仅只靠文字就能给你解释清楚 OCRunner 是怎么运行起来的,你们可能是在为难我小蒋,肚子里墨水真的没那么多啊,太难了😂。所以在这一小节,我给大家准备了一个简单版 OCRunner,希望大家能从这个例子中,真正知道它是如何运行的。</p>
<p>希望你们看见项目中的 SingleEngine 类不要笑(哈哈哈),我只是想表达 单缸发动机 的意思 - _ -,我心爱的小摩托就是单缸拖拉机。</p>
<p>本节假设读者并不具备编译相关的知识。</p>
<p>本文对 lex 和 yacc 介绍有限,关于 flex 和 bison 的详细使用可以参照《flex与bison中文版》或者 《flex&bison》。</p>
<p><a href="https://github.com/SilverFruity/SimpleOCRunnerDemo" target="_blank" rel="noopener noreferrer">Demo源码<OutboundLink/></a>,建议使用 <code>git clone</code> 的形式下载源码,每个小节的相应源码都对应在各自的 commit 里。通过边看文章边阅读源码的形式食用,更香哟。</p>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>3/10/2021</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>hotfix</span><span class="tag-item" data-v-1ff7123e>iOS</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/OCRunner/zero/OCRunner-StartCodingHotFix.html" data-v-ff2c8be0>OCRunner-从零教你写一个 iOS 热修复框架</a></div> <div class="abstract" data-v-ff2c8be0><h3 id="为什么要热修复"><a class="header-anchor" href="#为什么要热修复">#</a> 为什么要热修复</h3>
<p>在软件开发过程中,很难避免 BUG 的存在,尤其是对于一些达到一定规模的 App 因为协作模式错综复杂,就很容易带着问题上线。</p>
<p>一旦问题上线之后,问题就麻烦了,不仅需要重新打包、测试,而且还需要重新提交审核,而这种修复问题的方式往往是低效且漫长的。</p>
<p>因此,在开发一个 App 的过程中,稳定性的就变成了一个难题,唯一的原因就是不希望带着问题上线导致用户对 App 失去信任。</p>
<p>热修复就可以很好的解决这类棘手的问题,因此带着好奇之心,研究了一下热修复在 iOS 端的可行性,实现
了一个较为完备的热修复框架,我把它叫做 OCRunner。</p>
<p>我也会在未来几个月,把我做 OCRunner 的一些经验总结成博文,在「老司机技术周报」的公众号上与大
家分享。</p>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>3/10/2021</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>hotfix</span><span class="tag-item" data-v-1ff7123e>iOS</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/OCRunner/introduction/OCRunner.html" data-v-ff2c8be0>OCRunner:完全体的iOS热修复方案</a></div> <div class="abstract" data-v-ff2c8be0><h2 id="简介"><a class="header-anchor" href="#简介">#</a> 简介</h2>
<h3 id="ocrunner开发补丁的工作流"><a class="header-anchor" href="#ocrunner开发补丁的工作流">#</a> <a href="https://github.com/SilverFruity/OCRunner" target="_blank" rel="noopener noreferrer">OCRunner<OutboundLink/></a>开发补丁的工作流</h3>
<p><img src="./OCRunner_0.png" alt=""></p>
<h3 id="初衷"><a class="header-anchor" href="#初衷">#</a> 初衷</h3>
<p>为了能够实现一篇文章的思路:Objective-C源码 -> 二进制补丁文件 ->热更新(具体是哪篇我忘了)。当时刚好开始了<a href="https://github.com/SilverFruity/oc2mango" target="_blank" rel="noopener noreferrer">oc2mango<OutboundLink/></a>翻译器的漫漫长路(顺带为了学习编译原理,嘻嘻),等基本完成以后,就开始肝OCRunner:完全兼容struct,enum,系统C函数调用,魔改libffi,生成补丁文件等,尽可能兼容Objective-C,为了做一个直接运行OC的快乐人。</p>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>9/4/2020</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>hotfix</span><span class="tag-item" data-v-1ff7123e>iOS</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/2020/libffi1.html" data-v-ff2c8be0>iOS libffi详解(1)- 使用方法</a></div> <div class="abstract" data-v-ff2c8be0><p>本系列主要以iOS的TypeEncode和libffi结合使用。</p>
<p><a href="https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html" target="_blank" rel="noopener noreferrer">TypeEncode传送门<OutboundLink/></a></p>
<p><a href="https://github.com/SilverFruity/iOSLibffiDemo" target="_blank" rel="noopener noreferrer">Github源码<OutboundLink/></a></p>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>7/18/2020</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>libffi</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/2020/iOSReEnvNote/iOSReEnvNote.html" data-v-ff2c8be0>iOS13.3.1 逆向环境安装</a></div> <div class="abstract" data-v-ff2c8be0><h2 id="_1-不完美越狱"><a class="header-anchor" href="#_1-不完美越狱">#</a> 1. 不完美越狱</h2>
<p><a href="https://checkra.in/releases/0.9.8-beta" target="_blank" rel="noopener noreferrer">checkra1n<OutboundLink/></a>只支持MacOS,连接上USB后,根据App提示,即可越狱。然后在iPhone上打开checkra1n App,安装Cydia即可。</p>
<p>我的手机为iPhone7 13.3.1</p>
<h2 id="_2-cydia-安装openssh"><a class="header-anchor" href="#_2-cydia-安装openssh">#</a> 2. Cydia 安装OpenSSH</h2>
<ol>
<li>
<p>在Cydia中搜索安装OpenSSH</p>
</li>
<li>
<p>确保手机和电脑在同一局域网</p>
<!--beforebegin--><div class="language-sh line-numbers-mode"><!--afterbegin--><pre v-pre class="language-sh"><code><span class="token function">ssh</span> -P <span class="token number">22</span> root@<span class="token operator"><</span>iPhone局域网IP<span class="token operator">></span>
<span class="token comment"># 默认密码为alpine</span>
</code></pre>
<div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div><!--beforeend--></div><!--afterend--></li>
<li>
<p>设置免密连接</p>
<p><a href="https://github.com/AloneMonkey/MonkeyDev/wiki/%E5%AE%89%E8%A3%85" target="_blank" rel="noopener noreferrer">来源:MonkeyDev Wiki<OutboundLink/></a></p>
<!--beforebegin--><div class="language-sh line-numbers-mode"><!--afterbegin--><pre v-pre class="language-sh"><code>ssh-keygen -t rsa -P <span class="token string">''</span> <span class="token comment">#如果已经有了id_rsa,跳过这一波</span>
ssh-copy-id -i /Users/username/.ssh/id_rsa root@ip <span class="token comment">#这里提示错误,添加sudo即可</span>
</code></pre>
<div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div><!--beforeend--></div><!--afterend--></li>
</ol>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>2/15/2020</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>iOS逆向</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/2020/RustNote.html" data-v-ff2c8be0>Rust备忘录</a></div> <div class="abstract" data-v-ff2c8be0><h2 id="cargo"><a class="header-anchor" href="#cargo">#</a> Cargo</h2>
<p>cargo new {project_name}: 创建新项目</p>
<p>在{project_name}目录下执行:</p>
<p>cargo check: 调用编译器进行语法检查,速度比build更快</p>
<p>cargo build: 编译rust程序</p>
<p>cargo run: 编译并运行程序</p>
<p><strong>安装第三方库</strong></p>
<p>在cargo.toml的dependencies下添加第三方库名字和版本:rand = "0.7.0"</p>
<p>运行cargo build,会自动下载第三库进行下载以及编译</p>
<p>如 rand = "0.7.0",运行cargo update,更新版本的区间为 [0.7.0,0.8.0)</p>
<h2 id="语法"><a class="header-anchor" href="#语法">#</a> 语法</h2>
<h3 id="声明变量"><a class="header-anchor" href="#声明变量">#</a> 声明变量:</h3>
<p>let:不可变变量,和swift中的let一样,不同的在于,可变变量需要使用 let mut a = xx的形式</p>
<!--beforebegin--><div class="language-rust line-numbers-mode"><!--afterbegin--><pre v-pre class="language-rust"><code><span class="token comment">//rust shadow特点:</span>
<span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> a <span class="token operator">=</span> a <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> a <span class="token operator">=</span> a <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"a = {}"</span><span class="token punctuation">,</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// 输出: a = 6</span>
<span class="token comment">// 在其他语言中,通常会有变量已经声明的错误</span>
</code></pre>
<div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div><!--beforeend--></div><!--afterend--></div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>2/7/2020</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>Rust</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/2020/UICornerShadowView/UICornerShadowView.html" data-v-ff2c8be0>iOS圆角边框阴影,无卡顿解决方案</a></div> <div class="abstract" data-v-ff2c8be0><p><a href="https://github.com/SilverFruity/UICornerShadowView" target="_blank" rel="noopener noreferrer">UICornerShadowView<OutboundLink/></a></p>
<h2 id="主要功能"><a class="header-anchor" href="#主要功能">#</a> 主要功能</h2>
<ol>
<li>
<p>圆角,可控圆角方向。</p>
</li>
<li>
<p>边框相关参数,可控边框方向。</p>
</li>
<li>
<p>阴影相关参数,可控阴影方向。</p>
</li>
<li>
<p>使用CoreGraphics生成图片,可异步执行。</p>
</li>
<li>
<p>超小的缓存占用。图片大小与视图大小无关,1000张随机值的圆角阴影边框图片,占用29MB。</p>
</li>
</ol>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>1/15/2020</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>iOS</span><span class="tag-item" data-v-1ff7123e>Core Graphics</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/2020/SwiftUseNSInvocation.html" data-v-ff2c8be0>Swift中使用NSInvocation时遇见的问题</a></div> <div class="abstract" data-v-ff2c8be0><p>这几天被这个坑哭了。</p>
<p>先说说问题。</p>
<h3 id="_1-返回值莫名其妙的被release"><a class="header-anchor" href="#_1-返回值莫名其妙的被release">#</a> 1.返回值莫名其妙的被release</h3>
<!--beforebegin--><div class="language- line-numbers-mode"><!--afterbegin--><pre v-pre class="language-text"><code>做Router时,返回的ViewController,push显示了,结果Xcode给你说,self是nil。黑人问号.jpg
</code></pre>
<div class="line-numbers-wrapper"><span class="line-number">1</span><br></div><!--beforeend--></div><!--afterend--><p>解决方式就是判断当前类是否是Swift的类(包含"."),如果是的话Retain一次</p>
<!--beforebegin--><div class="language-objc line-numbers-mode"><!--afterbegin--><pre v-pre class="language-objc"><code><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span> returnType <span class="token operator">=</span> <span class="token punctuation">[</span>signature methodReturnType<span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">self</span><span class="token punctuation">.</span>isSwift <span class="token operator">&&</span> returnValue <span class="token operator">&&</span> <span class="token function">strcmp</span><span class="token punctuation">(</span>returnType<span class="token punctuation">,</span> <span class="token operator">@</span><span class="token function">encode</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token function">CFRetain</span><span class="token punctuation">(</span><span class="token punctuation">(</span>__bridge CFTypeRef<span class="token punctuation">)</span>returnValue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div><!--beforeend--></div><!--afterend--><p>在10.3.1 11.4 12.4 13.3模拟器测试下,对象都能正常销毁。</p>
<h3 id="_2-执行时报exc-bad-instruction"><a class="header-anchor" href="#_2-执行时报exc-bad-instruction">#</a> 2.执行时报EXC_BAD_INSTRUCTION ????</h3>
</div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>1/4/2020</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>iOS</span><span class="tag-item" data-v-1ff7123e>Swift</span></i></div></div><div class="abstract-item" data-v-ff2c8be0 data-v-5a259143><!----> <div class="title" data-v-ff2c8be0><!----> <a href="/blogs/2019/iOS13URLSchemes.html" data-v-ff2c8be0>iOS 13 URL Scheme</a></div> <div class="abstract" data-v-ff2c8be0></div> <div data-v-1ff7123e data-v-ff2c8be0><i class="iconfont reco-account" data-v-1ff7123e><span data-v-1ff7123e>SilverFruity</span></i> <i class="iconfont reco-date" data-v-1ff7123e><span data-v-1ff7123e>12/30/2019</span></i> <!----> <i class="tags iconfont reco-tag" data-v-1ff7123e><span class="tag-item" data-v-1ff7123e>iOS</span><span class="tag-item" data-v-1ff7123e>URL Scheme</span></i></div></div> <div class="pagation pagation" data-v-094d08e4 data-v-5a259143><div class="pagation-list" data-v-094d08e4><span unselectable="on" class="jump" style="display:none;" data-v-094d08e4>Prev</span> <span class="jump" style="display:none;" data-v-094d08e4>1</span> <span class="ellipsis" style="display:none;" data-v-094d08e4>...</span> <span class="jump bgprimary" data-v-094d08e4>1</span><span class="jump" data-v-094d08e4>2</span> <span class="ellipsis" style="display:none;" data-v-094d08e4>...</span> <span class="jump" style="display:none;" data-v-094d08e4>2</span> <span class="jump" style="display:;" data-v-094d08e4>Next</span> <span class="jumppoint" data-v-094d08e4>Jump To</span> <span class="jumpinp" data-v-094d08e4><input type="text" value="" data-v-094d08e4></span> <span class="jump gobtn" data-v-094d08e4>Go</span></div></div></div></div> <div class="info-wrapper"><div class="personal-info-wrapper" data-v-828910c6><img src="/avatar.png" alt="author-avatar" class="personal-img" data-v-828910c6> <h3 class="name" data-v-828910c6>
SilverFruity
</h3> <div class="num" data-v-828910c6><div data-v-828910c6><h3 data-v-828910c6>13</h3> <h6 data-v-828910c6>Articles</h6></div> <div data-v-828910c6><h3 data-v-828910c6>12</h3> <h6 data-v-828910c6>Tags</h6></div></div> <ul class="social-links" data-v-828910c6></ul> <hr data-v-828910c6></div> <h4><i class="iconfont reco-category"></i> Categories</h4> <ul class="category-wrapper"><li class="category-item"><a href="/categories/笔记/"><span class="category-name">笔记</span> <span class="post-num" style="background-color:#abbd81;">5</span></a></li><li class="category-item"><a href="/categories/翻译/"><span class="category-name">翻译</span> <span class="post-num" style="background-color:#abbd81;">1</span></a></li><li class="category-item"><a href="/categories/OpenSource/"><span class="category-name">OpenSource</span> <span class="post-num" style="background-color:#3498db;">3</span></a></li><li class="category-item"><a href="/categories/逆向/"><span class="category-name">逆向</span> <span class="post-num" style="background-color:#f8b26a;">1</span></a></li><li class="category-item"><a href="/categories/OCRunner/"><span class="category-name">OCRunner</span> <span class="post-num" style="background-color:#abbd81;">3</span></a></li></ul> <hr> <h4><i class="iconfont reco-tag"></i> Tags</h4> <div class="tags" data-v-125939b4><span style="background-color:#e15b64;display:;" data-v-125939b4>All</span><span style="background-color:#f8b26a;display:;" data-v-125939b4>iOS</span><span style="background-color:#849b87;display:;" data-v-125939b4>RunLoop</span><span style="background-color:#e15b64;display:;" data-v-125939b4>Runtime</span><span style="background-color:#abbd81;display:;" data-v-125939b4>Python</span><span style="background-color:#abbd81;display:;" data-v-125939b4>Flask</span><span style="background-color:#abbd81;display:;" data-v-125939b4>URL Scheme</span><span style="background-color:#3498db;display:;" data-v-125939b4>Rust</span><span style="background-color:#e15b64;display:;" data-v-125939b4>Swift</span><span style="background-color:#3498db;display:;" data-v-125939b4>Core Graphics</span><span style="background-color:#abbd81;display:;" data-v-125939b4>iOS逆向</span><span style="background-color:#f26d6d;display:;" data-v-125939b4>hotfix</span><span style="background-color:#e15b64;display:;" data-v-125939b4>libffi</span></div> <!----> <div class="friend-link-wrapper" data-v-7e691180></div></div></div> <div custom="" class="home-center content__default"></div></div> <div class="footer-wrapper footer" data-v-0a3fd326><span data-v-0a3fd326><i class="iconfont reco-theme" data-v-0a3fd326></i> <a target="blank" href="https://vuepress-theme-reco.recoluan.com" data-v-0a3fd326>vuepress-theme-reco@1.6.6</a></span> <span data-v-0a3fd326><i class="iconfont reco-beian" data-v-0a3fd326></i> <a href="#" data-v-0a3fd326>xxxx</a></span> <span data-v-0a3fd326><i class="iconfont reco-copyright" data-v-0a3fd326></i> <a data-v-0a3fd326><span data-v-0a3fd326>SilverFruity</span>
<span data-v-0a3fd326>2017 - </span>
2021
</a></span> <span style="display:none;" data-v-0a3fd326><i class="iconfont reco-eye" data-v-0a3fd326></i> <span id="/" data-flag-title="Your Article Title" class="leancloud-visitors" data-v-0a3fd326><a class="leancloud-visitors-count"></a></span></span> <!----> <div class="comments-wrapper" style="display:none;" data-v-0a3fd326><!----></div></div></div></div></div></div><div class="global-ui"><div class="back-to-ceiling" style="right:1rem;bottom:6rem;width:2.5rem;height:2.5rem;border-radius:.25rem;line-height:2.5rem;display:none;" data-v-c6073ba8 data-v-c6073ba8><svg t="1574745035067" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5404" class="icon" data-v-c6073ba8><path d="M526.60727968 10.90185116a27.675 27.675 0 0 0-29.21455937 0c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z" p-id="5405" data-v-c6073ba8></path><path d="M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 30.59548842-82.51086798 68.34111062z" p-id="5406" data-v-c6073ba8></path></svg></div></div></div>
<script src="/assets/js/app.642360de.js" defer></script><script src="/assets/js/3.96dd975e.js" defer></script><script src="/assets/js/1.a1bdfc9f.js" defer></script><script src="/assets/js/18.a87dbe2d.js" defer></script>
</body>
</html>