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;@endNS_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/858026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue73-命名路由

一、路由的name属性 二、小结

【栈与队列】有效的括号

题目&#xff1a;给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…

Kafka 集群状态监测、故障切换机制原理

Kafka 集群状态监测、故障切换机制原理 Kafka 的状态监测、故障检测和数据变化的实现方式确实依赖于 ZooKeeper 进行协调和管理,但具体机 制包括 ZooKeeper 监听和 Kafka 内部逻辑的结合。以下是详细说明: 1. ZooKeeper 监听机制 Kafka 使用 ZooKeeper 的监听机制来监测状…

深入理解原型模式:Java实现与框架应用

原型模式是一种创建型设计模式&#xff0c;允许对象通过复制现有对象来创建新的实例&#xff0c;而不是通过类实例化来创建对象。原型模式特别适用于创建对象代价高昂或复杂的场景。在本篇博客中&#xff0c;我们将详细介绍原型模式&#xff0c;并演示如何在Java中实现它。最后…

stm32使用time模块输出pwm波,stm32-matlab开发电机控制

simulink: stm32cubemx : 注意在stm32配置了两路的一个互补输出&#xff0c;但实际上在matlab里只需要给定占空比就行了&#xff0c;他会自动输出互补&#xff0c;驱动电机&#xff0c;这是因为有点的电机输出需要6路&#xff0c;有的只需要1路&#xff0c;我们看下图就知道了…

一些3D数据集的简单介绍

一、Objaverse 1.0 Objaverse 1.0: a large dataset of objects with 800K (and growing) 3D models with descriptive captions, tags and animations. Assets not only belong to varied categories like animals, humans, and vehicles, but also include interiors and ex…

MySQL之复制(十三)

复制 复制的问题和解决方案 在主-主复制结构总写入两台主库 试图向两台主库写入并不是一个好主意&#xff0c;如果同时还希望安全地写入两台主库&#xff0c;会碰到很多问题&#xff0c;有些问题可以解决&#xff0c;有些则很难。一个专业人员可能需要经历大量的教训才能明白…

“Driver not loaded“问题解决方案

这两天又碰到了离谱的&#xff0c;愚蠢的&#xff0c;莫名其妙的&#xff0c;丧尽天良的错误。 之前已经解决过这个问题。这几天又碰上了&#xff0c;明明都已经把相应的dll放到了exe的同级目录&#xff0c;NND还是有问题&#xff01;&#xff01;&#xff01;卡了我一个晚上加…

【AIGC半月报】AIGC大模型启元:2024.06(下)

AIGC大模型启元&#xff1a;2024.06&#xff08;下&#xff09; (1) Gen-3(2) Open-Sora&#xff08;Open-Sora再升级&#xff09;(3) Claude 3.5 Sonnet&#xff08;Claude升级&#xff09;(4) ChatTTS v3&#xff08;ChatTTS升级&#xff09;(5) 盘古大模型5.0 (1) Gen-3 20…

012_redhat安装activemq

activemq安装步骤 1.官网下载安装包2.上传并解压ActiveMQ安装包: 将下载的ActiveMQ安装包上传到你的Linux服务器上3.启动ActiveMQ服务: 进入解压后的ActiveMQ目录下的bin&#xe006a;子目录&#xff0c;然后运行以下命令来启动ActiveMQ服务&#xff1a;4.设置开机自启 1.官网下…

代码随想录算法跟练 | Day8 | 字符串 Part01

个人博客主页&#xff1a;http://myblog.nxx.nx.cn 代码GitHub地址&#xff1a;https://github.com/nx-xn2002/Data_Structure.git Day8 344. 反转字符串 题目链接&#xff1a; https://leetcode.cn/problems/reverse-string/ 题目描述&#xff1a; 编写一个函数&#xff0…

c库函数:strrchr使用demo案例

1. strrchr库函数说明 头文件 <string.h> 函数形式 char *strrchr( const char *str, int ch ); 功能 在str所指向的空终止字节串中寻找字符ch的最后出现。 参数 str - 指向要分析的空终止字节字符串的指针 ch - 要搜索的字符 返回值 指向 str 中找到的字符的…

Emacs之实现目录替换(一百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

vue 中监听生命周期事件

vue 中监听生命周期事件 常见的添加自定义事件的写法希望在子组件挂载时通知父组件在模板上监听组件生命周期vue3 有类似的写法吗&#xff1f;jsx 中如何监听 vue3 组件的生命周期事件呢&#xff1f; vue3 父组件组件的生命周期的执行顺序是什么&#xff1f;小结 vue2 提供了一…

边缘计算和云计算的区别

边缘计算和云计算是两种不同的计算范式&#xff0c;它们在数据处理、响应时间、网络带宽、安全性等方面有着显著的区别。下面分别介绍这两种计算方式的特点&#xff1a; ### 云计算&#xff08;Cloud Computing&#xff09; 云计算是一种通过互联网提供计算资源&#xff08;如服…

00 - React 基础

1. React 基础 JSX JSX 是一种 JavaScript 的语法扩展&#xff0c;类似于 XML 或 HTML&#xff0c;允许我们在 JavaScript 代码中编写 HTML。 const element <h1>Hello, world!</h1>;组件 组件是 React 应用的核心&#xff0c;可以是函数组件或类组件。 函数…

DataBase 的一些规范 ?

1命名规范 1.1表名要有业务意义 1.2避免使用关键字 mysql关键字 1.3库、表、字段全部采用小写 1.4命名&#xff08;包括表名、列名&#xff09;禁止超过 30 个字符 1.5临时库、表名必须以 tmp 为前缀&#xff0c;并以日期为后缀&#xff1b;如&#xff1a;tmp_shop_info_2…

如何在Java中进行单元测试:JUnit 5的使用指南

如何在Java中进行单元测试&#xff1a;JUnit 5的使用指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 单元测试是软件开发中的一个关键环节&#xff0c;它…

贪心算法练习题(2024/6/18)

什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 1分发饼干 假设你是一位很棒的家长&#xff0c…

pytest测试框架pytest-rerunfailures插件重试失败用例

Pytest提供了丰富的插件来扩展其功能&#xff0c;介绍下插件pytest-rerunfailures &#xff0c;用于在测试用例失败时自动重新运行这些测试用例。 pytest-rerunfailures官方显示的python和pytest版本限制&#xff1a; Python 3.8pytest 7.2 或更新版本 此插件可以通过以下可…