iMessage 开发要点 坑点记录

news2024/9/20 22:38:29

pod

添加iMessage后,建议podfile要这样:

platform :ios, '14.0'

def commonPod
    //这里写一些主应用和iMessage都要依赖的库
    pod "YYKit", '~> 1.0.9'
end

target 'MainApp' do
    frameworks
    use_frameworks!
    inhibit_all_warnings!

  # 多Target都有的pod
    commonPod 
end  
target 'IMessage' do
    use_frameworks!
    inhibit_all_warnings!
    
    commonPod 

end

UI相关

因为整个应用只有默认的viewcontroller,不能直接获取UIApplication ,所以要获取一部分属性需要在viewDidAppare后才能。以下为viewDidappear后可获取的属性。

拿到UIApplication:

var application:UIApplication? = {
    var responder: UIResponder? = IMAppManager.shared.rootVc as UIResponder

    while responder != nil {
        if let application = responder as? UIApplication {
            return application
        }

        responder = responder?.next
    }

    return nil
}()

安全区域safeBottom

application为上个获取方式获取,如果用viewController.view或者window 获取需要延时

var safeBottomHeight:CGFloat = {
    return application?.windows.first?.safeAreaInsets.bottom ?? 0
}()

iMessage收起状态Vc一部分在屏幕外

需要注意的是,折叠模式底部还有一截是在屏幕外。
在这里插入图片描述

为了让我的view都在这一截的上面,我使用了SnapKit约束布局+安全距离偏移(viewDidAppear之后),其中safeBottomHeight为上文代码:

 tableView.snp.remakeConstraints { make in
    make.top.leading.trailing.equalToSuperview()
    make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom).offset(safeBottomHeight)
}

获取屏幕当前是竖屏还是横屏

UIScreen还是可以用的。

func isPortail() ->Bool {
    return UIScreen.main.bounds.size.width < UIScreen.main.bounds.size.height
}

屏幕旋转回调

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        print("啦啦啦 屏幕旋转前 \(size)")
        coordinator.animateAlongsideTransition(in: nil) { conte in
            print("啦啦啦 屏幕旋转后 \(self.view.frame)")
           
        }
    }

iMessage 跳到主应用

使用url scheme方式跳转,这里不详细介绍。介绍一些相关工具。
在vc中跳转到主应用函数:

var responder: UIResponder? = IMAppManager.shared.rootVc as UIResponder
    let selector = Selector(("openURL:"))
       while responder != nil {
           if responder!.responds(to: selector) {
               responder!.perform(selector, with: url)
               return
           }
           responder = responder?.next
       }

用了url加参数工具函数

public func appendingQueryParameters(url: URL, _ params: [String: String]) -> URL {
    var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)!
    var items = urlComponents.queryItems ?? []
    items += params.map({ URLQueryItem(name: $0, value: $1) })
    urlComponents.queryItems = items
    return urlComponents.url!
}

取参数工具:

extension URL {
    public func queryValue(for key: String) -> String? {
        let stringURL = self.absoluteString
        guard let items = URLComponents(string: stringURL)?.queryItems else { return nil }
        for item in items where item.name == key {
            return item.value
        }
        return nil
    }
}

iMessage 发消息

我这边xcode14.1 发消息模拟器会崩溃,真机正常

在iMessage中插入应用样式

像这样,点击发送出去的,会打开相应的iMessage扩展:请添加图片描述
使用MSMessageTemplateLayout,如果配置了他的不同属性,展示出来效果也不一样,上面样式的是这样配置的。

        let layout = MSMessageTemplateLayout()
        layout.image = UIImage(named: "iMessage App Icon")
        layout.caption = "要展示文本"
        let myMessage = MSMessage()
        myMessage.layout = layout
        activeConversation?.insert(myMessage)

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

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

相关文章

【Lua学习笔记】Lua进阶——Require,三目运算

文章目录 Require短路判断实现三目运算符 Require 这是文件aaa.lua的内容 aaa.lua: a 10 local b 20 print("我是aaa")这是文件example.lua的内容 example.lua: a 100 print(a) require("aaa") --require调用其他脚本文件 print(a) print(b) print(&…

亚马逊云科技全新Amazon Bedrock,助力客户构建生成式AI应用

亚马逊云科技近日在纽约峰会上宣布全面扩展其全托管基础模型服务Amazon Bedrock&#xff0c;包括新增Cohere作为基础模型供应商&#xff0c;加入Anthropic和Stability AI的最新基础模型&#xff0c;并发布变革性的新功能Amazon Bedrock Agents功能。客户无需管理任何基础设施&a…

ceph集群中RBD的性能测试、性能调优

文章目录 rados benchrbd bench-write测试工具Fio测试ceph rbd块设备的iops性能测试ceph rbd块设备的带宽测试ceph rbd块设备的延迟 性能调优 rados bench 参考&#xff1a;https://blog.csdn.net/Micha_Lu/article/details/126490260 rados bench为ceph自带的基准测试工具&am…

OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测

1. 前言 之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称参数量NANO3.2M...... 2. CPU篇 CPU推理框架性…

【三维重建】SceneRF:基于NeRF的自监督单目三维场景重建

文章目录 摘要一、前言二、方法2.1.用于新的深度合成的NeRF3.1.1 深度估计 3.2 概率射线采样 (PrSamp)3.3 球形Unet&#xff08;SU-net&#xff09;3.4.场景重建方案 四、实验总结 摘要 从二维图像的三维重建被广泛的研究&#xff0c;训练与深度监督。为了放松对昂贵获取的数据…

火爆全网,Charles抓包教程-辅助接口测试(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 charles是一款非常…

【C++进阶】多态的理解

一.多态是什么 多态是在不同继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的行为。 对于多态&#xff0c;不同的对象传过去&#xff0c;会调用不同的函数&#xff1b; 即多态调用看的是指向的对象。 //A&#xff0c;B类中的func函数是个多态 class A { pu…

自制Nuget包(C#)

自制Nuget包 自制C# Nuget包。 目的&#xff1a; 生成一个可以通过Nuget管理自动应用的包&#xff0c;生成效果如图&#xff1a; 步骤&#xff1a; 整个制作过程分为两步&#xff1a;第一步制作Nuget包&#xff0c;第二步上传Nuget包到Nuget网站&#xff08;地址&#xf…

Redis实战(2)——互斥命令用于构建分布式锁

1 什么是分布式锁 在单体应用中&#xff0c;线程锁是可以让多个线程串行执行一段代码逻辑的。不过在集群环境或者是分布式的环境下&#xff0c;线程锁无法保证线程串行运行&#xff0c;从而出现线程安全的问题。 根本的原因在于&#xff0c;在 集群分布式环境下 \textcolor{r…

F12 浏览器调试模式页面刷新 network 日志刷新消失的解决办法

每次请求刷新后都把之前的请求记录刷新掉了&#xff0c;把preserve log勾选上后&#xff0c;所有的请求都会保留&#xff0c;再也不怕抓不到记录了。

配置 gitlab https 访问

文章目录 1. 备份2. 生成SSL证书3. 配置文件4. 重启5. 访问 1. 备份 docker exec -ti gitlab-ce gitlab-rake gitlab:backup:create2. 生成SSL证书 yum install openssl openssl-devel -y mkdir /data/gitlab/config/ssl ; cd /data/gitlab/config/ssl### 生成证书 openssl…

郑州Sectigo DV通配符SSL证书

我们在浏览器访问网页时或许不会注意到网站是http还是https链接&#xff0c;但是一定能注意到浏览器给我们展示的“不安全”警告&#xff0c;警告访问者网站未加密&#xff0c;访问网站会有泄露隐私的危险。SSL证书能将网站链接由http转为https&#xff0c;对网站传输数据加密&…

数据科学复现

片段 线性回归建模步骤.py 用sklearn做简单的一元线性回归.py 红用逻辑回归实现红酒数据分类py 高斯朴素贝叶斯分类py

uni-app如何生成正式的APK

第一步&#xff1a; 进入dcloud官网https://dcloud.io/&#xff0c;点击开发者后台进入登录注册页面 第二步&#xff1a;登录之后跳到项目列表&#xff0c;选择自己想要打包的项目 点击进去如果没有生成证书&#xff0c;点击生成证书&#xff0c;如果显示证书已生成就不用管了…

什么样的程序员在35岁后仍然保持竞争力?

作为程序员&#xff0c;大家肯定都听说过程序员的35岁危机&#xff0c;有的人刚入职程序员这个岗位就开始为自己的未来担忧&#xff0c;然而&#xff0c;与其担心自己35岁以后被优化掉&#xff0c;不如现在想想&#xff0c;怎么让自己到了35岁以后在这个岗位上依旧有竞争力。今…

【Python】在PyCharm中安装 ChatGPT 插件,让 AI 帮助我们写代码,从此代码再无报错,小白也能轻易上手!!!

前言 ChatGPT是目前最强大的AI&#xff0c;不仅能够聊天、写小说&#xff0c;甚至码代码也不在话下。 但是在国内要使用chatgpt很麻烦&#xff0c;国内一家团队开发了一款idea插件NexChatGPT&#xff0c;用数据代理的方式&#xff0c;让我们在国内也能轻松的使用chatgpt。 没…

【图像去噪】基于进化算法——自组织迁移算法(SOMA)的图像去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

亚马逊云科技联合霞光社发布《2013~2023中国企业全球化发展报告》

中国企业正处于全球聚光灯下。当企业全球化成为时代发展下的必然趋势&#xff0c;出海也从“可选项”变为“必选项”。中国急速扩大的经济规模&#xff0c;不断升级的研发和制造能力&#xff0c;都在推动中国企业不断拓宽在全球各行业的疆域。 过去十年&#xff0c;是中国企业…

Unity XML1——XML基本语法

一、XML 概述 ​ 全称&#xff1a;可拓展标记语言&#xff08;EXtensible Markup Language&#xff09; ​ XML 是国际通用的&#xff0c;它是被设计来用于传输和存储数据的一种文本特殊格式&#xff0c;文件后缀一般为 .xml ​ 我们在游戏中可以把游戏数据按照 XML 的格式标…