目前 灵动岛扩展以写好并打包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()
}
7 个回复
Ask小助手
在 uni-app 里想“驱动”你已经做好的灵动岛扩展(widgetExtension.appex),只能通过 uts 插件 把 Swift 的 ActivityKit 能力再封装一层暴露给前端。
思路分三步:
uni.requireNativePlugin('插件id')拿到这个 module,然后像调普通 JS 方法一样调用。下面给出最小可跑的示例,直接照抄即可用。
一、uts 插件目录(uni_modules/live-activity)
二、LiveActivityModule.swift(关键代码)
三、LiveActivityModule.uts(声明文件,让前端能识别)
四、前端调用(任意 vue/nvue 页面)
五、打包验证
uni_modules/xxx/ios/Plugins/下即可,uni-app 会自动拷贝到 ipa 的 PlugIns 目录。至此,前端就能通过 uts 插件直接调用你写好的灵动岛扩展的所有能力了。
a***@lanxiniu.com (作者)
index.uts 不需要吗
a***@lanxiniu.com (作者)
TypeError: undefined is not an object (evaluating '_lxnWidget.default.startActivity')
按照上面方案调用报错
DCloud_heavensoft
你可以用Uni Agent帮你翻译,但它需要HBuilder X 5.0。
a***@lanxiniu.com (作者)
能出一个完整些的demo吗Uts插件调用灵动widget extension 的部分
a***@lanxiniu.com (作者)
怎么让主工程与扩展直接共享?现在插件编译找不到扩展中的类: widgetAttributes 需在主应用和 Widget 扩展中共享。 就是在xcode中原生工程Target Membership 的操作
17:35:50.710 uts插件[lxn-widget]编译失败
17:35:50.715 error: 'Activity' is only available in iOS 16.1 or newer
17:35:50.715 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:15:24
17:35:50.715 13 |
17:35:50.715 14 | public class WidgetExtension {
17:35:50.715 15 | private var activity: Activity<widgetAttributes>? = nil
17:35:50.715 | ^
17:35:50.715 16 |
17:35:50.715 17 | func startActivity(){
17:35:50.715 error: 'Activity' is only available in iOS 16.1 or newer
17:35:50.715 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:15:24
17:35:50.715 13 |
17:35:50.715 14 | public class WidgetExtension {
17:35:50.715 15 | private var activity: Activity<widgetAttributes>? = nil
17:35:50.715 | ^
17:35:50.715 16 |
17:35:50.715 17 | func startActivity(){
17:35:50.715 error: 'Activity' is only available in iOS 16.1 or newer
17:35:50.715 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:20:26
17:35:50.715 18 | let attributes = widgetAttributes();
17:35:50.715 19 | let state = widgetAttributes.ContentState(step: 1);
17:35:50.715 20 | activity = try? Activity<widgetAttributes>.request(attributes: attributes, content: .init(state: state, staleDate: nil))
17:35:50.715 | ^
17:35:50.715 21 | }
17:35:50.715 22 |
17:35:50.715 error: 'request(attributes:content:pushType:)' is only available in iOS 16.2 or newer
17:35:50.716 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:20:53
17:35:50.716 18 | let attributes = widgetAttributes();
17:35:50.716 19 | let state = widgetAttributes.ContentState(step: 1);
17:35:50.716 20 | activity = try? Activity<widgetAttributes>.request(attributes: attributes, content: .init(state: state, staleDate: nil))
17:35:50.716 | ^
17:35:50.716 21 | }
17:35:50.716 22 |
17:35:50.716 error: 'ActivityContent' is only available in iOS 16.2 or newer
17:35:50.716 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:25:24
17:35:50.716 23 | func updateActivity(step:Int){
17:35:50.716 24 | let state = widgetAttributes.ContentState(step: step)
17:35:50.716 25 | let content = ActivityContent(state:state,staleDate:nil)
17:35:50.716 | ^
17:35:50.716 26 |
17:35:50.716 27 | Task{
17:35:50.716 error: 'Task' is only available in iOS 13.0 or newer
17:35:50.716 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:27:10
17:35:50.716 25 | let content = ActivityContent(state:state,staleDate:nil)
17:35:50.716 26 |
17:35:50.716 27 | Task{
17:35:50.716 | ^
17:35:50.716 28 | await activity?.update(content)
17:35:50.716 29 | }
17:35:50.716 error: 'init(name:priority:operation:)' is only available in iOS 13.0 or newer
17:35:50.716 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:27:10
17:35:50.716 25 | let content = ActivityContent(state:state,staleDate:nil)
17:35:50.716 26 |
17:35:50.716 27 | Task{
17:35:50.716 | ^
17:35:50.716 28 | await activity?.update(content)
17:35:50.716 29 | }
17:35:50.716 error: 'update' is only available in iOS 16.2 or newer
17:35:50.716 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:28:30
17:35:50.716 26 |
17:35:50.716 27 | Task{
17:35:50.716 28 | await activity?.update(content)
17:35:50.716 | ^
17:35:50.716 29 | }
17:35:50.716 30 |
17:35:50.716 error: 'Task' is only available in iOS 13.0 or newer
17:35:50.716 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:35:10
17:35:50.716 33 | func endActivity(){
17:35:50.716 34 | let state = widgetAttributes.ContentState(step: 3)
17:35:50.716 35 | Task{
17:35:50.716 | ^
17:35:50.716 36 | await activity?.end(.init(state:state,staleDate:nil) )
17:35:50.716 37 | }
17:35:50.716 error: 'init(name:priority:operation:)' is only available in iOS 13.0 or newer
17:35:50.716 at unimodules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:35:10
17:35:50.716 33 | func endActivity(){
17:35:50.716 34 | let state = widgetAttributes.ContentState(step: 3)
17:35:50.716 35 | Task{
17:35:50.716 | ^
17:35:50.716 36 | await activity?.end(.init(state:state,staleDate:nil) )
17:35:50.716 37 | }
17:35:50.716 error: 'end(:dismissalPolicy:)' is only available in iOS 16.2 or newer
17:35:50.716 at uni_modules/lxn-widget/utssdk/app-ios/WidgetExtension.swift:36:30
17:35:50.716 34 | let state = widgetAttributes.ContentState(step: 3)
17:35:50.716 35 | Task{
17:35:50.716 36 | await activity?.end(.init(state:state,staleDate:nil) )
17:35:50.717 | ^
17:35:50.717 37 | }
swift类代码:import Foundation
import ActivityKit
/// ActivityAttributes 需在主应用和 Widget 扩展间共享,用于 Live Activity 数据传递
public struct widgetAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
public let step: Int
public init(step: Int) {
self.step = step
}
}
}
public class WidgetExtension {
private var activity: Activity<widgetAttributes>? = nil
}
8***@qq.com
问题解决了吗,startActivity 启动灵动岛,不显示
要回复问题请先登录或注册
公告
更多>相关问题