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属性 二、小结

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;卡了我一个晚上加…

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 提供了一…

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

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

Scala运算符及流程控制

Scala运算符及流程控制 文章目录 Scala运算符及流程控制写在前面运算符算数运算符关系运算符赋值运算符逻辑运算符位运算符运算符本质 流程控制分支控制单分支双分支多分支 循环控制for循环while循环循环中断嵌套循环 写在前面 操作系统&#xff1a;Windows10JDK版本&#xff…

1027. 方格取数

Powered by:NEFU AB-IN Link 文章目录 1027. 方格取数题意思路代码 1027. 方格取数 题意 某人从图中的左上角 A 出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&#xff0c;直到到达右下角的 B 点。 在走过的路上&#xff0c;他可以取走方格中的数&#xff08;取…

FOC方案大合集!

获取链接&#xff01;&#xff01;&#xff01; 本次小编给大家带来了一份FOC的方案大合集。此套方案是基于峰岹科技FU68系列MCU的系列方案&#xff0c;包含常用的无感&#xff0c;有感无刷电机的应用&#xff0c;每份方案都包含了原理图&#xff0c;PCB&#xff0c;代码文件&…

【TOOL】ceres学习笔记(一) —— 教程练习

文章目录 一、Ceres Solver 介绍二、Ceres 使用基本步骤1. 构建最小二乘问题2. 求解最小二乘问题 三、使用案例1. Ceres Helloworld2. Powell’s Function3. Curve Fitting4. Robust Curve Fitting 一、Ceres Solver 介绍 Ceres-solver 是由Google开发的开源C库&#xff0c;用…

2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材&#xff0c;P气瓶充装大纲整理而成&#xff08;含2024年P气瓶…

[Open-source tool]Uptime-kuma的簡介和安裝於Ubuntu 22.04系統

[Uptime Kuma]How to Monitor Mqtt Broker and Send Status to Line Notify Uptime-kuma 是一個基於Node.js的開軟軟體&#xff0c;同時也是一套應用於網路監控的開源軟體&#xff0c;其利用瀏覽器呈現直觀的使用者介面&#xff0c;如圖一所示&#xff0c;其讓使用者可監控各種…

足底筋膜炎的症状

足底筋膜炎是足底的肌腱或者筋膜发生无菌性炎症所致&#xff0c;其症状主要包括&#xff1a; 1、疼痛&#xff1a;这是足底筋膜炎最常见和突出的症状。疼痛通常出现在足跟或足底近足跟处&#xff0c;有时压痛较剧烈且持续存在。晨起时或长时间不活动后&#xff0c;疼痛感觉尤为…

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画&#xff0c;LITO方式是一样的 首先加入自己的开机动画&#xff0c;制作过程看前面的部分 打开qssi.mk文件&#xff0c;在文件的最后加入内容 PRODUCT_CO…

Python | Leetcode Python题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution:def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:n, m len(dungeon), len(dungeon[0])BIG 10**9dp [[BIG] * (m 1) for _ in range(n 1)]dp[n][m - 1] dp[n - 1][m] 1for i in range(n - 1, -1, …

一文读懂LLM API应用开发基础(万字长文)

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;上一篇文章中我们详细介绍了LLM开发的基本概念&#xff0c;包括LLM的模型、特点能力以及应用&#xff1b;&#x1f632; 在本文中作者将通过&#xff1a…

Redis—Set数据类型及其常用命令详解

文章目录 一、Redis概述Set类型1 SADD:向集合&#xff08;Set&#xff09;中添加一个或多个成员2 SCARD:获取集合&#xff08;Set&#xff09;中成员数量3 SDIFF:获取多个集合之间的差集4 SDIFFSTORE:计算多个集合之间的差集&#xff0c;并将结果存储在指定的目标集合中5 SMEMB…