OC组件化02:基于URL Scheme的使用

张建 lol

URL Scheme 路由

  • 使 URL Scheme 处理本地的跳转
  • 通过中间层进行注册 & 调用(load方法里面把被调用者注册到中间层)

命名规范

1
2
// 协议://主机名[:端口]/路径/[?参数]#fragment
@"lstest://lsapp:11111/china/ls.com?a=1&b=2"
  • lstest:协议名
  • lsapp:主机名,为了区分 不同的app
  • 端口号:可以将端口号作为 模块ID
  • china/ls.com:路径,可以是跳转到模块的 指定页面
  • a=1&b=2:参数,跳转的参数

解析

优缺点

  • 优点:实现简单

  • 缺点:存在硬编码问题,参数都是通过字典的形式传递,类型不明确

URL Scheme 路由示例

思路:
B组件使用URL将Block注册给路由,路由以URL为key,将Block存储起来。
A组件通过URL调用路由的方法,找到对应的Block,完成对A的调用

  • 创建路由
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
typedef void (^ZJRouterBlock)(NSDictionary *dic);

#import "ZJRouter.h"

@interface ZJRouter ()
@property (strong,nonatomic)NSMutableDictionary * blockDic;
@end
@implementation ZJRouter
// 参数 @{@"":...}
+ (instancetype)shareInstance{
static ZJRouter * router = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
router = [[self alloc] init];
router.blockDic = @{}.mutableCopy;
});
return router;
}

// 注册
- (void)registerUrl:(NSString *)url block:(ZJRouterBlock)block{
if (!url || !block) return;
if (block) {
self.blockDic[url] = [block copy];
}
}
// 执行
- (void)excuteBlockWithUrl:(NSString *)key params:(NSDictionary *)params{
if (!key) return;
ZJRouterBlock block = self.blockDic[key];
if (!block) return;
block(params);
}

@end
  • B 组件中注册
1
2
3
4
5
+ (void)load {
[[ZJRouter shareInstance] registerUrl:@"A:aTestAction" block:^(NSDictionary * _Nonnull dic) {
NSLog(@"dic:%@",dic);
}];
}
  • A 组件中调用
1
[[ZJRouter shareInstance] excuteBlockWithUrl:@"A:aTestAction" params:@{@"text":@"文字"}];
  • Post title:OC组件化02:基于URL Scheme的使用
  • Post author:张建
  • Create time:2023-03-04 16:15:30
  • Post link:https://redefine.ohevan.com/2023/03/04/OC组件化/OC组件化02:基于URL-Scheme的使用/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
On this page
OC组件化02:基于URL Scheme的使用