跳转到主要内容
实时活动是iOS相对较新的功能,需要原生实现,在使用React Native、Flutter、Unity、Cordova等跨平台框架时可能会遇到挑战。为了简化这个过程,OneSignal的SDK包含了最小化原生代码要求的功能,支持在支持的平台上简化实时活动集成。

要求

  • 我们SDK的最新版本。
  • iOS 16.1+ 和 iPadOS 17+
  • 使用.p8 APNs密钥。苹果不支持实时活动的p12证书。
  • Xcode 14或更高版本

设置

1. 设置我们的SDK

确保您已在应用上设置了最新版本的移动SDK。实时活动不适用于网站或我们的Web SDK。

2. 添加新的setupDefault方法

为了告诉OneSignal SDK管理DefaultLiveActivityAttributes类型的实时活动生命周期,您可以调用setupDefault方法。此方法允许您使用启动实时活动更新实时活动 API来启动/更新/结束默认实时活动。
import { OneSignal } from 'react-native-onesignal'

//推送启动
OneSignal.LiveActivities.setupDefault()

//从应用内启动实时活动(推送启动不需要)
const activityId = "my_activity_id"
const attributes = { title: "示例标题" } ;
const content = { message: { en: "消息" } };
OneSignal.LiveActivities.startDefault(activityId, attributes, content);

3. 创建活动小组件

1

更新您的Info.plist

在Xcode中,打开主目标的Info.plist,添加键Supports Live Activities作为Boolean,并将其设置为YES

在Info中添加支持实时活动键并将其值设置为Boolean YES

更新实时活动时,您可以设置”优先级”,苹果使用该优先级来确定更新的紧急程度。苹果有内部阈值,会限制过于频繁使用高优先级标志的请求。如果您的实时活动用例需要更频繁的高优先级更新,您可以根据苹果开发者文档的指导,将键NSSupportsLiveActivitiesFrequentUpdates作为Boolean类型设置为YES添加到Info.plist中。当实时活动超出其推送预算时,用户将看到对话框,如果他们允许实时活动继续,预算将自动增加以提供无缝的用户体验。
2

创建Widget扩展

在Xcode中,转到File > New > Target… > Widget Extension

在Xcode中为应用添加新的Widget扩展目标。

选择并按Next通过提供名称(示例:OneSignalWidget)配置Widget扩展,并确保选择Include Live Activity。然后点击Finish

实时活动的Widget扩展选项。

如果提示激活方案,点击Don’t Activate

实时活动的Widget扩展选项。

3

将OneSignalXCFramework添加到Podfile

在项目的Targets列表中找到您的widget扩展目标名称。示例名称为OneSignalWidgetExtension

找到您的widget扩展目标名称

打开您的Podfile并添加以下代码。将OneSignalWidgetExtension替换为您的widget扩展目标名称。
Podfile
target 'OneSignalWidgetExtension' do
  #use_frameworks!
  pod 'OneSignalXCFramework', '>= 5.0.0', '< 6.0'
end
关闭Xcode并运行pod repo update && pod install以安装OneSignalLiveActivities pod。

4. 设置LiveActivity.swift文件

在Xcode中,打开_WidgetExtensionLiveActivity.swift_文件。 在屏幕右侧打开检查器面板。在目标成员中,点击**+**按钮并选择您的Runner目标。

允许主目标成员

使用以下默认实时活动布局更新_WidgetExtensionLiveActivity.swift_的内容。此Widget中的值可以更改为您希望在widget上显示的任何内容,setupDefault方法将处理为这些属性定义结构。
Swift
import ActivityKit
import WidgetKit
import SwiftUI
import OneSignalLiveActivities

// 您的结构名称在这里可能不同
@available(iOS 16.2, *)
struct OneSignalWidgetLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: DefaultLiveActivityAttributes.self) { context in
            // 锁屏/横幅UI
            VStack {
                Spacer()

                Text("标题: " + (context.attributes.data["title"]?.asString() ?? ""))
                    .font(.headline)

                Spacer()

                HStack {
                    Spacer()
                    Text(context.state.data["message"]?.asDict()?["en"]?.asString() ?? "默认消息")
                    Spacer()
                }

                Text("INT: " + String(context.state.data["intValue"]?.asInt() ?? 0))
                Text("DBL: " + String(context.state.data["doubleValue"]?.asDouble() ?? 0.0))
                Text("BOL: " + String(context.state.data["boolValue"]?.asBool() ?? false))

                Spacer()
            }
            .activitySystemActionForegroundColor(.black)
            .activityBackgroundTint(.white)

        } dynamicIsland: { _ in
            DynamicIsland {
                // 扩展UI
                DynamicIslandExpandedRegion(.leading) {
                    Text("前导")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("尾随")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("底部")
                    // 更多内容
                }
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T")
            } minimal: {
                Text("最小")
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}


测试实时活动

  1. 启动应用
  2. 查看我们启动实时活动API参考中的所有可能字段。这些字段的结构可能因您设置UI的方式而有所不同。例如:
  • "event_updates":这是实时活动启动后可以更新的动态数据(代码示例中context.state之后的任何内容)。由于我们有context.state.data,我们会向此字段添加数据对象以及我们在代码示例中添加的消息字典等任何其他字段。使用方法请参见下面的示例请求。
  • "event_attributes":这是在推送启动请求中设置的静态数据,在实时活动被移除或覆盖之前保持相同的值。
  1. 使用推送启动时,您在请求中设置"activity_id",而不是在代码中。使用不同的活动ID将启动新的实时活动。使用相同的活动ID将覆盖当前使用该ID的widget。
  2. 确保您已更改URL路径中的OneSignal应用ID和Authorization头中的Rest API密钥。如果您使用默认设置,则无法更改DefaultActivityAttributes类型。另请注意,添加到路径的活动类型区分大小写,应与您定义的内容或下面示例中使用的默认活动匹配。
curl
curl --request POST \
     --url https://api.onesignal.com/apps/YOUR_APP_ID/activities/activity/DefaultLiveActivityAttributes \
     --header 'Authorization: key YOUR_REST_API_KEY' \
     --header 'Content-Type: application/json' \
     --header 'accept: application/json' \
     --data '
{
  "event": "start",
  "event_updates": {
    "data": {
      "message": {
        "en": "消息嵌套在context.state.data[\"message\"]中作为字典"
      },
      "intValue": 10,
      "doubleValue": 3.14,
      "boolValue": true
    }
  },
  "event_attributes": {
    "title": "这在LA启动时设置,之后不会更新"
  },
  "activity_id": "my-activity-id",
  "name": "OneSignal通知名称",
  "contents": {
    "en": "英文消息"
  },
  "headings": {
    "en": "英文消息"
  },
  "sound": "beep.wav",
  "priority": 10
}'

低级方法

如果您想生成自己的推送启动令牌,这些是可选方法,这也已在SDK的最新版本中添加。使用这些方法需要您与Xcode进行更多交互,并使用Swift为推送启动生成自己的令牌。您可以在这里找到相关指南。
//设置推送启动令牌
OneSignal.LiveActivities.setPushToStartToken(activityType: string, token: string)

//移除推送启动令牌
OneSignal.LiveActivities.removePushToStartToken(activityType: string)


I