diff --git a/Info.plist b/Info.plist index 5ae921429ed7b4d41bc09d80dc5a094e226288b3..a6513623a2e1ee7c4c650665d1522b38c919b137 100644 --- a/Info.plist +++ b/Info.plist @@ -31,6 +31,9 @@ alipay safepay weixin + qqmap + iosamap + baidumap diff --git a/pages.json b/pages.json index ed18fa538d46912712c1b51325b7937b419795e0..978dfec352e4c16a06d5ddd4a7bc3187ce458e67 100644 --- a/pages.json +++ b/pages.json @@ -893,7 +893,7 @@ } }, // #endif - // #ifdef WEB || MP-WEIXIN + // #ifdef APP-ANDROID || APP-IOS || WEB || MP-WEIXIN { "path": "pages/API/open-location/open-location", "group": "1,9,1", @@ -902,6 +902,16 @@ } }, // #endif + // #ifdef APP-ANDROID || APP-IOS || WEB + { + "path": "uni_modules/uni-openLocation/pages/openLocation/openLocation", + "style": { + "navigationBarTitleText": " ", + "navigationStyle": "custom", + "disableSwipeBack": false + } + }, + // #endif // #ifdef APP-ANDROID || APP-IOS || WEB || MP-WEIXIN { "path": "pages/API/choose-location/choose-location", @@ -2397,7 +2407,7 @@ } } // #endif - ], +], "globalStyle": { "pageOrientation": "portrait", "navigationBarTitleText": "Hello uniapp x", diff --git a/pages/API/open-location/open-location.uvue b/pages/API/open-location/open-location.uvue index 1fb7386fdfef3348118073ed621d96a6193826a4..bd9d1dc7057aa3bbd8cf2040d6f2c766cc4c3137 100644 --- a/pages/API/open-location/open-location.uvue +++ b/pages/API/open-location/open-location.uvue @@ -9,7 +9,7 @@ 经度 - + @@ -17,7 +17,7 @@ 纬度 - + @@ -25,7 +25,7 @@ 位置名称 - + @@ -33,7 +33,7 @@ 详细位置 - + @@ -51,21 +51,23 @@ export default { data() { return { - title: 'openLocation' + title: 'openLocation', + longitude: 116.39747, + latitude: 39.9085, + name: '天安门', + address: '北京市东城区东长安街' } }, onHide() { console.log("Page Hide"); }, methods: { - openLocation: function (e) { - console.log(e) - var value = e.detail.value + openLocation: function () { uni.openLocation({ - longitude: Number(value.longitude), - latitude: Number(value.latitude), - name: value.name, - address: value.address + longitude: this.longitude, + latitude: this.latitude, + name: this.name, + address: this.address }) } } diff --git a/uni_modules/uni-openLocation/changelog.md b/uni_modules/uni-openLocation/changelog.md new file mode 100644 index 0000000000000000000000000000000000000000..e296ac6e3e55ad8a1936f3c51c5d674411ad3665 --- /dev/null +++ b/uni_modules/uni-openLocation/changelog.md @@ -0,0 +1,6 @@ +## 1.0.2(2024-12-10) +ios端支持侧滑关闭 +## 1.0.1(2024-12-10) +插件新增文件pages_init.json,方便注册页面 +## 1.0.0(2024-12-09) +发布API uni.openLocation 需 HBuilderX 4.41+ diff --git a/uni_modules/uni-openLocation/package.json b/uni_modules/uni-openLocation/package.json new file mode 100644 index 0000000000000000000000000000000000000000..4f0a0d4c51d1bd40eb1fc9baecdf65411eaf25f9 --- /dev/null +++ b/uni_modules/uni-openLocation/package.json @@ -0,0 +1,98 @@ +{ + "id": "uni-openLocation", + "displayName": "uni-openLocation", + "version": "1.0.2", + "description": "实现APP端的 uni.openLocation", + "keywords": [ + "uni-openLocation" +], + "repository": "", + "engines": { + "HBuilderX": "^3.6.8" + }, + "dcloudext": { + "type": "uts", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uts-openSchema" + ], + "uni-ext-api": { + "uni": { + "openLocation": { + "name": "openLocation", + "app": { + "js": false, + "kotlin": true, + "swift": true, + "arkts": false + } + } + } + }, + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "y" + }, + "client": { + "Vue": { + "vue2": "u", + "vue3": "y" + }, + "App": { + "app-android": "y", + "app-ios": "y", + "app-harmony": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "u", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} diff --git a/uni_modules/uni-openLocation/pages/openLocation/openLocation.uvue b/uni_modules/uni-openLocation/pages/openLocation/openLocation.uvue new file mode 100644 index 0000000000000000000000000000000000000000..48f9bee2e2452b4aaa1075e9f6e7854053e562eb --- /dev/null +++ b/uni_modules/uni-openLocation/pages/openLocation/openLocation.uvue @@ -0,0 +1,527 @@ + + + + + diff --git a/uni_modules/uni-openLocation/readme.md b/uni_modules/uni-openLocation/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..9382356a2ba0c3fa6279262b7f4b458e4d8e8303 --- /dev/null +++ b/uni_modules/uni-openLocation/readme.md @@ -0,0 +1,11 @@ +# uni-openLocation + +> 需 HBuilderX 4.41+ + +[使用文档](https://doc.dcloud.net.cn/uni-app-x/api/open-location.html) + +### 开发文档 +[UTS 语法](https://uniapp.dcloud.net.cn/tutorial/syntax-uts.html) +[UTS API插件](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html) +[UTS 组件插件](https://uniapp.dcloud.net.cn/plugin/uts-component.html) +[Hello UTS](https://gitcode.net/dcloud/hello-uts) \ No newline at end of file diff --git a/uni_modules/uni-openLocation/static/target.png b/uni_modules/uni-openLocation/static/target.png new file mode 100644 index 0000000000000000000000000000000000000000..8c138822dadc02bf6bde61ca020e30c39fda35b7 Binary files /dev/null and b/uni_modules/uni-openLocation/static/target.png differ diff --git a/uni_modules/uni-openLocation/utssdk/app-android/index.uts b/uni_modules/uni-openLocation/utssdk/app-android/index.uts new file mode 100644 index 0000000000000000000000000000000000000000..3f14b685466e65c7f1fb1053530f028e5b7ba2f5 --- /dev/null +++ b/uni_modules/uni-openLocation/utssdk/app-android/index.uts @@ -0,0 +1,36 @@ +import { OpenLocation, OpenLocationOptions, OpenLocationSuccessImpl, OpenLocationErrorCode } from "../interface.uts" +import { OpenLocationFailImpl } from "../unierror.uts" + +export const openLocation : OpenLocation = function (options : OpenLocationOptions) { + const uuid = `${Date.now()}${Math.floor(Math.random() * 1e7)}` + const baseEventName = `uni_open_location_${uuid}` + const readyEventName = `${baseEventName}_ready` + const optionsEventName = `${baseEventName}_options` + const successEventName = `${baseEventName}_success` + const failEventName = `${baseEventName}_fail` + + const readyEventId = uni.$on(readyEventName, () => { + uni.$emit(optionsEventName, JSON.parse(JSON.stringify(options))) + }) + const successEventId = uni.$on(successEventName, () => { + const res = new OpenLocationSuccessImpl() + options.success?.(res) + options.complete?.(res) + }) + const failEventId = uni.$on(failEventName, (errCode : OpenLocationErrorCode) => { + const res = new OpenLocationFailImpl(errCode) + options.fail?.(res) + options.complete?.(res) + }) + uni.openDialogPage({ + url: `/uni_modules/uni-openLocation/pages/openLocation/openLocation?readyEventName=${readyEventName}&optionsEventName=${optionsEventName}&successEventName=${successEventName}&failEventName=${failEventName}`, + fail(err) { + const res = new OpenLocationFailImpl(4) + options.fail?.(res) + options.complete?.(res) + uni.$off(readyEventName, readyEventId) + uni.$off(successEventName, successEventId) + uni.$off(failEventName, failEventId) + } + }) +}; diff --git a/uni_modules/uni-openLocation/utssdk/app-ios/Info.plist b/uni_modules/uni-openLocation/utssdk/app-ios/Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..0ac851285e7a6ee4b6a1783dbe2c9be8289a190d --- /dev/null +++ b/uni_modules/uni-openLocation/utssdk/app-ios/Info.plist @@ -0,0 +1,14 @@ + + + + + + LSApplicationQueriesSchemes + + qqmap + iosamap + baidumap + + + + diff --git a/uni_modules/uni-openLocation/utssdk/app-ios/index.uts b/uni_modules/uni-openLocation/utssdk/app-ios/index.uts new file mode 100644 index 0000000000000000000000000000000000000000..781339cb01cdfe67ed16408755b5c0b2634b5dc4 --- /dev/null +++ b/uni_modules/uni-openLocation/utssdk/app-ios/index.uts @@ -0,0 +1,36 @@ +import { OpenLocation, OpenLocationOptions, OpenLocationSuccessImpl } from "../interface.uts" +import { OpenLocationFailImpl } from "../unierror.uts" + +export const openLocation : OpenLocation = function (options : OpenLocationOptions) { + const uuid = `${Date.now()}${Math.floor(Math.random() * 1e7)}` + const baseEventName = `uni_open_location_${uuid}` + const readyEventName = `${baseEventName}_ready` + const optionsEventName = `${baseEventName}_options` + const successEventName = `${baseEventName}_success` + const failEventName = `${baseEventName}_fail` + + uni.$on(readyEventName, (..._ : any) => { + uni.$emit(optionsEventName, JSON.parse(JSON.stringify(options)!)) + }) + uni.$on(successEventName, (..._ : any) => { + const res = new OpenLocationSuccessImpl() + options.success?.(res) + options.complete?.(res) + }) + uni.$on(failEventName, (..._ : any) => { + const res = new OpenLocationFailImpl(4) + options.fail?.(res) + options.complete?.(res) + }) + uni.openDialogPage({ + url: `/uni_modules/uni-openLocation/pages/openLocation/openLocation?readyEventName=${readyEventName}&optionsEventName=${optionsEventName}&successEventName=${successEventName}&failEventName=${failEventName}`, + fail(err) { + const res = new OpenLocationFailImpl(4) + options.fail?.(res) + options.complete?.(res) + uni.$off(readyEventName) + uni.$off(successEventName) + uni.$off(failEventName) + } + }) +}; diff --git a/uni_modules/uni-openLocation/utssdk/interface.uts b/uni_modules/uni-openLocation/utssdk/interface.uts new file mode 100644 index 0000000000000000000000000000000000000000..ec285dfbf639653bf207dc5db6f409c9ad655189 --- /dev/null +++ b/uni_modules/uni-openLocation/utssdk/interface.uts @@ -0,0 +1,418 @@ +/** + * 错误码 + */ +export type OpenLocationErrorCode = +/** + * 框架内部错误 + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "x", + * "unixVer": "x" + * } + * } + * } + */ +4; + +export interface OpenLocationSuccess { + errMsg: string +} + +type OpenLocationSuccessCallback = (result : OpenLocationSuccess) => void + +export interface OpenLocationFail extends IUniError { + errCode : OpenLocationErrorCode +} +type OpenLocationFailCallback = (result : OpenLocationFail) => void + +export type OpenLocationComplete = any +type OpenLocationCompleteCallback = (result : OpenLocationComplete) => void + +/** + * uni.openLocation函数参数定义 + */ +export type OpenLocationOptions = { + /** + * 纬度,范围为-90~90,负数表示南纬,使用 gcj02 国测局坐标系 + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + latitude : number, + /** + * 经度,范围为-180~180,负数表示西经,使用 gcj02 国测局坐标系 + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + longitude : number, + /** + * 缩放比例,范围5~18,默认为18(微信小程序) + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + scale ?: number | null, + /** + * 位置名 + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + name ?: string | null, + /** + * 地址的详细说明 + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + address ?: string | null, + /** + * 接口调用成功的回调函数 + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + success ?: OpenLocationSuccessCallback | null, + /** + * 接口调用失败的回调函数 + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + fail ?: OpenLocationFailCallback | null, + /** + * 接口调用结束的回调函数(调用成功、失败都会执行) + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + complete ?: OpenLocationCompleteCallback | null +}; + +/** + * 使用应用内置地图查看位置 + * + * @param {OpenLocationOptions} options + * @tutorial https://doc.dcloud.net.cn/uni-app-x/api/prompt.html#openLocation + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ +export type OpenLocation = (options : OpenLocationOptions) => void; + +export interface Uni { + /** + * @description 使用应用内置地图查看位置 + * @example + * ```typescript + uni.openLocation({ + latitude: 39.908823, + longitude: 116.39747, + success: (res) => { + console.log('res: ', res) + }, + fail: (err) => { + console.log('err: ', err) + }, + complete: (res) => { + console.log('complete: ', res) + } + }); + * ``` + * @tutorial https://doc.dcloud.net.cn/uni-app-x/api/prompt.html#openLocation + * @uniPlatform { + * "app": { + * "android": { + * "osVer": "5.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "ios": { + * "osVer": "12.0", + * "uniVer": "√", + * "unixVer": "4.41" + * }, + * "harmony": { + * "osVer": "3.0", + * "uniVer": "4.23", + * "unixVer": "x" + * } + * }, + * "web": { + * "uniVer": "√", + * "unixVer": "4.0" + * }, + * "mp": { + * "weixin": { + * "uniVer": "√", + * "unixVer": "4.41" + * } + * } + * } + */ + openLocation(options : OpenLocationOptions) : void; +} + +export class OpenLocationSuccessImpl implements OpenLocationSuccess { + errMsg : string + constructor(errMsg : string = 'chooseLocation:ok') { + this.errMsg = errMsg + } +} diff --git a/uni_modules/uni-openLocation/utssdk/unierror.uts b/uni_modules/uni-openLocation/utssdk/unierror.uts new file mode 100644 index 0000000000000000000000000000000000000000..e188281315eec543f32d1184309f9101359feb82 --- /dev/null +++ b/uni_modules/uni-openLocation/utssdk/unierror.uts @@ -0,0 +1,30 @@ +import { OpenLocationErrorCode, OpenLocationFail } from "./interface.uts" + +/** + * 错误主题 + */ + +export const UniErrorSubject = 'uni-openLocation'; + +/** + * 错误码 + * @UniError + */ +export const UniErrors : Map = new Map([ + /** + * 框架内部错误 + */ + [4, 'internal error'] +]); + +export class OpenLocationFailImpl extends UniError implements OpenLocationFail { + // #ifndef APP-IOS + override errCode : OpenLocationErrorCode; + // #endif + constructor(errCode : OpenLocationErrorCode) { + super(); + this.errSubject = UniErrorSubject; + this.errCode = errCode; + this.errMsg = UniErrors.get(errCode) ?? ""; + } +} diff --git a/uni_modules/uni-openLocation/utssdk/web/index.uts b/uni_modules/uni-openLocation/utssdk/web/index.uts new file mode 100644 index 0000000000000000000000000000000000000000..7694f6511f9840eb157377144a71bba5dd593785 --- /dev/null +++ b/uni_modules/uni-openLocation/utssdk/web/index.uts @@ -0,0 +1,36 @@ +import { OpenLocation, OpenLocationOptions, OpenLocationSuccessImpl, OpenLocationErrorCode } from "../interface.uts" +import { OpenLocationFailImpl } from "../unierror.uts" + +export const openLocation : OpenLocation = function (options : OpenLocationOptions) { + const uuid = `${Date.now()}${Math.floor(Math.random() * 1e7)}` + const baseEventName = `uni_open_location_${uuid}` + const readyEventName = `${baseEventName}_ready` + const optionsEventName = `${baseEventName}_options` + const successEventName = `${baseEventName}_success` + const failEventName = `${baseEventName}_fail` + + const readyEventId = uni.$on(readyEventName, () => { + uni.$emit(optionsEventName, JSON.parse(JSON.stringify(options))) + }) + const successEventId = uni.$on(successEventName, () => { + const res = new OpenLocationSuccessImpl() + options.success?.(res) + options.complete?.(res) + }) + const failEventId = uni.$on(failEventName, (errCode : OpenLocationErrorCode) => { + const res = new OpenLocationFailImpl(errCode) + options.fail?.(res) + options.complete?.(res) + }) + uni.openDialogPage({ + url: `/uni_modules/uni-openLocation/pages/openLocation/openLocation?readyEventName=${readyEventName}&optionsEventName=${optionsEventName}&successEventName=${successEventName}&failEventName=${failEventName}`, + fail(err) { + const res = new OpenLocationFailImpl(4) + options.fail?.(res) + options.complete?.(res) + uni.$off(readyEventName, readyEventId) + uni.$off(successEventName, successEventId) + uni.$off(failEventName, failEventId) + } + }) +};