丰厚的赏金:对于实时活动,我如何将我的小部件包 WidgetBundle“放入”目标中

问题描述 投票:0回答:1

我有一个 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=

当然是我

example image shows info.plist settings

等等等等

但现场活动从未出现。

当然,我在概念上做了一些错误的事情因为我实际上并没有将 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
swiftui uikit swift5 widgetliveactivity dynamic-island
1个回答
0
投票

此信息可能会帮助人们在这里进行谷歌搜索。我真的不知道如何“用代码来做”,但作为一种解决方法,

  • 在Xcode项目中,只需点击“添加目标->小部件”,您需要选择bothliveactivityandintent;请注意将嵌入到您的相关目标中,而不是默认目标中。

  • tip Xcode 示例自动化的一部分似乎不起作用:只需在主目标中,为“NameLiveActivity.swift”源文件添加编译源即可。这似乎是唯一必要的步骤。

(并且您必须在新目标中手动更新CFBundleVersion。)

如果您执行这些操作,那么问题中的代码似乎会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.