mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
101 lines
3.6 KiB
Markdown
101 lines
3.6 KiB
Markdown
# 统跳
|
||
|
||
|
||
定义:
|
||
|
||
使用统一的 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 背景、作用分别是什么?
|