我有一个 UIKit 应用程序(它完美地处理并执行 APNS),我添加一个
ActivityAttributes
,从而启动一个活动。
所以那就是
TestAttributes
;
注意在小部件中使用
TestWidg
;
并用作
Activity#request
中的内容。
必须以某种方式将其“放入”目标中,所以我将其放入
TestWidgBundle
中,所有代码如下。
当您
lactivities.test()
时,这一切都会完美运行。您将获得代币等,
** check true
** activity ID woot 0384DF90-795E-487A-ADAC-185203E25F22
** traverse ok
** token woot gPk5RJkfAi/dCrZG4GVc7/4E48uQ...Po3vz+9jKcD4C4qjg+M=
当然是我
等等等等
但现场活动从未出现。
当然,我在概念上做了一些错误的事情因为我实际上并没有将 Widget / WidgetBundle 放入项目中 - ???
即相关项目只有一个目标,即主要的 iOS 构建。
我在我的手机、模拟人生上运行了其他项目(例如来自网络的测试项目),这些项目清楚地显示了实时活动/快乐岛正确显示。
struct TestWidgBundle: WidgetBundle
是否需要比声明更多的东西来添加新目标,或者?
import UIKit
import ActivityKit
import WidgetKit
import SwiftUI
/// singleton for Live Activity Feat. "dynamic island" etc
let lactivities = Lactivities.shared
/// access using `lactivities.`
final class Lactivities: NSObject {
static let shared = Lactivities()
private override init() { super.init() }
///Give it a go ...
func test() {
print("** check", ActivityAuthorizationInfo().areActivitiesEnabled )
let att = TestAttributes(name: "test")
let cs = TestAttributes.ContentState(news: "test")
let cont = ActivityContent.init(state: cs, staleDate: nil, relevanceScore: 1.0)
do {
let activity = try Activity.request(attributes: att, content: cont, pushType: .token)
print("** activity ID woot", activity.id)
Task {
for await pushToken in activity.pushTokenUpdates {
print("** token woot", pushToken.base64EncodedString()
)
}
}
}
catch let error { print("** lactivity ERR!!!!", error) }
print("** traverse ok")
}
}
..和结构..
struct TestAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var news: String
}
var name: String
}
struct TestWidg: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: TestAttributes.self) { context in
SimpleView(state: context.state, stuff: context.attributes)
} dynamicIsland: { context in
DynamicIsland { DynamicIslandExpandedRegion(.bottom) {
VStack { Text(context.attributes.name) } }
} compactLeading: { Text(context.attributes.name)
} compactTrailing: { Image(systemName: "testtube.2")
} minimal: { Image(systemName: "testtube.2")
}
}
}
}
struct SimpleView: View {
let state: TestAttributes.ContentState
let stuff: TestAttributes
var body: some View {
VStack {
Text(state.news)
Text(stuff.name)
}
}
}
就是这样! ...
///Here it is!
struct TestWidgBundle: WidgetBundle {
var body: some Widget {
TestWidg()
}
}
// end of file
此信息可能会帮助人们在这里进行谷歌搜索。我真的不知道如何“用代码来做”,但作为一种解决方法,
在Xcode项目中,只需点击“添加目标->小部件”,您需要选择bothliveactivityandintent;请注意将嵌入到您的相关目标中,而不是默认目标中。
tip Xcode 示例自动化的一部分似乎不起作用:只需在主目标中,为“NameLiveActivity.swift”源文件添加编译源即可。这似乎是唯一必要的步骤。
(并且您必须在新目标中手动更新CFBundleVersion。)
如果您执行这些操作,那么问题中的代码似乎会起作用。