a***@lanxiniu.com
a***@lanxiniu.com
  • 发布:2026-02-27 10:19
  • 更新:12 分钟前
  • 阅读:44

咨询下uts插件怎么调用appex内扩展方法使用灵动岛功能

分类:uts

目前 灵动岛扩展以写好并打包ipa把plugins 的 widgetExtension.appex 原生部分已经导入 app-iOS的plugins

问如何调用它内部的方法????

这个是原生使用的方法

//
// ContentView.swift
// housemoving
//
// Created by wangdekuan on 2026/2/26.
//

import SwiftUI
import ActivityKit

struct ContentView: View {
@State private var activity:Activity<widgetAttributes>? = nil
var body: some View {
VStack {
Button(action: {
startActivity()
}, label: {
Text("第一阶段").frame(width:200)
.foregroundColor(.white)
}).padding().background(.blue).cornerRadius(10)

// Button(action: {
// updateActivity(step: 2)
// }, label: {
// Text("第二阶段").frame(width:200)
// .foregroundColor(.white)
// }).padding().background(.blue).cornerRadius(10)
//
// Button(action: {
// updateActivity(step: 3)
// }, label: {
// Text("第三阶段").frame(width:200)
// .foregroundColor(.white)
// }).padding().background(.blue).cornerRadius(10)
//
// Button(action: {
// endActivity()
// }, label: {
// Text("结束").frame(width:200)
// .foregroundColor(.white)
// }).padding().background(.red).cornerRadius(10)
}
.padding()
}

func startActivity(){  
    let attributes = widgetAttributes();  
    let state = widgetAttributes.ContentState(step: 1);  
    activity = try? Activity<widgetAttributes>.request(attributes: attributes, content: .init(state: state, staleDate: nil))  
}  

func updateActivity(step:Int){  
    let state = widgetAttributes.ContentState(step: step)  
    let content = ActivityContent(state:state,staleDate:nil)  

    Task{  
        await activity?.update(content)  
    }  

}  

func endActivity(){  
    let state = widgetAttributes.ContentState(step: 3)  
    Task{  
        await activity?.end(.init(state:state,staleDate:nil) )  
    }  
}  

}

Preview {

ContentView()  

}

2026-02-27 10:19 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

在 uni-app 里想“驱动”你已经做好的灵动岛扩展(widgetExtension.appex),只能通过 uts 插件 把 Swift 的 ActivityKit 能力再封装一层暴露给前端。
思路分三步:

  1. 在 uts 插件里新建一个 module,把 Swift 的启动 / 更新 / 结束 Live Activity 的代码写成同步或异步接口。
  2. 前端用 uni.requireNativePlugin('插件id') 拿到这个 module,然后像调普通 JS 方法一样调用。
  3. 把 widgetExtension.appex 继续放在 app-ios/Plugins 目录即可,uni-app 打包时会自动合并进 ipa,无需额外配置。

下面给出最小可跑的示例,直接照抄即可用。


一、uts 插件目录(uni_modules/live-activity)

live-activity  
├─ uni_modules.json  
├─ ios  
│  ├─ Classes  
│  │  ├─ LiveActivityModule.swift   // 原生实现  
│  │  └─ LiveActivityModule.uts     // 声明文件  
│  └─ Plugins  
│     └─ widgetExtension.appex      // 你已经做好的扩展  
└─ package.json

二、LiveActivityModule.swift(关键代码)

import Foundation  
import ActivityKit  
import UniApp  

@objc(LiveActivityModule)  
class LiveActivityModule : NSObject, DCUniModule {  

    private var activity: Activity<widgetAttributes>? = nil  

    // MARK: - 启动  
    @objc func startActivity(_ arguments: [Any],  
                             callback: @escaping UniModuleKeepAliveCallback) {  
        let attributes = widgetAttributes()  
        let state = widgetAttributes.ContentState(step: 1)  
        do {  
            activity = try Activity<widgetAttributes>.request(  
                attributes: attributes,  
                content: .init(state: state, staleDate: nil)  
            )  
            callback(["success": true, "id": activity!.id], false)  
        } catch {  
            callback(["success": false, "error": error.localizedDescription], false)  
        }  
    }  

    // MARK: - 更新  
    @objc func updateActivity(_ arguments: [Any],  
                              callback: @escaping UniModuleKeepAliveCallback) {  
        guard let step = arguments.first as? Int else {  
            callback(["success": false, "error": "step 参数缺失"], false)  
            return  
        }  
        let state = widgetAttributes.ContentState(step: step)  
        let content = ActivityContent(state: state, staleDate: nil)  
        Task {  
            await activity?.update(content)  
            callback(["success": true], false)  
        }  
    }  

    // MARK: - 结束  
    @objc func endActivity(_ arguments: [Any],  
                           callback: @escaping UniModuleKeepAliveCallback) {  
        let state = widgetAttributes.ContentState(step: 3)  
        Task {  
            await activity?.end(.init(state: state, staleDate: nil))  
            activity = nil  
            callback(["success": true], false)  
        }  
    }  
}

三、LiveActivityModule.uts(声明文件,让前端能识别)

declare module 'live-activity' {  
  interface LiveActivityModule {  
    startActivity(callback: (res: { success: boolean; id?: string; error?: string }) => void): void  
    updateActivity(step: number, callback: (res: { success: boolean; error?: string }) => void): void  
    endActivity(callback: (res: { success: boolean }) => void): void  
  }  
  const liveActivity: LiveActivityModule  
  export default liveActivity  
}

四、前端调用(任意 vue/nvue 页面)

<template>  
  <view>  
    <button type="primary" @click="start">启动灵动岛</button>  
    <button type="primary" @click="update">更新到第 2 阶段</button>  
    <button type="warn" @click="end">结束灵动岛</button>  
  </view>  
</template>  

<script lang="uts">  
import liveActivity from 'live-activity'  

export default {  
  methods: {  
    start() {  
      liveActivity.startActivity(res => {  
        uni.showToast({ title: res.success ? '已启动' : res.error })  
      })  
    },  
    update() {  
      liveActivity.updateActivity(2, res => {  
        uni.showToast({ title: res.success ? '已更新' : res.error })  
      })  
    },  
    end() {  
      liveActivity.endActivity(res => {  
        uni.showToast({ title: '已结束' })  
      })  
    }  
  }  
}  
</script>

五、打包验证

  • HBuilderX → 发行 → 原生 App-云打包 / 本地打包均可。
  • 确保 manifest.json → app-plus → distribute → ios → capabilities 里勾选了 Live Activities(Xcode 里对应的是 Live Activities 开关)。
  • widgetExtension.appex 放在 uni_modules/xxx/ios/Plugins/ 下即可,uni-app 会自动拷贝到 ipa 的 PlugIns 目录。

至此,前端就能通过 uts 插件直接调用你写好的灵动岛扩展的所有能力了。

内容为 AI 生成,仅供参考
a***@lanxiniu.com

a***@lanxiniu.com (作者)

index.uts 不需要吗

a***@lanxiniu.com

a***@lanxiniu.com (作者)

TypeError: undefined is not an object (evaluating '_lxnWidget.default.startActivity')

按照上面方案调用报错

DCloud_heavensoft

DCloud_heavensoft

你可以用Uni Agent帮你翻译,但它需要HBuilder X 5.0。

a***@lanxiniu.com

a***@lanxiniu.com (作者)

能出一个完整些的demo吗Uts插件调用灵动widget extension 的部分

要回复问题请先登录注册