# Flutter SDK 使用ガイド
このガイドでは、Flutter SDK を使用してプロジェクトにアクセスする方法について説明します。アクセスを開始する前に、データルールの章データルールます。にアクセスしてGitHub (opens new window)入手できます。
最新バージョンバージョン: 2.0.2
更新時間は: 2021-12-31
# 1. SDK の初期化
# 1.1 統合数 Flutter プラグイン
Flutter プロジェクトのテキスト
に thinking_analytics 依存を
追加:
dependencies:
# 数数 Flutter 插件
thinking_analytics: ^2.0.2
# 1.2 Flutter プラグインの使用
まずはコードに数をインポートフラッターパッケージ:
import 'package:thinking_analytics/thinking_analytics.dart';
ThinkingAnalyticsAPIインスタンス
インスタンスを取得:
final ThinkingAnalyticsAPI ta = await ThinkingAnalyticsAPI.getInstance('APP_ID', 'https://SERVER_URL');
パラメータの説明:
- APP_ID:プロジェクトの APP_ID は、プロジェクトを申請するときに表示されます。TA バックエンドのプロジェクト管理ページで確認できます。ここに入力してください。
- SERVER URL:データ受信側の URL:
- クラウドサービスを使用している場合は、次の URL を入力してください
- https://receiver.ta.thinkingdata.cn
- 民営化された展開のバージョンを使用している場合は、次の URL を入力してください
- https://YOU_SERVER_URL
- クラウドサービスを使用している場合は、次の URL を入力してください
その後、ta インスタンスでta
インスタンスでデータを報告できます
// 上报一个简单事件
ta.track('simple_event');
# 1.3 その他の初期化パラメータ
SDK を構成するには、初期化時により多くの名前付けパラメーターを渡すことができます。
# タイムゾーン
デフォルトでは、すべてのデータの発生時間がネイティブ時間に設定されます。製品が複数のタイムゾーンに分散していて、指定されたタイムゾーンにデータ時間を設定する場合は、timeZone
てタイムゾーンを設定できます。timeZone
は有効なタイムゾーン文字列、例えばUTC
、Asia/Shanghai
など。
# モード
既定では、SDK は ThinkingAnalyticsMode で実行されますNORMAL
モードでは、すべてのオンラインアプリケーションをこのモードで実行する必要があります。統合フェーズのデバッグを容易にするために、SDK を DEBUG モードに設定することもできます
ThinkingAnalyticsMode.DEBUG
:データを記事ごとに報告し、詳細なエラーログThinkingAnalyticsMode.DEBUG_ONLY
:データは記事ごとに報告し、データだけを検証し、入庫しない注意:本番環境で DEBUG モードをオンにしないでください。指定されたデバイスのみが Debug モードを有効にすることができます。Debug モードは、クライアントでのみ有効になり、デバイス ID が TA バックエンドのプロジェクト情報ページ Debug モードデバイス管理で構成されているデバイスでのみ有効になります。デバイス ID は、次の 3 つの方法で取得できます。
*TA プラットフォームのイベントデータの#device_id プロパティ
*クライアントログ: SDK の初期化が完了するとデバイス DeviceId が印刷されます
*インスタンスインターフェイスを介して呼び出す:デバイス ID
# 第二に、ユーザ ID を設定
SDK はデフォルトでランダムな UUID を各ユーザーのゲスト ID として使用します。デフォルトのゲスト ID は、ユーザーがゲームを再インストールしたり、デバイスを交換したりすると変更されることに注意してください。
# 2.1 ゲスト ID の設定(オプション)
ユーザーごとに独自のゲスト ID 管理システムがある場合は、identify
を呼び出してゲスト ID を設定できます
ta.dentify('your_distinct_id');
現在のゲスト ID を取得する必要がある場合は、getDistinctId を呼び出して
取得できます
String distinctId = await ta.getDistinctId();
# 2.2 アカウント ID の設定とクリア
ユーザーがログインすると、login
を呼び出してユーザーのアカウント ID を設定できます。アカウント ID を設定した後、アカウント ID をユーザー ID とし、設定したアカウント ID は logout を呼び出すlogout
まで保持されます
// 设置账号 ID
ta.login('your_account_id');
// 清除账号 ID
ta.logout();
注意:この方法では、ユーザー登録、ユーザー登録などのイベントはアップロードされません。
# 三、アップロード事件
でtrack
イベントとそのプロパティを報告できます。一般的に、ダースから数百の異なるイベントをアップロードする必要がある場合があります。TA のバックグラウンドを初めて使用する場合は、いくつかの重要なイベントをアップロードすることをお勧めします。
# 3.1 アップロードイベント
前に整理したドキュメントに基づいて、イベントのプロパティと情報を送信する条件を設定することをお勧めします。イベント名は文字列
型で、文字のみで始まり、数字、文字、下線「_」を含めることができ、長さは最大 50 文字で、文字の大文字と小文字には敏感ではない。
ta.track('TEST_EVENT', properties: <String, dynamic>{
'PROP_INT': 5678,
'PROP_DOUBLE': 12.3,
'PROP_DATE': DateTime.now().toUtc(),
'PROP_LIST': ['apple', 'ball', 1234],
'PROP_BOOL': false,
'PROP_STRING': 'flutter test',
});
- イベントプロパティは
Map<String, dynamic>
型で、各要素はプロパティを表します - イベント属性
Key
は属性名で、String
型で、文字で始まることができ、数字、文字、下線「_」を含み、長さは最大 50 文字で、文字の大文字と小文字には敏感ではない - プロパティ値は、
String
、数値クラス、bool
、DateTime
、List
型の 5 種類
を呼び出しtrack()
とき、SDK はシステムの現在時刻をイベントの発生時刻として取り、イベント時刻を指定する必要がある場合はDateTime
型のパラメーターdateTime
を設定し、受信timeZone
はイベントのタイムゾーン情報を表します SDK はdateTime
のタイムスタンプとtimeZone
基づいて、イベント時間を表す文字列に変換します。
DateTime dateTime = DateTime.parse('2020-01-01');
ta.track('test', dateTime: dateTime, timeZone: 'UTC');
/*
原始数据示例:
{
"#type": "track",
"#time": "2019-12-31 16:00:00.000",
"#event_name": "test",
"#distinct_id": "1ed3465e-17f6-4205-8f86-2e7a2b18027b",
"properties": {
"#network_type": "WIFI",
"#app_version": "1.0",
"#zone_offset": 0
},
"#uuid": "3d74c56f-8b2c-44c4-8683-2dcb3010c231"
}
*/
注意:イベントはトリガー時間を設定できますが、受信側では、相対的なサーバー時間の 10 日前から 3 日後までのデータしか受信できず、期限を超えたデータは異常データとみなされ、データ全体が入庫できません。
# 3.2 パブリックイベントプロパティの設定
共通イベントプロパティとは、各イベントに含まれるプロパティのことです。setSuperProperties を呼び出して
共通イベントプロパティを設定できます。イベントを送信する前に、共通イベントプロパティを設定することをお勧めします。
Map<String, dynamic> superProperties = {
'SUPER_STRING': 'super string value',
'SUPER_INT': 1234,
'SUPER_DOUBLE': 66.88,
'SUPER_DATE': DateTime.now(),
'SUPER_BOOL': true,
'SUPER_LIST': [1234, 'hello', DateTime.now().toUtc()]
};
ta.setSuperProperties(superProperties);
パブリックイベントプロパティはキャッシュに保存され、APP を起動するたびに呼び出す必要はありません。を呼び出し呼び出し
アップロードした場合、以前のプロパティが上書きされます。パブリックイベントプロパティとtrack
アップロードされたプロパティのKey
場合、イベントのプロパティはパブリックイベントプロパティを上書きします。
必要がある場合は、unsetSuperProperty``呼び出して、パブリックイベントプロパティの1つをクリアできます。
// 清除属性名为 SUPER_LIST 的公共属性
ta.unsetSuperProperty('SUPER_LIST');
// 清空所有公共属性
ta.clearSuperProperties();
# 3.3 動的共通属性の設定
共通プロパティの値が定数でない場合は、動的共通プロパティを設定することで実現できます。動的共通属性もすべてのイベントに追加され、イベントが報告されると実際の報告値が動的に取得されます。動的共通属性は現在、イベントの自動収集をサポートしていません。
動的共通プロパティを設定するには、Map<String, dyanmic>
型を返す関数を渡す必要があります。
// 设置动态公共属性, 动态公共属性不支持自动采集事件
ta.setDynamicSuperProperties((){
return <String, dynamic> {
'DYNAMIC_DATE': DateTime.now().toUtc(),
'PROP_INT': 8888
};
});
注:イベントプロパティに名前が変更された場合、動的共通プロパティの優先順位は、共通イベントプロパティよりも大きく、track で設定されたイベントプロパティよりも小さくなります。
# 3.4 記録された事件の長さ
イベントの継続時間を記録する必要がある場合はtimeEvent
を呼び出してタイミングを開始し、タイミングを設定するイベント名を設定します。イベントをアップロードすると、自動的にイベントプロパティに#duration
を追加して、記録時間を秒単位で表します。
// 调用 timeEvent 开启对 TIME_EVENT 事件的计时
ta.timeEvent('TIME_EVENT');
// do some thing...
// 通过 track 上传 TIME_EVENT 事件时,会在属性中添加 #duration 属性
ta.track("TIME_EVENT");
# 四、ユーザー属性
TA プラットフォームで現在サポートされているユーザープロパティ設定インターフェイスはuserSet
、userSetOnce
、userAdd
、userUnset
、userDelete
、userAppend
.
# 4.1 ユーザーセット
通常のユーザープロパティでは、userSet
て設定できます。このインターフェイスを使用してアップロードされたプロパティは、元のプロパティ値を上書きし、以前にユーザープロパティが存在しなかった場合は、新しいユーザープロパティを作成します。
ta.userSet(<String, dynamic>{
'USER_INT': 1,
'USER_DOUBLE': 50.12,
'USER_LIST': ['apple', 'ball', 'cat', 1, DateTime.now().toUtc()],
'USER_BOOL': true,
'USER_STRING': 'a user value',
'USER_DATE': DateTime.now(),
});
イベントプロパティと同様に:
- ユーザープロパティは
Map<String, dynamic>
型で、各要素はプロパティを表します - ユーザー属性
Key
は属性名で、String
タイプで、規定は文字で始まるだけで、数字、文字と下線「_」を含み、長さは最大 50 文字で、文字の大文字と小文字に敏感ではない - ユーザープロパティ値は、
String
、数値クラス、bool
、DateTime
、List.
List.
# 4.2 ユーザー SetOnce
アップロードするユーザープロパティが一度設定されている場合は、userSetOnce を呼び出し呼び出し
て設定できます。プロパティに値がある場合は無視されます。
ta.userSetOnce(<String, dynamic>{
'USER_INT': 2,
'USER_DOUBLE': 10.12,
});
注: userSetOnce 設定のユーザープロパティの種類と制限は userSet と一致します。
# 4.3 userAdd
をアップロードするときは、userAddを
呼び出してアキュムレータ操作を実行できます。プロパティが設定されていない場合は、0 を割り当て0
てから計算します。負の値を入力します。減算操作と同じです。
ta.userAdd(<String, num>{
'USER_INT': 2,
'USER_DOUBLE': 10.1,
});
注: userAdd のプロパティタイプと Key 値の制限は userSet と一致しますが、Value では数値タイププロパティのみを報告できます。
# 4.4 userUnset
ユーザーのプロパティをリセットする必要がある場合は、userUnset
、ユーザーが指定したユーザープロパティの値を削除できます
ta.userUnset('USER_INT');
# 4.5 ユーザー削除
を削除する場合、userDelete を呼び出して
削除すると、ユーザーのユーザー属性を照会できなくなりますが、ユーザーが生成したイベントは次のように照会できます
ta.userDelete();
# 4.6 ユーザー追加
userAppend を呼び出すことこと
でList
型のユーザープロパティに要素を追加できます:
ta.userAppend(<String, List>{
'USER_LIST': [DateTime.now()],
});
# V.自動収集イベント
enableAutoTrack を呼び出して
タイプのList
タイプのList
できます。現在のサポート:
ta_app_start
:アプリケーションがフロントに入り、対応タイプはThinkingAnalyticsAutoTrackType.アプリ起動
ta_app_end
:アプリケーションはバックグラウンドに入り、対応タイプはThinkingAnalyticsAutoTrackTypeアプリ終了
ta_app_install
:インストール後初めてアプリを開き、対応タイプはThinkingAnalyticsAutoTrackType.アプリインストール
ta_app_crash
:キャプチャされていない例外が発生してアプリケーションがフラッシュされ、対応するタイプはThinkingAnalyticsAutoTrackType.アプリクラッシュ
自動収集イベントについては、注意が必要です。
- 自動収集イベントはネイティブ SDK に実装されているため、動的パブリックプロパティは自動収集イベントに追加できません。
- ゲスト ID またはパブリックプロパティを設定する必要がある場合は、自動収集イベントを有効にする前に設定を完了してください。
自動取得の例:
ta.enableAutoTrack([
ThinkingAnalyticsAutoTrackType.APP_START,
ThinkingAnalyticsAutoTrackType.APP_END,
ThinkingAnalyticsAutoTrackType.APP_INSTALL,
ThinkingAnalyticsAutoTrackType.APP_CRASH,
]);
# 六、その他のインタフェース
# 6.1 デバイス ID の取得
SDK は初期化が完了すると、デバイス ID を自動的に生成し、ローカルキャッシュに記録します。同じアプリケーション/ゲームでは、デバイスのデバイス ID は不変であり、getDeviceId を呼び出してデバイス
デバイス ID を取得できます
String deviceId = await ta.getDeviceId();
// 以设备 ID 作为访客 ID
// ta.identify(deviceId);
# 6.2 データ報告の一時停止/停止
SDK の報告を停止するインターフェイスには、次の 2 種類があります
# 6.2.1 SDK 報告の一時停止
ユーザーがテスト環境にいる場合や、ユーザーがテストアカウントにログインしている場合など、SDK のデータ収集と報告を一時的に停止したい場合は、次のインターフェイスを呼び出して SDK の報告を一時的に停止できます。
特定のインスタンス(メインインスタンスとライトインスタンスを含む)
でfalse
を呼び出して SDK の報告を一時停止#distinct_id
、#account_id
、パブリックプロパティなどを保持しますの共通属性とデバイス ID、ゲスト ID、アカウント ID などの情報。
インスタンスの停止状態はローカルキャッシュに保存され、enableTracking、enableTracking
まで、true
、SDK インスタンスはデータ収集と報告を再開します。ライトインスタンスはキャッシュされないため、APP を開くたびにライトインスタンスの一時停止状態は保持されず、報告を再開します。
// 暂停实例的上报,已缓存数据和已经设置的信息不被清除
ta.enableTracking(false);
// 恢复实例的上报
ta.enableTracking(true);
# 6.2.2 SDK 報告の停止(optOutTracking)
が適用される地域でユーザーがデータ収集権限を提供しないことを選択した場合、次のインターフェイスを呼び出して SDK を完全にシャットダウンできます。
optOutTracking
メインインスタンスからのみ呼び出すことができ、enableTracking
との最大の違いは、インスタンスのゲスト ID、アカウント ID、パブリックプロパティ、レポートされていないデータキューなど、インスタンスのローカルキャッシュを空にすることです。その後、このインスタンスの取得と報告機能をオフにします。
// 停止实例的上报, 并清空本地缓存
ta.optOutTracking();
SDK 機能をオフにしている間に TA クラスター内のユーザーデータを削除する場合は、deleteUser
パラメーターを呼び出して、SDK インスタンスの機能を停止する前にuserDelete
データを報告してユーザーデータを削除できます。
// 停止实例的上报,并发送 user_del
ta.optOutTracking(deleteUser: true);
インスタンスの停止状態もローカルキャッシュに保存され、optInTracking が呼び出される
、その後も報告を続けることができますが、この時点では新しいインスタンス
// 重新开启上报
ta.optInTracking();
# 6.3 ライトインスタンスの作成
ライトインスタンスを使用すると、同じ APP ID の下に複数のインスタンス
// 创建轻实例
ThinkingAnalyticsAPI light = await ta.createLightInstance();
// 为轻实例设置访客 ID
light.identify('light_d_id');
// 通过轻实例上报事件
light.track('TEST_EVENT_FROM_LIGHT');
注:サブライトインスタンスは、親インスタンスの APP ID、報告アドレス、および一部の設定と一致しますが、その他の情報は共有されません
# 6.4 タイムキャリブレーション
SDK はデフォルトでネイティブ時刻をイベント発生時刻として使用し、ユーザーが手動でデバイス時刻を変更するとビジネス分析に影響する場合は、v1.1.0 以降、サービス側から取得した現在のタイムスタンプを使用して SDK の時刻をキャリブレーションできます。その後、イベントデータやユーザー属性設定操作など、指定されていない時間の呼び出しはすべて、キャリブレーション後の時間を発生時間として使用します。
// 1585633785954 为当前 unix 时间戳,单位为毫秒,对应北京时间 2020-03-31 13:49:45
ThinkingAnalyticsAPI.calibrateTime(1585633785954);
NTP から時間を取得して SDK のキャリブレーションを行う機能も提供しています。ユーザーがアクセスできる NTP サーバーアドレスを渡す必要があります。その後、SDK は着信 NTP サービスアドレスから現在の時刻を取得し、SDK 時刻をキャリブレーションします。デフォルトのタイムアウト時間(3 秒)以内に正しい結果が得られない場合、その後、ローカル時間を使用してデータを報告します。
// 使用苹果公司 NTP 服务对时间进行校准
ThinkingAnalyticsAPI.calibrateTimeWithNtp("time.apple.com");
注意:
- NTP サーバーアドレスを慎重に選択して、ネットワーク状態が良好な場合、ユーザーデバイスがサーバーに到着する時間をすぐに取得できるようにします。
- NTP サービスを使用した時間キャリブレーションには不確実性があります。
# 七、関連するプリセット属性
# 7.1 プリセット属性の取得
v2.0.1 以降のバージョンでは、getPresetProperties()メソッドを呼び出して
プロパティを取得できます。
サービス側の埋め込みポイントにアプリ側のプリセット属性が必要な場合、この方法でアプリ側のプリセット属性を取得してサービス側に渡すことができます。
//获取属性对象
TDPresetProperties presetProperties = await _ta.getPresetProperties();
//生成事件预置属性
Map<String, dynamic>? eventPresetProperties = presetProperties.toEventPresetProperties();
/*
{
"#carrier": "中国电信",
"#os": "iOS",
"#device_id": "A8B1C00B-A6AC-4856-8538-0FBC642C1BAD",
"#screen_height": 2264,
"#bundle_id": "com.sw.thinkingdatademo",
"#manufacturer": "Apple",
"#device_model": "iPhone7",
"#screen_width": 1080,
"#system_language": "zh",
"#os_version": "10",
"#network_type": "WIFI",
"#zone_offset": 8
}
*/
//获取某个预置属性
String bundleId = presetProperties.bundleId;//包名
String os = presetProperties.os;//os类型,如Android、iOS
String systemLanguage = presetProperties.systemLanguage;//手机系统语言类型
int screenWidth = presetProperties.screenWidth;//屏幕宽度
int screenHeight = presetProperties.screenHeight;//屏幕高度
String deviceModel = presetProperties.deviceModel;//设备型号
String deviceId = presetProperties.deviceId;//设备唯一标识
String carrier = presetProperties.carrier;//手机SIM卡运营商信息,双卡双待时,取主卡的运营商信息
String manufacture = presetProperties.manufacturer;//手机制造商 如HuaWei、Apple
String networkType = presetProperties.networkType;//网络类型
String osVersion = presetProperties.osVersion;//系统版本号
double zoneOffset = presetProperties.zoneOffset;//时区偏移值
IP、国の都市情報はサービス側で解決して生成され、クライアントはこれらの属性を取得するインタフェース
# 8、高度な機能
v1.3.0 以降、Flutter SDK は、最初のイベント、更新可能なイベント、書き換え可能なイベントの 3 つの特別なタイプのイベントの報告をサポートしています。これらの 3 つのイベントは、TA システム 2.8 以降のバージョンで使用する必要があります。特殊なイベントは特定の場面でしか適用されないので、数値計算技術の顧客成功とアナリストの助けを得て、特殊なイベントを使ってデータを報告してください。
# 8.1 初の事件
初回イベントとは、あるデバイスや他の次元の ID に対して、一度だけ記録されるイベントです。たとえば、デバイスで最初に発生したイベントを記録したい場合は、最初のイベントでデータを報告できます。
// 示例:上报设备首次事件, 假设事件名为 DEVICE_FIRST
var properties = {
'PROP_INT': 5678,
'PROP_DOUBLE': 12.3,
'PROP_DATE': DateTime.now().toUtc(),
'PROP_LIST': ['apple', 'ball', 1234],
'PROP_BOOL': false,
'PROP_STRING': 'flutter test',
};
var firstModel = TrackFirstEventModel('DEVICE_FIRST', '', properties);
_ta.trackEventModel(firstModel);
デバイス以外の他のディメンションで初めてかどうかを判断する場合は、初めてのイベントに設定できますファーストチェック ID たとえば、アカウントの最初のイベントを記録する必要があります。アカウント ID を最初のイベントの FIRST_CHECK_ID に設定できます
// 示例:上报用户账号的首次事件, 假设事件名为 USER_FIRST
var properties = {
'PROP_INT': 5678,
'PROP_DOUBLE': 12.3,
'PROP_DATE': DateTime.now().toUtc(),
'PROP_LIST': ['apple', 'ball', 1234],
'PROP_BOOL': false,
'PROP_STRING': 'flutter test',
};
var firstModel = TrackFirstEventModel('USER_FIRST', 'YOU_ACCOUNT_ID', properties);
_ta.trackEventModel(firstModel);
注意:サービス側で初めてかどうかのチェックが完了するため、初めてのイベントはデフォルトで 1 時間遅れて入庫する。
# 8.2 更新可能イベント
更新可能なイベントを使用すると、特定のシナリオでイベントデータを変更する必要がある要件を満たすことができます。更新可能なイベントには、イベントを識別する ID を指定し、更新可能なイベントオブジェクトを作成するときに着信する必要があります。TA バックグラウンドは、イベント名とイベント ID に基づいて更新するデータを決定します。
// 示例: 上报可被更新的事件,假设事件名为 UPDATABLE_EVENT
var properties = {
'status': 3,
'price': 100
};
var updateModel = TrackUpdateEventModel('UPDATABLE_EVENT', 'test_event_id', properties);
// 上报后事件属性 status 为 3, price 为 100
_ta.trackEventModel(updateModel);
var properties_new = {
'status': 5
};
var updateModel_new = TrackUpdateEventModel('UPDATABLE_EVENT', 'test_event_id', properties_new);
// 上报后事件属性 status 被更新为 5, price 不变
_ta.trackEventModel(updateModel_new);
更新可能なイベントデフォルトでは、デバイスの現在時刻を使用して履歴データのイベント時刻を更新します。イベント時刻を指定する場合は、更新可能なイベントを報告するときにイベント時刻を指定できます
var updateModel = TrackUpdateEventModel('UPDATABLE_EVENT', 'test_event_id', {});
// 指定可更新事件的事件时间
updateModel.dateTime = DateTime.now().toUtc();
updateModel.timeZone = 'UTC';
_ta.trackEventModel(updateModel);
# 8.3 書き換え可能イベント
書き換え可能イベントは更新可能イベントと類似しており、書き換え可能イベントは最新のデータで履歴データを完全にカバーし、効果的には前のデータを削除し、最新のデータを入庫することに相当する。TA バックグラウンドは、イベント名とイベント ID に基づいて更新するデータを決定します。
// 示例: 上报可被重写的事件,假设事件名为 OVERWRITABLE_EVENT
var properties = {
'status': 3,
'price': 100
};
var overwriteModel = TrackOverwriteEventModel('OVERWRITABLE_EVENT', 'test_event_id', properties);
// 上报后事件属性 status 为 3, price 为 100
_ta.trackEventModel(overwriteModel);
var properties_new = {
'status': 5
};
var overwriteModel_new = TrackOverwriteEventModel('OVERWRITABLE_EVENT', 'test_event_id', properties_new);
// 上报后事件属性 status 为 5, price属性被删除
_ta.trackEventModel(overwriteModel_new);
書き換え可能なイベントは、デフォルトでデバイスの現在時刻を使用して履歴データのイベント時刻を書き換えます。イベント時刻を指定する場合は、書き換え可能なイベントを報告するときにイベント時刻を指定できます
var overwriteModel = TrackOverwriteEventModel('OVERWRITABLE_EVENT', 'test_event_id', {});
// 指定可重写事件的事件时间
overwriteModel.dateTime = DateTime.now().toUtc();
overwriteModel.timeZone = 'UTC';
_ta.trackEventModel(overwriteModel);
# リリースノート
# v2.0.1 2021/06/28
- プリセット属性取得のサポート
# v2.0.0 2021/05/17
- Flutter2.0 に適合
# v1.3.3 2020/10/29
- iOS 5G ネットワークに適応
- 最適化 install, start イベント報告ロジック
- データ転送フォーマットの最適化
- デフォルトのネットワーク報告ポリシーは、2G/3G/4G/5G/WIFI
# v1.3.2 2020/08/25
- timeZone が設定されていない特別なイベントがエラーを報告する#zone_offset の問題を修正.
# v1.3.0 2020/08/24
- 最初のイベントをサポートし、着信カスタム ID が最初に報告されたかどうかをチェック
- 更新可能で書き換え可能なイベントをサポート
# v1.2.1 2020/06/28
- コードの最適化:極端な場合の null ポインタ例外
# v1.2.0 2020/06/23
- Debug モードを最適化し、バックグラウンドの埋め込みポイント管理
- #system_language プロパティのサポート
# v1.1.1 2020/04/14
- Android プラットフォーム DEBUG モードでのイベントアップロードのバグを修正
# v1.1.0 2020/04/03
- サーバータイムを使用した SDK タイムのキャリブレーション
# v1.0.0 2020/03/10
- サポートイベントとユーザー属性データの報告
- マルチインスタンスとライトインスタンスをサポート
- 共通イベントプロパティと動的共通プロパティ
- 自動イベント収集のサポート
- デバッグモードのサポート
- デフォルトタイムゾーンの設定