uniapp原生插件开发实战——iOS打开文件到自己的app

用原生开发获取文件的名称、路径等能力封装为一个插件包供前端使用

首先根据ios插件开发教程,创建一个插件工程,template 选framework
image.png
开始编写代码:
iOS 9 及以下版本会调用以下方法:

- (BOOL)application:(UIApplication *_Nullable)application openURL:(NSURL *_Nullable)url sourceApplication:(NSString *_Nullable)sourceApplication annotation:(id _Nonnull )annotation{
}

iOS9以上的版本会调用以下方法:

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

这两个方法实现的功能是一样的,代码相同。

主要功能点:

  1. 获取ios沙盒目录所在位置,将文件复制到iOS系统应用沙盒目录下的“/Library/Pandora/documents”,防止文件因权限问题无法读取
  2. 回调函数调用时机:等到文件复制iOS系统应用沙盒目录下的“/Library/Pandora/documents”后调用,防止前端读取不到文件信息;这里使用的是:
uni.requireNativePlugin("插件名")?.render({}, function(result){
// result为插件传回来的文件信息,这里包含fileName,filePath
})
  1. 基于2原生插件中需要在render判断下是否已经获取到文件的具体信息,如果没有则设置回调函数:
#pragma mark - Export Method
- (void)render:(NSDictionary *)options callback:(WXModuleKeepAliveCallback)callback
{if (SingleTon.getInstance.dict) {callback(SingleTon.getInstance.dict,YES);}else {SingleTon.getInstance.openURLCallback = ^(NSSObject *obj) { // 设置一个回调函数在openURL执行完成后调用if (callback) {callback(obj,YES);}};}
}
  1. 最后通过plus.io.resolveLocalFileSystemURL获取文件对象

读取文件代码及功能点解释:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options {NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);// 获取应用程序的 Library 目录路径。NSString *documentsDirectory = [paths firstObject];//获取 Library 目录下的第一个路径。NSString *pandoraDocumentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"Pandora/documents"];//创建一个新的路径,将 "Pandora/documents" 目录添加到 Library 目录路径后面。NSFileManager *fileManager = [NSFileManager defaultManager];//创建一个 NSFileManager 对象,用于文件管理操作。if (![fileManager fileExistsAtPath:pandoraDocumentsDirectory]) {//检查指定路径是否存在BOOL success = [fileManager createDirectoryAtPath:pandoraDocumentsDirectory withIntermediateDirectories:YES attributes:nil error:&error];// 创建指定路径的文件夹,如果创建成功则返回 YES。if (url != nil) {//检查传入的 URL 是否为空。NSString *path = [url path];//从 URL 中获取路径。NSString *decodedPath = [path stringByRemovingPercentEncoding];//对路径进行解码,去除百分号编码。NSString *fileName = [decodedPath lastPathComponent];//获取路径中的文件名。NSString *fileExtension = [fileName pathExtension];//获取文件的扩展名。NSString *str = @"file.";NSString *fileName_ = [str stringByAppendingString:fileExtension];// 将 "file." 和文件扩展名拼接在一起。NSString *destinationPath = [pandoraDocumentsDirectory stringByAppendingPathComponent:fileName_];//创建目标文件的完整路径。if ([fileManager fileExistsAtPath:destinationPath]) {//检查目标文件是否已经存在。BOOL removeSuccess = [fileManager removeItemAtPath:destinationPath error:&error];//如果目标文件已经存在,尝试删除已存在的文件。BOOL success = [fileManager copyItemAtPath:decodedPath toPath:destinationPath error:&error];//将解码后的文件拷贝到目标路径。NSDictionary *dict = @{@"decodedPath": decodedPath, @"filePath": destinationPath, @"fileName": fileName};// 创建一个包含文件相关信息的字典。SingleTon.getInstance.dict = dict;if (SingleTon.getInstance.openURLCallback) {         SingleTon.getInstance.openURLCallback(SingleTon.getInstance.dict); // 调用回调函数传递文件信息给前端}return YES;
}

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

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

相关文章

【数据分析详细教学】全球气温变迁:一个多世纪的数据分析

全球气温变迁&#xff1a;一个多世纪的数据分析 1. 数据集选择与获取 数据可以从NASA的GISTEMP数据集获取&#xff0c;通常提供的格式有TXT和CSV。我们假设数据是以CSV格式提供。 2. 数据预处理 使用Python的pandas库读取数据并进行预处理。 import pandas as pd# 加载数…

C#知识|账号管理系统:修改登录密码界面的UI设计

哈喽,你好啊!我是雷工! 本节记录添加修改登录密码界面的过程,以下为练习笔记。 01 效果演示 演示跳转打开修改登录密码子窗体效果: 02 添加窗体 在UI层添加一个Windows窗体,命名为:FrmModifyPwd.cs; 03 设置窗体属性 按照下表的内容设置窗体的相关属性: 设置属性 …

物联网架构之Hadoop

一&#xff1a;系统环境设置&#xff08;所有节点都设置&#xff09; 1&#xff1a;关闭selinux和防火墙 setenforce 0 sed -i /^SELINUX/s/enforcing/disabled/ /etc/selinux/config systemctl stop firewalld systemctl disable firewalld 2&#xff1a;为各个节点设置主机名…

mysql面试(二)

前言 这是mysql面试基础的第二节&#xff0c;主要是了解一下mysql数据更新的基本流程&#xff0c;还有三大日志的作用。但是具体的比如undolog是如何应用在mvcc机制中的&#xff0c;由于篇幅问题就放在下一在章节 数据更新流程 上面是说了更新真正数据之前的大致流程&#x…

requets库传data和传json的区别

传data和传json的qubie 被测对象&#xff0c;白月黑羽系统 系统下载地址&#xff1a; https://www.byhy.net/prac/pub/info/bysms/ 测试用例下载地址&#xff1a; https://cdn2.byhy.net/files/selenium/testcases.xlsx 一、传data import json import requests import pytes…

7、Qt5开发及实列(笔记3-系统操作)

说明&#xff1a;此示例包含了基本的常使用的系统操作 效果如下: mainwindos.cpp #pragma execution_character_set("utf-8") #include "mainwindow.h"#include <QDesktopWidget> #include <QApplication> #include <QHostInfo> #in…

docker基础镜像

一、配置 docker 本地源 [docker-ce-stable] nameDocker CE Stable baseurlhttp://10.35.186.181/docker-ce-stable/ enabled1 gpgcheck0 配置阿里云Docker Yum源 yum install -y yum-utils device-mapper-persistent-data lvm2 git yum-config-manager --add-repo http://mirr…

Windows安装Visual Studio2022 + QT5.15开发环境

最近&#xff0c;把系统换成了Windows11&#xff0c;想重新安装QT5.12&#xff0c;结果发现下载不了离线安装包。 最后索性安装QT5.15了&#xff0c;特此记录下。 预祝大家&#xff1a;不论是何时安装&#xff0c;都可以安装到指定版本的QT。 一、VS2022安装 VS2022官网下…

ubuntu 22.04 安装部署gitlab详细过程

目录 gitlab介绍 gitlab安装 步骤1&#xff1a;更新系统 步骤2&#xff1a;添加 GitLab 的 GPG 密钥 gitlab企业版 gitlab社区版 步骤3&#xff1a;安装 GitLab 社区版 社区版 步骤4&#xff1a;初始化 GitLab 步骤5&#xff1a;访问 GitLab 步骤6&#xff1a;查看r…

C++ - 基于多设计模式下的同步异步⽇志系统

1.项目介绍 项⽬介绍 本项⽬主要实现⼀个⽇志系统&#xff0c; 其主要⽀持以下功能: • ⽀持多级别⽇志消息 • ⽀持同步⽇志和异步⽇志 • ⽀持可靠写⼊⽇志到控制台、⽂件以及滚动⽂件中 • ⽀持多线程程序并发写⽇志 • ⽀持扩展不同的⽇志落地⽬标地 2.开发环境 • Cent…

AI学习记录 - 导数在神经网络训练中的作用(自己画的图,很丑不要介意!)

导数的作用 我们去调整神经网络的权重&#xff0c;一般不会手动去调整&#xff0c;如果只有很少的神经元&#xff0c;人工调整确实可以实现&#xff0c;当我们有几十层&#xff0c;一层几百上千个神经元的时候&#xff0c;人工调整就不可能了。 一个权重的调整涉及到两个问题&…

TCP的FIN报文可否携带数据

问题发现&#xff1a; 发现FTP-DATA数据传输完&#xff0c;TCP的挥手似乎只有两次 实际发现FTP-DATA报文中&#xff0c;TCP层flags中携带了FIN标志 piggyback FIN 问题转化为 TCP packet中如果有FIN flag&#xff0c;该报文还能携带data数据么&#xff1f; 答案是肯定的 RFC7…

【LeetCode:3098. 求出所有子序列的能量和 + 记忆化缓存】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十七章 字符设备和杂项设备总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Redis核心技术与实战学习笔记

Redis核心技术与实战学习笔记 最近想沉下心来看下redis&#xff0c;买了蒋德钧老师的《Redis 核心技术与实战》,这里记录一些学习笔记 希望能够坚持下去有想一起学习的童鞋&#xff0c;可以点击跳转到文章尾部获取学习资源,仅供学习不要用于任何商业用途!!! redis知识全景图 …

前端JS特效第50集:zyupload图片上传

zyupload图片上传&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; var operimg_id; var zoom_rate100; var zoom_timeout; function rotateimg(){var smallImg$("#"operimg_id);var numsmallImg.attr(curr_rotate);if(nu…

ESP8266用AT指令实现连接MQTT

1准备工作 硬件&#xff08;ESP8266&#xff09;连接电脑 硬件已经烧入了MQTT透传固件 2实现连接 2-1&#xff08;进入AT模式&#xff09; 打开串口助手发送如下指令 AT 2-2&#xff08;复位&#xff09; ATRST 2-3&#xff08;开启DHCP&#xff0c;自动获取IP&#x…

免费视频批量横版转竖版

简介 视频处理器 v1.3 是一款由是貔貅呀开发的视频编辑和处理工具&#xff0c;提供高效便捷的视频批量横转竖&#xff0c;主要功能&#xff1a; 导入与删除文件&#xff1a;轻松导入多个视频文件&#xff0c;删除不必要的文件。暂停与继续处理&#xff1a;随时暂停和继续处理。…

Python学习笔记43:游戏篇之外星人入侵(四)

前言 在前面的文章中&#xff0c;我们已经对项目进行了简单的分析&#xff0c;并且已经编写好了基础的代码&#xff0c;接下来的工作就是进一步的分析游戏的业务功能&#xff0c;在基础代码之上&#xff0c;进行填充。 背景颜色 我们简单的创建窗口以后&#xff0c;除了命名…

设置使用小米google play和APK的下载使用

我们常常遇到从google play无法下载apk文件&#xff0c;被迫从APKcombo和APKpure两个网站下载安装文件&#xff0c;可是安装文件在手机google play服务框架未开启时即使安装好了&#xff0c;也没法用。也需要把google play服务框架安装好&#xff0c;下面分别介绍&#xff1a; …