IOS开发学习日记(十六)

目录

App间的唤起和通信

App跳转

通过Scheme唤起其他App

组件化


App间的唤起和通信

App跳转

·使用URL Scheme支持App启动、跳转及参数传递

·分享 / 登陆 / 拉起App Store等

设置URL Type

 

在UIApplication中处理参数和业务逻辑

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url 
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{

    //业务处理

}

通过Scheme唤起其他App

通过Scheme判断App是否安装

使用UIApplication唤起App

//判断目标App是否安装
-(BOOL)canOpenURL:(NSURL *)url;


// 通过点击拉起TestApp
-(void)viewClicked{
    NSURL *openURL = [NSURL URLWithString:@"TestApp://"];
    BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:openURL];
   
    [[UIApplication sharedApplication] openURL:openURL] 
                                       options:nil 
                                       completionHandler:^(BOOL success) {
    
    }];
}

·使用HTTP / HTTPS协议启动客户端

·Scheme重复 / Web和Native统一

·需要配合Web端进行注册

·在Safari / 微信 / 其他App中使用Universal Link

组件化

·组件化意义:

        ·适用于基础功能稳定、项目规模较大

        ·项目变大,编译时间长,基础模块的产品间复用

        ·多团队发布、集成、测试不便,协同开发相互依赖和冲突

·组件化拆分

        ·工具类 / 基础功能 / 基础UI控件 / 业务线 ...

·组件化通信选型

        ·常用的三种方案

                ·Target-Action

                        ·抽离业务逻辑

                        ·通过中间层进行调用

                        ·中间层使用runtime反射

                        ·中间层代码优化

                ·URL Scheme 

                        ·使用URL处理本地的跳转

                        ·通过中间层进行注册&调用

                        ·注册无需使用反射

                ·Protocol - Class

                        ·增加Protocol Wrapper层

                        ·中间件返回Protocol对应的Class

                        ·解决硬编码问题

//
//  GSCMediator.h
//  GSCApp1
//
//  Created by gsc on 2024/6/17.
//

#import <UIKit/UIKit.h>
#import "Foundation/Foundation.h"

NS_ASSUME_NONNULL_BEGIN

@protocol GSCDetailViewControllerProtocol <NSObject>

- (__kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl;

@end

@interface GSCMediator : NSObject

//target-action
+(__kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl;

//urlScheme
typedef void(^GSCMediatorProcessBlock)(NSDictionary *params);
+(void)registerScheme:(NSString *)scheme processBlock:(GSCMediatorProcessBlock)processBlock;
+(void)openUrl:(NSString *)url params:(NSDictionary *)params;

//protocol class
+(void)registerProtocol:(Protocol *)protocol class:(Class)class;
+(Class)classForProtocol:(Protocol *)protocol;

@end

NS_ASSUME_NONNULL_END
//
//  GSCMediator.m
//  GSCApp1
//
//  Created by gsc on 2024/6/17.
//

#import "GSCMediator.h"

@implementation GSCMediator

#pragma mark target-action
+(__kindof UIViewController *)detailViewControllerWithUrl:(NSString *)detailUrl{
    
    Class detailClass = NSClassFromString(@"GSCDetailViewController");
    
    UIViewController *detailController = [[detailClass alloc] performSelector:NSSelectorFromString(@"initWithUrlString:") withObject:detailUrl];
    return detailController;
}

#pragma mark url scheme
+(NSMutableDictionary *)mediatorCache{
    static NSMutableDictionary *cache;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        cache = @{}.mutableCopy;
    });
    return cache;
}

+(void)registerScheme:(NSString *)scheme processBlock:(GSCMediatorProcessBlock)processBlock{
    if(scheme && processBlock){
        [[[self class] mediatorCache] setObject:processBlock forKey:scheme];
    }
}

+(void)openUrl:(NSString *)url params:(NSDictionary *)params{
    GSCMediatorProcessBlock block = [[[self class] mediatorCache] objectForKey:url];
    if(block){
        block(params);
    }
}

#pragma mark protocol class
+(void)registerProtocol:(Protocol *)protocol class:(Class)class{
    if(protocol && class){
        [[[self class] mediatorCache] setObject:class forKey:NSStringFromProtocol(protocol)];
    }
}
+(Class)classForProtocol:(Protocol *)protocol{
    return [[[self class] mediatorCache] objectForKey:NSStringFromProtocol(protocol)];
}

@end

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真的学不会了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值