mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
docs: fishhook 底层原理
This commit is contained in:
100
Chapter1 - iOS/1.85.md
Normal file
100
Chapter1 - iOS/1.85.md
Normal file
@@ -0,0 +1,100 @@
|
||||
# 统跳
|
||||
|
||||
|
||||
定义:
|
||||
|
||||
使用统一的 URL 来描述特定的业务功能,并通过路由映射到任意资源目标,并基于此可实现 rewrite、埋点、监控、灰度、A/B 等功能
|
||||
|
||||
|
||||
|
||||
iOS非统跳接口调用检测设计方案
|
||||
|
||||
工作原理
|
||||
|
||||
由于ObjectC语言自身的限制,获取编译时的调用关系信息相对较为困难。因此,没有一个简便的方法获取到哪些接口调用了SDK中的方法。
|
||||
|
||||
ObjectC语言继承自C语言的头文件引用的机制,可以作为检测的点。即,如果App中调用了SDK中的某个方法,那么一定会直接或者间接引用了SDK中的某个头文件。通过检测引用头文件,引导iOS开发删除对应SDK的头文件,那么应该可以暴露出App中直接调用SDK接口的位置。从而达到辅助检测非统跳接口的目的。
|
||||
|
||||
|
||||
配置文件
|
||||
配置文件主要用于在检测过程中,提供工程的目录结构相关信息。在生成过程中,提供生成结果文件需要的额外信息。
|
||||
|
||||
```YAML
|
||||
category: login_register_sdk
|
||||
plist: Example/LoginRegisterSDK/LoginRegisterSDK-Info.plist
|
||||
workspace: Example/LoginRegisterSDK.xcworkspace
|
||||
xcodeproj: Example/LoginRegisterSDK.xcodeproj
|
||||
scheme: LoginRegisterSDK-Example
|
||||
source_directory: LoginRegisterSDK/
|
||||
pods_directory: Example/Pods
|
||||
ignore:
|
||||
- LoginRegisterSDK/**/*SDK.m
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
调用流程
|
||||
|
||||
```objective-c
|
||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||
// ...
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[[TNTRouter sharedRouter] manuallyFetchRoutingTableWithCompletion:^(BOOL succeeded) {
|
||||
|
||||
}];
|
||||
});
|
||||
|
||||
return YES;
|
||||
}
|
||||
```
|
||||
|
||||
```objective-c
|
||||
- (void)manuallyFetchRoutingTableWithCompletion:(TNTManualFetchRoutingTableCompletion)completion {
|
||||
NSDictionary *params = [self getRouterRequestParams];
|
||||
[TMTrinityMGetTask manuallyFetchWithKey:TMNeutronRouterRewriteKey
|
||||
params:params
|
||||
moduleCallback:^(NSString * _Nullable result, NSError * _Nullable error) {
|
||||
if (error) return ;
|
||||
if (result.length == 0) return;
|
||||
|
||||
// encryp & json
|
||||
NSDictionary *routesAndWrites = [self routesAndRewriteForRemoteEncryptedString:result];
|
||||
|
||||
// routes is existed
|
||||
if (routesAndWrites) {
|
||||
// process routes
|
||||
[self loadRoutesAndWritesFromRemote:routesAndWrites];
|
||||
|
||||
// save decrpy data string
|
||||
[self saveRemoteRouteString:result];
|
||||
|
||||
if(completion) completion(true);
|
||||
}
|
||||
} callback:nil];
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
# 参考资料
|
||||
|
||||
- [iOS performSelector传递两个以上参数](https://www.jianshu.com/p/4118793c88df)
|
||||
-
|
||||
|
||||
|
||||
之前看代码理解设计太慢了,不清楚设计背景,所以想请教你一下
|
||||
|
||||
1. 使用统一的 URL 来描述特定的业务功能,并通过路由映射到任意资源目标,并基于此可实现 rewrite、埋点、监控、灰度、A/B 等功能
|
||||
如何理解rewrite、埋点、监控、灰度、A/B 等功能。
|
||||
|
||||
用统跳 url 后,调用某 SDK ,区分 type,h5、RN、Native,native 则 runtime,performSelector,
|
||||
H5、RN 没看到处理逻辑?
|
||||
|
||||
2. 通跳的设计背景是什么?解决业务上什么问题?举个例子理解下工作流程
|
||||
- RoutingTableGenerator.rb 扫描工程 TNT_TARGET,写入 Targets.json 的目的是什么?
|
||||
- DefaultRoutingTableFetcher.rb 调用接口,写入文件
|
||||
- ProjectConfigurator.rb 调用上述2个脚本,写入工程 script
|
||||
|
||||
3. TrinityParams 和 TrinityConfigurator 2个 SDK 背景、作用分别是什么?
|
||||
Reference in New Issue
Block a user