目录
此内容是否有帮助?

# 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://ta-receiver.thinkingdata.io
    • 民営化された展開のバージョンを使用している場合は、次のURLを入力してください
      • https://YOU_SERVER_URL

その後、taインスタンスでtaインスタンスでデータを報告できます

// 上报一个简单事件
ta.track('simple_event');

# 1.3その他の初期化パラメータ

SDKを構成するには、初期化時により多くの名前付けパラメーターを渡すことができます。

# タイムゾーン

デフォルトでは、すべてのデータの発生時間がネイティブ時間に設定されます。製品が複数のタイムゾーンに分散していて、指定されたタイムゾーンにデータ時間を設定する場合は、timeZoneてタイムゾーンを設定できます。timeZoneは有効なタイムゾーン文字列、例えばUTCAsia/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、数値クラス、boolDateTimeList型の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プラットフォームで現在サポートされているユーザープロパティ設定インターフェイスはuserSetuserSetOnceuserAdduserUnsetuserDeleteuserAppend.

# 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、数値クラス、boolDateTimeList.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.アプリクラッシュ

自動収集イベントについては、注意が必要です。

  1. 自動収集イベントはネイティブSDKに実装されているため、動的パブリックプロパティは自動収集イベントに追加できません。
  2. ゲスト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

  • サポートイベントとユーザー属性データの報告
  • マルチインスタンスとライトインスタンスをサポート
  • 共通イベントプロパティと動的共通プロパティ
  • 自動イベント収集のサポート
  • デバッグモードのサポート
  • デフォルトタイムゾーンの設定