diff --git a/README.md b/README.md
index 6433f48ec..69f70e86a 100644
--- a/README.md
+++ b/README.md
@@ -4,6 +4,8 @@ This is the iOS SDK of Adjust™. You can read more about Adjust™ at [adjust.c
If your app is an app which uses web views you would like to use adjust tracking from Javascript code, please consult our [iOS web views SDK guide][ios-web-views-guide].
+Read this in other languages: [English][en-readme], [中文][zh-readme], [日本語][ja-readme], [한국어][ko-readme].
+
## Table of contents
* [Example apps](#example-apps)
@@ -994,6 +996,11 @@ If you are seing any value in the dashboard other than what you expected to be t
[dashboard]: http://adjust.com
[adjust.com]: http://adjust.com
+[en-readme]: README.md
+[zh-readme]: doc/chinese/README.md
+[ja-readme]: doc/japanese/README.md
+[ko-readme]: doc/korean/README.md
+
[arc]: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
[examples]: http://github.com/adjust/ios_sdk/tree/master/examples
[carthage]: https://github.com/Carthage/Carthage
@@ -1036,15 +1043,14 @@ If you are seing any value in the dashboard other than what you expected to be t
[xcode-associated-domains]: https://raw.github.com/adjust/sdks/master/Resources/ios/xcode-associated-domains5.png
[universal-links-dashboard]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard5.png
-[associated-domains-applinks]: https://raw.github.com/adjust/sdks/master/Resources/ios/associated-domains-applinks.png
+[associated-domains-applinks]: https://raw.github.com/adjust/sdks/master/Resources/ios/associated-domains-applinks.png
[universal-links-dashboard-values]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard-values5.png
## License
The Adjust SDK is licensed under the MIT License.
-Copyright (c) 2012-2018 adjust GmbH,
-http://www.adjust.com
+Copyright (c) 2012-2019 Adjust GmbH, http://www.adjust.com
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
diff --git a/doc/chinese/README.md b/doc/chinese/README.md
new file mode 100644
index 000000000..8555a779d
--- /dev/null
+++ b/doc/chinese/README.md
@@ -0,0 +1,1075 @@
+## 摘要
+
+这是Adjust™的iOS SDK包。您可以访问[adjust.com]了解更多有关Adjust™的信息。
+
+如果您的应用正在使用web views,您希望Adjust通过Javascript代码跟踪,请参阅我们的[ios-web-views SDK指南][ios-web-views-guide]。
+
+Read this in other languages: [English][en-readme], [中文][zh-readme], [日本語][ja-readme], [한국어][ko-readme].
+
+## 目录
+
+* [应用示例](#example-apps)
+* [基本集成](#basic-integration)
+ * [添加SDK至您的项目](#sdk-add)
+ * [添加iOS框架](#sdk-frameworks)
+ * [集成SDK至您的应用](#sdk-integrate)
+ * [基本设置](#basic-setup)
+ * [iMessage 的特定设置](#basic-setup-imessage)
+ * [Adjust日志](#adjust-logging)
+ * [构建您的应用](#build-the-app)
+* [附加功能](#additional-features)
+ * [事件跟踪](#event-tracking)
+ * [收入跟踪](#revenue-tracking)
+ * [收入重复数据删除](#revenue-deduplication)
+ * [应用收入验证](#iap-verification)
+ * [回调参数](#callback-parameters)
+ * [合作伙伴参数](#partner-parameters)
+ * [回调ID](#callback-id)
+ * [会话参数](#session-parameters)
+ * [会话回调参数](#session-callback-parameters)
+ * [会话合作伙伴参数](#session-partner-parameters)
+ * [延迟启动](#delay-start)
+ * [归因回传](#attribution-callback)
+ * [会话和事件回传](#event-session-callbacks)
+ * [禁用跟踪](#disable-tracking)
+ * [离线模式](#offline-mode)
+ * [事件缓冲](#event-buffering)
+ * [GDPR 的被遗忘权](#gdpr-forget-me)
+ * [SDK签名](#sdk-signature)
+ * [后台跟踪](#background-tracking)
+ * [设备ID](#device-ids)
+ * [iOS广告ID](#di-idfa)
+ * [Adjust设备ID](#di-adid)
+ * [用户归因](#user-attribution)
+ * [推送标签(Push token)](#push-token)
+ * [预安装跟踪码](#pre-installed-trackers)
+ * [深度链接](#deeplinking)
+ * [标准深度链接场景](#deeplinking-standard)
+ * [iOS 8及以下版本的深度链接设置](#deeplinking-setup-old)
+ * [iOS 9及以上版本的深度链接设置](#deeplinking-setup-new)
+ * [延迟深度链接场景](#deeplinking-deferred)
+ * [通过深度链接的再归因](#deeplinking-reattribution)
+* [故障排查](#troubleshooting)
+ * [SDK延迟初始化问题](#ts-delayed-init)
+ * [显示 "Adjust requires ARC" 出错信息](#ts-arc)
+ * [显示 "\[UIDevice adjTrackingEnabled\]: unrecognized selector sent to instance" 出错信息](#ts-categories)
+ * [显示 "Session failed (Ignoring too frequent session.)" 出错信息](#ts-session-failed)
+ * [日志未显示 "Install tracked"](#ts-install-tracked)
+ * [显示 "Unattributable SDK click ignored" 信息](#ts-iad-sdk-click)
+ * [Adjust控制面板显示错误收入金额](#ts-wrong-revenue-amount)
+* [许可协议](#license)
+
+## 应用示例
+
+[`examples` 目录][examples] 内有[`iOS (Objective-C)`][example-ios-objc]、[`iOS (Swift)`][example-ios-swift]、[`tvOS`][example-tvos]、 [`iMessage`][example-imessage] 和[`Apple Watch`][example-iwatch]的应用示例。 您可以打开任何一个Xcode项目查看集成Adjust SDK的例子。
+
+## 基本集成
+
+我们将介绍把Adjust SDK集成到您的iOS项目中的步骤。我们假定您将Xcode用于iOS开发。
+
+### 添加SDK至您的项目
+
+如果您正在使用[CocoaPods][cocoapods],您可以将以下代码行添加至 `Podfile`,然后继续进行[此步骤](#sdk-integrate):
+
+```ruby
+pod 'Adjust', '~> 4.17.1'
+```
+
+或:
+
+```ruby
+pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.17.1'
+```
+
+---
+
+如您正在使用[Carthage][carthage], 您可以将以下代码行添加至 `Cartfile`,然后继续进行[此步骤](#sdk-frameworks):
+
+```ruby
+github "adjust/ios_sdk"
+```
+
+---
+
+您也可以把Adjust SDK作为框架添加至您的项目中,来进行集成。在[发布专页][releases] ,您可以找到以下文档:
+
+* `AdjustSdkStatic.framework.zip`
+* `AdjustSdkDynamic.framework.zip`
+* `AdjustSdkTv.framework.zip`
+* `AdjustSdkIm.framework.zip`
+
+自iOS 8发布后, Apple引进了动态框架(dynamic frameworks),又名嵌入框架 (embedded frameworks)。
+如果您的应用目标受众为iOS 8或以上版本,您可以使用Adjust SDK动态框架。请先选择框架类型 – 静态或动态 – 再添加到您的项目中。
+
+如果您正在使用`tvOS` 应用, 您可以使用Adjust SDK,也可使用我们的 tvOS 框架,该框架可从`AdjustSdkTv.framework.zip` 文档中提取。
+
+如果您正在使用`iMessage` 应用, 您可以使用Adjust SDK,也可使用我们的 IM 框架,该框架可从`AdjustSdkIm.framework.zip` 文档中提取。
+
+### 添加iOS框架
+
+1. 在项目导航(Project Navigator)中选择您的项目
+2. 在主视图的左侧选择目标
+3. 在选项`Build Phases`(构建阶段)中,扩展组`Link Binary with Libraries`(将二进制与库连接)
+4. 在该部分底部点击`+`按钮
+5. 选择`AdSupport.framework`,点击`Add`按钮
+6. 除非您正在使用tvOS,否则重复同样步骤来添加`iAd.framework`和`CoreTelephony.framework`
+7. 将两个框架的`Status`均改为`Optional`
+
+### 集成SDK至您的应用
+
+如果您从Pod库添加Adjust SDK, 请从以下导入语句中选一使用:
+
+```objc
+#import "Adjust.h"
+```
+
+或
+
+```objc
+#import
+```
+
+---
+
+如果您是以静态/动态框架(static/dynamic framework)或者经Carthage添加Adjust SDK,请使用以下导入语句:
+
+```objc
+#import
+```
+
+---
+
+如果您在tvOS应用中使用Adjust SDK, 请使用以下导入语句:
+
+```objc
+#import
+```
+---
+
+如果您在iMessage应用中使用Adjust SDK, 请使用以下导入语句:
+
+```objc
+#import
+```
+
+接下来,我们将设置基本会话跟踪。
+
+### 基本设置
+
+在项目导航中,打开您的application delegate(应用委托)源文件。在文件顶部添加`import`(导入)语句,然后在应用委托的`didFinishLaunching`或`didFinishLaunchingWithOptions`方法中,将以下调用添加至`Adjust`:
+
+```objc
+#import "Adjust.h"
+// or #import
+// or #import
+// or #import
+// or #import
+
+// ...
+
+NSString *yourAppToken = @"{YourAppToken}";
+NSString *environment = ADJEnvironmentSandbox;
+ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken
+ environment:environment];
+
+[Adjust appDidLaunch:adjustConfig];
+```
+
+![][delegate]
+
+**注意**: Adjust SDK初始化设置是`非常重要`的。 否则,您有可能会遇到 [故障排除](#ts-delayed-init)中描述的多种问题。
+
+用您的应用识别码(app token)替换`{YourAppToken}`。您可在[控制面板]中找到应用识别码。
+
+取决于您的应用制作是用于测试或产品开发目的,您必须将`environment`(环境模式)设为以下值之一:
+
+```objc
+NSString *environment = ADJEnvironmentSandbox;
+NSString *environment = ADJEnvironmentProduction;
+```
+
+**重要:** 仅当您或其他人测试您的应用时,该值应设为`ADJEnvironmentSandbox`。在您发布应用之前,请确保将环境设为`ADJEnvironmentProduction`。再次开始研发和测试时,将其设回`ADJEnvironmentSandbox`。
+
+我们按照设置的环境来区分真实流量和测试设备的测试流量。非常重要的是,您必须始终让该值保持有意义!这一点在您进行收入跟踪时尤为重要。
+
+### iMessage 的特定设置
+
+**从源代码添加 SDK:** 如果您选择**从源代码**添加 Adjust SDK 到 iMessage 应用,请确保您已在 iMessage 项目设置中设置了预处理宏**ADJUST_IM=1**。
+
+**将 SDK 作为框架添加:** 在您将`AdjustSdkIm.framework`添加到 iMessage 应用后,请确保在`Build Phases`项目设置中添加`New Copy Files Phase`并选择将`AdjustSdkIm.framework`复制到`Frameworks`文件夹。
+
+**会话跟踪:** 如果您希望在 iMessage 应用中正常使用会话跟踪功能,则需要执行额外的集成步骤。 在标准 iOS 应用中,Adjust SDK 会自动订阅 iOS 系统通知,让我们能够知晓应用进入或离开前台的时间。在 iMessage 应用的情况则有所不同,您需要在 iMessage 应用视图控制器中添加对`trackSubsessionStart`和`trackSubsessionEnd`方法的显示调用,以在您的应用进入前台时通知我们的 SDK。
+
+在`didBecomeActiveWithConversation:`方式中添加对`trackSubsessionStart`的调用:
+
+```objc
+-(void)didBecomeActiveWithConversation:(MSConversation *)conversation {
+ // Called when the extension is about to move from the inactive to active state.
+ // This will happen when the extension is about to present UI.
+ // Use this method to configure the extension and restore previously stored state.
+
+ [Adjust trackSubsessionStart];
+}
+```
+
+在`willResignActiveWithConversation:`方式中添加对`trackSubsessionEnd`的调用:
+
+```objc
+-(void)willResignActiveWithConversation:(MSConversation *)conversation {
+ // Called when the extension is about to move from the active to inactive state.
+ // This will happen when the user dissmises the extension, changes to a different
+ // conversation or quits Messages.
+
+ // Use this method to release shared resources, save user data, invalidate timers,
+ // and store enough state information to restore your extension to its current state
+ // in case it is terminated later.
+
+ [Adjust trackSubsessionEnd];
+}
+```
+
+设置完成后,Adjust SDK 就能够在您的 iMessage 应用中成功执行会话跟踪。
+
+**注意:** 请注意您的 iOS 应用和创建的 iMessage 扩展程序是在不同的内存空间中运行的,它们也拥有不同的 Bundle ID。如果使用相同的应用识别码来初始化 Adjust SDK ,将导致独立的两者在没有注意到彼此的状况下进行跟踪,进而使控制面板上的数据显得混杂。我们建议您在 Adjust 控制面板中为 iMessage 应用创建单独的应用,并使用单独的应用识别码来初始化SDK。
+
+### Adjust日志
+
+您可以增加或减少在测试中看到的日志数量,方法是:用以下参数之一来调用`ADJConfig`实例上的`setLogLevel:`:
+
+```objc
+[adjustConfig setLogLevel:ADJLogLevelVerbose]; // enable all logging
+[adjustConfig setLogLevel:ADJLogLevelDebug]; // enable more logging
+[adjustConfig setLogLevel:ADJLogLevelInfo]; // the default
+[adjustConfig setLogLevel:ADJLogLevelWarn]; // disable info logging
+[adjustConfig setLogLevel:ADJLogLevelError]; // disable warnings as well
+[adjustConfig setLogLevel:ADJLogLevelAssert]; // disable errors as well
+[adjustConfig setLogLevel:ADJLogLevelSuppress]; // disable all logging
+```
+
+如果您不希望制作中的应用显示来自 Adjust SDK 的任何日志,请选择`ADJLogLevelSuppress`(抑制日志级别),并初始化`ADJConfig` 对象,启用抑制日志级别模式:
+
+```objc
+#import "Adjust.h"
+// or #import
+// or #import
+// or #import
+// or #import
+
+// ...
+
+NSString *yourAppToken = @"{YourAppToken}";
+NSString *environment = ADJEnvironmentSandbox;
+ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken
+ environment:environment
+ allowSuppressLogLevel:YES];
+
+[Adjust appDidLaunch:adjustConfig];
+```
+
+### 构建您的应用
+
+构建并运行您的应用。如果构建成功,您应当仔细阅读控制台的SDK日志。应用首次启动之后,您应当看到信息日志`Install tracked`(安装已跟踪)。
+
+![][run]
+
+## 附加功能
+
+一旦您将Adjust SDK集成到您的项目中,您可以使用以下功能。
+
+### 事件跟踪
+
+您可以通过Adjust来跟踪事件。假设您想要跟踪具体按钮的每一次点击,您要在[控制面板]上创建新的事件识别码,[控制面板]有相关的事件识别码,例如`abc123`等。在按钮`bottonDown`方法中,添加以下代码行以跟踪点击:
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+[Adjust trackEvent:event];
+```
+
+您在点击按钮时,应当可以在日志中看到`Event tracked`(事件已跟踪)。
+
+事件实例可以用于在跟踪之前对事件作进一步配置。
+
+### 收入跟踪
+
+如果您的用户可以通过点击广告或应用内购为您带来收入,您可以按照事件来跟踪这些收入。假设一次点击值一欧分。那么您可以这样来跟踪收入事件:
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event setRevenue:0.01 currency:@"EUR"];
+
+[Adjust trackEvent:event];
+```
+
+当然,这可以和回调参数相结合。
+
+当您设置货币类型时,Adjust将自动把收入转换为您选择的报告收入。阅读这里了解有关[货币转换][currency-conversion]的更多信息。
+
+您可以在此了解更多有关收入和事件跟踪的信息[事件跟踪指南](https://docs.adjust.com/zh/event-tracking/#reference-tracking-purchases-and-revenues)。
+
+### 收入重复数据删除
+
+您也可以输入可选的交易ID,以避免跟踪重复收入。最近的十个交易ID将被记录下来,重复交易ID的收入事件将被跳过。这对于应用内购跟踪尤其有用。参见以下例子。
+
+如果您想要跟踪应用内购,请确保只有状态变为`SKPaymentTransactionStatePurchased`时,才在`finishTransaction`之后在`paymentQueue:updatedTransaction`中调用`trackEvent`。这样您可以避免跟踪实际未产生的收入。
+
+```objc
+- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
+ for (SKPaymentTransaction *transaction in transactions) {
+ switch (transaction.transactionState) {
+ case SKPaymentTransactionStatePurchased:
+ [self finishTransaction:transaction];
+
+ ADJEvent *event = [ADJEvent eventWithEventToken:...];
+ [event setRevenue:... currency:...];
+ [event setTransactionId:transaction.transactionIdentifier]; // avoid duplicates
+ [Adjust trackEvent:event];
+
+ break;
+ // more cases
+ }
+ }
+}
+```
+
+### 应用收入验证
+
+如果您希望使用收入验证——Adjust 服务器端收据验证工具,来检查应用内购的真实性,请了解我们的iOS购买SDK并[在此][ios-purchase-verification]阅读详细内容。
+
+### 回调参数
+
+在您的[控制面板][dashboard]里,您可以为事件登记回调URL。跟踪到事件时,我们会向该URL发送GET请求。您可以在跟踪事件之前调用事件的`addCallbackParameter`,向该事件添加回调参数。然后我们会将这些参数添加至您的回调URL。
+
+例如,假设`http://www.adjust.com/callback`是您登记的回传URL,那么您可以这样来跟踪事件:
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event addCallbackParameter:@"key" value:@"value"];
+[event addCallbackParameter:@"foo" value:@"bar"];
+
+[Adjust trackEvent:event];
+```
+
+在此情况下,我们将跟踪事件并发送请求至:
+
+ http://www.mydomain.com/callback?key=value&foo=bar
+
+值得一提的是,我们支持各种可以用作参数值的占位符,例如`{idfa}`。在接下来的回调中,该占位符将被当前设备的广告ID代替。同时请注意,我们不保存您的任何定制参数,而只是将它们添加到您的回调中。如果您没有为事件输入回调地址或参数,这些参数甚至不会被读取。
+
+您可以在我们的[回调指南][callbacks-guide]中了解到有关使用URL回调的更多信息,包括可用值的完整列表。
+
+### 合作伙伴参数
+
+您还可以针对在Adjust控制面板已经激活的渠道对接模块,添加被发送到渠道合作伙伴的参数。
+
+工作原理和上述的回调参数相似,但是通过调用`ADJEvent`实例上的`addPartnerParameter`方法来添加。
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event addPartnerParameter:@"key" value:@"value"];
+[event addPartnerParameter:@"foo" value:@"bar"];
+
+[Adjust trackEvent:event];
+```
+
+您可以在我们的[特殊合作伙伴指南][special-partners]中了解到有关特殊合作伙伴和集成的更多信息。
+
+### 回调ID
+
+您还可为想要跟踪的每个事件添加自定义字符串ID。此ID将在之后的事件成功和/或事件失败回调中被报告,以便您了解哪些事件跟踪成功或者失败。您可通过调用`ADJEvent` 实例上的 `setCallbackId` 方法来设置此ID:
+
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event setCallbackId:@"Your-Custom-Id"];
+
+[Adjust trackEvent:event];
+```
+
+### 会话参数
+
+一些参数被保存发送到Adjust SDK的每一个事件和会话中。一旦您已经添加任何这些参数,您无需再每次添加它们,因为这些参数已经被保存至本地。如果您添加同样参数两次,也不会有任何效果。
+
+如果您希望和初始安装事件一同发送会话参数,这些参数必须在Adjust SDK上线之前经`[Adjust appDidLaunch:]`被调用。如果您需要在安装同时发送参数,但只有在SDK上线后才能获得必需的值,您可以通过[延迟](#delay-start)Adjust SDK第一次上线以允许该行为。
+
+### 会话回调参数
+
+被注册在[事件](#callback-parameters)中的相同回调参数也可以被保存发送至Adjust SDK的每一个事件和会话中。
+
+会话回调参数拥有与事件回调参数类似的接口。该参数是通过调用`Adjust` 方法 `addSessionCallbackParameter:value:`(添加会话回调参数值)被添加,而不是添加Key和值至事件:
+
+```objc
+[Adjust addSessionCallbackParameter:@"foo" value:@"bar"];
+```
+
+会话回调参数将与被添加至事件的回调参数合并。被添加至事件的回调参数拥有高于会话回调参数的优先级。这意味着,当被添加至事件的回调参数拥有与会话回调参数同样Key时,以被添加至事件的回调参数值为准。
+
+您可以通过传递Key至`removeSessionCallbackParameter`的方法来删除特定会话回调参数。
+
+
+```objc
+[Adjust removeSessionCallbackParameter:@"foo"];
+```
+
+如果您希望删除会话回调参数中所有的Key及值,您可以通过`resetSessionCallbackParameters`方法重置。
+
+
+```objc
+[Adjust resetSessionCallbackParameters];
+```
+
+### 会话合作伙伴参数
+
+与[会话回调参数](#session-callback-parameters)的方式一样,会话合作伙伴参数也将被发送至Ajust SDK的每一个事件和会话中。
+
+它们将被传送至渠道合作伙伴,以集成您的Adjust[控制面板]上已经激活的模块。
+
+会话合作伙伴参数具有与事件合作伙伴参数类似的接口。该参数是通过调用`Adjust`方法`addSessionPartnerParameter:value:`(添加会话合作伙伴参数值)被添加,而不是添加Key和值至事件:
+
+```objc
+[Adjust addSessionPartnerParameter:@"foo" value:@"bar"];
+```
+
+会话合作伙伴参数将与被添加至事件的合作伙伴参数合并。被添加至事件的合作伙伴参数具有高于会话合作伙伴参数的优先级。这意味着,当被添加至事件的合作伙伴参数拥有与会话合作伙伴参数同样Key时,以被添加至事件的合作伙伴参数值为准。
+
+您可以通过传递Key至`removeSessionPartnerParameter`的方法来删除特定的会话合作伙伴参数。
+
+```objc
+[Adjust removeSessionPartnerParameter:@"foo"];
+```
+
+如果您希望删除会话合作伙伴参数中所有的Key及值,您可以通过`resetSessionPartnerParameters`(重置会话合作伙伴参数)的方式重置。
+
+```objc
+[Adjust resetSessionPartnerParameters];
+```
+
+### 延迟启动
+
+延迟Adjust SDK的启动可以给您的应用一些时间获取被发送至安装的会话参数,如唯一识别码(unique identifiers)等。
+
+通过在`ADJConfig`实例中的`setDelayStart`(设置延迟启动)方式以秒为单位设置初始延迟时间。
+
+```objc
+[adjustConfig setDelayStart:5.5];
+```
+
+在此种情况下,Adjust SDK不会在5.5秒内发送初始安装会话以及创建任何事件。在该时间过期后或您同时调用 `[Adjust sendFirstPackages]` ,每个会话参数将被添加至延迟安装的会话和事件中,Adjust SDK将恢复正常。
+
+**Adjust SDK最长的延迟启动时间为10秒**。
+
+### 归因回传
+
+您可以注册一个委托回传,以获取跟踪链接归因变化的通知。由于考虑到归因的不同来源,归因信息无法被同时提供。遵循以下步骤在您的应用委托中启用可选的委托协议:
+
+请务必考虑我们的[适用归因数据政策][attribution-data]。
+
+1. 打开 `AppDelegate.h`,添加导入和`AdjustDelegate` 声明。
+
+ ```objc
+ @interface AppDelegate : UIResponder
+ ```
+
+2. 打开`AppDelegate.m`,添加以下委托回调功能至您的应用委托执行(app delegate implementation)。
+
+ ```objc
+ - (void)adjustAttributionChanged:(ADJAttribution *)attribution {
+ }
+ ```
+
+3. 用您的`ADJConfig`实例设置委托:
+
+ ```objc
+ [adjustConfig setDelegate:self];
+ ```
+
+由于委托回调使用`ADJConfig`实例进行配置,您应当在调用`[Adjust appDidLaunch:adjustConfig]`之前调用`setDelegate`。
+
+当SDK接收到最终归因数据时,将会获得委托功能。在委托功能内,您可以访问`attribution`(归因)参数。以下是归因属性的摘要:
+
+- `NSString trackerToken` 目前归因的跟踪码token
+- `NSString trackerName`目前归因的跟踪码名称
+- `NSString network` 目前归因的渠道分组级别
+- `NSString campaign` 目前归因的推广分组级别
+- `NSString adgroup` 目前归因的广告组分组级别
+- `NSString creative` 目前归因的创意分组级别
+- `NSString clickLabel` 目前归因的点击标签
+- `NSString adid` 归因提供的唯一设备ID
+
+当值不可用时,将默认为`nil`。
+
+### 事件和会话回传
+
+您可以设置委托回调,用于在事件和/或会话跟踪成功和失败时获取通知。使用的是和[归因回传](#attribution-callback)一样的`AdjustDelegate`可选协议。
+
+按照同样的步骤,执行以下委托回传函数,于成功跟踪事件时调用:
+
+```objc
+- (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData {
+}
+```
+
+以下为事件跟踪失败的委托回传函数:
+
+```objc
+- (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData {
+}
+```
+
+跟踪成功的会话:
+
+```objc
+- (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessResponseData {
+}
+```
+
+跟踪失败的会话:
+
+```objc
+- (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseData {
+}
+```
+
+委托函数将于SDK发送包(package)到服务器后调用。在委托回传内,您能访问专为委托回传所设的响应数据对象。会话的响应数据对象字段摘要如下:
+
+- `NSString message` 服务器信息或者SDK纪录的错误信息
+- `NSString timeStamp` 服务器的时间戳
+- `NSString adid` Adjust提供的设备唯一识别码
+- `NSDictionary jsonResponse` JSON对象及服务器响应
+
+两个事件响应数据对象都包含:
+
+- 如果跟踪的包是一个事件,`NSString eventToken` 代表事件识别码。
+- `NSString callbackid`为事件对象设置的自定义回调ID。
+
+当值不可用时,将默认为`nil`。
+
+事件和会话跟踪不成功的对象也包含:
+
+- `BOOL willRetry` 表示稍后将再尝试发送数据包。
+
+### 禁用跟踪
+
+您可以调用参数为`NO`的`setEnabled`,停用Adjust SDK跟踪目前设备所有活动的功能。**该设置在会话间保存**,但是只能在首次会话之后激活。
+
+```objc
+[Adjust setEnabled:NO];
+```
+
+您可以通过调用`isEnabled`来查看Adjust SDK目前是否启用。您始终可以通过调用`setEnabled`,启用参数为`YES`,从而激活Adjust SDK。
+
+### 离线模式
+
+您可以把Adjust SDK设置为离线模式,以暂停发送数据到我们的服务器,但仍然继续跟踪及保存数据并之后发送。当设为离线模式时,所有数据将存放于一个文件中,所以请注意不要于离线模式触发太多事件。
+
+您可以调用`setOfflineMode`,启用参数为`YES`,以激活离线模式。
+
+```objc
+[Adjust setOfflineMode:YES];
+```
+
+相反地,您可以调用`setOfflineMode`,启用参数为`NO`,以终止离线模式。 当Adjust SDK回到在线模式时,所有被保存的数据将被发送到我们的服务器,并保留正确的时间信息。
+
+跟禁用跟踪设置不同的是,此设置在会话与会话之间将**不被保存**。即使应用于离线模式终止,每当SDK启动都必定会处于在线模式。
+
+### 事件缓冲
+
+如果您的应用大量使用事件跟踪,您可能会想要延迟部分HTTP请求,以便按分钟成批发送这些请求。您可以通过`ADJConfig`实例启用事件缓冲:
+
+```objc
+[adjustConfig setEventBufferingEnabled:YES];
+```
+
+如果不做任何设置,事件缓冲为 **默认禁用**。
+
+### GDPR 的被遗忘权
+
+根据欧盟的《一般数据保护条例》(GDPR) 第 17 条规定,用户行使被遗忘权时,您可以通知 Adjust。调用以下方法,Adjust SDK 将会收到指示向 Adjust 后端传达用户选择被遗忘的信息:
+
+```objc
+[Adjust gdprForgetMe];
+```
+
+收到此信息后,Adjust 将清除该用户数据,并且 Adjust SDK 将停止跟踪该用户。以后不会再向 Adjust 发送来自此设备的请求。
+
+### SDK签名
+
+Adjust SDK签名功能是按客户逐一启用的。如果您希望使用该功能,请联系您的客户经理。
+
+如果您已经在账户中启用了SDK签名,并可访问Adjust控制面板的应用密钥,请使用以下方法来集成SDK签名到您的应用。
+
+在您的`AdjustConfig`实例中调用`setAppSecret`来设置应用密钥。
+
+```objc
+[adjustConfig setAppSecret:secretId info1:info1 info2:info2 info3:info3 info4:info4];
+```
+
+### 后台跟踪
+
+Adjust SDK的默认行为是当应用处于后台时暂停发送HTTP请求。您可以在 `AdjustConfig`实例中更改设置:
+
+```objc
+[adjustConfig setSendInBackground:YES];
+```
+
+如果不做任何设置,后台发送为**默认禁用**。
+
+### 设备ID
+
+Adjust SDK支持您获取一些设备ID。
+
+### iOS广告ID
+
+某些服务(如Google Analytics)要求您协调设备及客户ID以避免重复报告。
+
+请调用`idfa`以获取设备ID IDFA:
+
+```objc
+NSString *idfa = [Adjust idfa];
+```
+
+### Adjust设备ID
+
+Adjust后台将为每一台安装了您应用的设备生成一个唯一的**Adjust设备ID** (**adid**)。您可通过访问`Adjust`实例的以下属性来获取该ID:
+
+```objc
+NSString *adid = [Adjust adid];
+```
+
+**注意**: 只有在Adjust后台跟踪到应用安装后,您才能获取**adid**的相关信息。自此之后,Adjust SDK已经拥有关于设备**adid**的信息,您可以使用此方法来访问它。因此,在SDK被初始化以及您的应用安装被成功跟踪之前,您将**无法访问adid**。
+
+### 用户归因
+
+归因回传通过[归因回传章节](#attribution-callback)所描述的方法被触发,以向您提供关于用户归因值的任何更改信息。如果您想要在任何其他时间访问用户当前归因值的信息,您可以通过对`Adjust`实例调用如下方法来实现:
+
+```objc
+ADJAttribution *attribution = [Adjust attribution];
+```
+
+**注意**: 只有在Adjust后台跟踪到应用安装和归因回传被初始触发后,您才能获取关于当前归因的信息。自此之后,Adjust SDK已经拥有关于用户归因的信息,您可以使用此方法来访问它。因此,在SDK被初始化以及归因回传被初始触发之前,您将**无法访问用户归因值**。
+
+### 推送标签(Push token)
+
+请添加以下调用到应用委托`didRegisterForRemoteNotificationsWithDeviceToken`中的`Adjust`,发送推送标签给我们:
+
+```objc
+- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+ [Adjust setDeviceToken:deviceToken];
+}
+```
+
+推送标签用于Adjust受众分群工具(Audience Builder)和客户回传,且是将来发布的卸载跟踪功能的必需信息。
+
+### 预安装跟踪码
+
+如果您希望使用Adjust SDK来识别已在其设备中预安装您的应用的用户,请执行以下步骤。
+
+1. 在您的[控制面板][dashboard]中创建一个新的跟踪码。
+2. 打开您的应用委托,并在`ADJConfig`中添加设置默认跟踪码:
+
+ ```objc
+ ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken environment:environment];
+ [adjustConfig setDefaultTracker:@"{TrackerToken}"];
+ [Adjust appDidLaunch:adjustConfig];
+ ```
+用您在步骤1中创建的跟踪码替换`{TrackerToken}`(跟踪码)。请注意,控制面板中显示的是跟踪URL (包括 `http://app.adjust.com/`)。在您的源代码中,您应该仅指定六个字符的识别码,而不是整个网址(URL)。
+
+3. 创建并运行您的应用。您应该可以看到如下的一行Xcode。
+
+ ```
+ Default tracker: 'abc123'
+ ```
+
+### 深度链接
+
+如果您正在使用可从网址(URL)深度链接至您的应用的Adjust跟踪URL,您将可以获取深度链接URL及其内容的相关信息。点击URL的情况发生在用户已经安装了您的应用(标准深度链接场景),或用户尚未在其设备上安装您的应用(延迟深层链接场景)。Adjust SDK支持此两种场景,在两种场景下,一旦用户点击跟踪URL启动您的应用之后,深度链接URL都将被提供给您。您必须正确设置,以便在您的应用中使用此功能。
+
+### 标准深度链接场景
+
+如果您的用户已经安装了您的应用,并点击了带有深度链接信息的跟踪URL,您的应用将被打开,深度链接的内容将被发送至您的应用,这样您就可以解析它们并决定下一步动作。自iOS 9推出后,Apple已经改变了在应用程序中处理深度链接的方式。取决于您希望在应用中使用哪种场景(或者您希望同时使用两种场景以支持更广泛的设备),您需要设置应用以处理以下一种或两种场景。
+
+### iOS 8及以下版本的深度链接设置
+
+iOS 8及以下版本设备上的深度链接是通过使用自定义URL方案设置的。您需要选择一个由您的应用负责开启的自定义URL方案名。该方案名也将作为`deep_link`(深度链接)参数的一部分被用于Adjust跟踪URL。打开您的`Info.plist`文件,添加新的`URL types`,以在您的应用中设置URL方案名。在`URL identifier`输入您的应用bundle ID,于`URL schemes` 下添加您希望在应用中处理的方案名称。在以下例子中,我们已经选择应用程序处理以`adjustExample`命名的方案。
+
+![][custom-url-scheme]
+
+该设置完成之后,一旦点击包含自定义方案名的`deep_link` (深度链接)参数的Adjust跟踪URL, 您的应用将被打开。应用打开后,您的`AppDelegate` 中的`openURL`方式将被触发,来自跟踪URL的`deep_link`参数内容来源将被发送。如果您希望访问该深度链接内容,请改写此方法。
+
+```objc
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
+ sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
+ // url object contains your deep link content
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+通过以上设置,您已经成功为iOS 8及以下版本的iOS设备设置深度链接。
+
+### iOS 9及以上版本的深度链接设置
+
+为iOS 9及以上版本设备设置深度链接,您需要启用您的应用处理Apple通用链接(universal
+links)的功能。查看[这里][universal-links]了解更多关于通用链接及其设置的相关信息。
+
+Adjust在后台负责处理与通用链接相关的大部分工作。但是,为了让Adjust支持通用链接,您需要在Adjust控制面板中为通用链接做一些小的设置。请查看我们的官方[文件][universal-links-guide]以了解设置信息。
+
+一旦在控制面板中成功启用通用链接功能,您还需要在应用中作如下设置:
+
+在Apple Developer门户上为您的应用启用`Associated Domains`后,您需要为应用的Xcode项目作同样设置。启用`Assciated Domains`后,通过前缀`applinks:`的方式添加从Adjust控制面板中`Domains`部分生成的通用链接,并确保您同时也删除了通用链接的`http(s)`部分。
+
+![][associated-domains-applinks]
+
+完成该设置后,一旦点击Adjust跟踪通用链接,您的应用将被打开。应用打开后,您的`AppDelegate`中的`continueUserActivity` 方式将被触发,来自通用链接URL的内容来源将被发送。如果您希望访问该深度链接内容,请改写此方法。
+
+``` objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL url = [userActivity webpageURL];
+
+ // url object contains your universal link content
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+通过以上设置,您已经成功为iOS 9及以上版本的iOS设备设置深度链接。
+
+如果在您的代码中包含某些自定义逻辑,其仅接受旧式自定义URL方案名格式的深度链接信息,我们为您提供一个帮助函数,可以让您将通用链接转化为旧式的深度链接URL。您可以使用通用链接以及您希望的深度链接前缀自定义URL方案名来调用该方式,我们将为您生成自定义URL方案深度链接:
+
+``` objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL url = [userActivity webpageURL];
+
+ NSURL *oldStyleDeeplink = [Adjust convertUniversalLink:url scheme:@"adjustExample"];
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+### 延迟深度链接场景
+
+您可以注册一个委托回传,以在延迟深度链接被打开之前获取通知,并决定是否由Adjust SDK尝试打开该链接。其所使用的是和[归因回传](#attribution-callback)及[事件及会话回传](#event-session-callbacks) 同样的可选协议`AdjustDelegate`。
+
+按照同样步骤,为延迟深度链接执行以下委托回传函数:
+
+```objc
+- (void)adjustDeeplinkResponse:(NSURL *)deeplink {
+ // deeplink object contains information about deferred deep link content
+
+ // Apply your logic to determine whether the adjust SDK should try to open the deep link
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+在SDK从我们的服务器中接收指定的深度链接之后,回传函数将在打开该链接之前被调用。您可以在回传功能中访问该深度链接。返回的布尔值(boolean value)将决定是否由SDK打开该深度链接。您可以在此时不允许SDK打开该深度链接,将其保存,并在此之后由您自己打开。
+
+如果不执行回传,**Adjust SDK将始终默认尝试打开深度链接**。
+
+### 通过深度链接的再归因
+
+Adjust支持您使用深度链接进行再参与推广活动。请查看我们的[官方文件][reattribution-with-deeplinks]了解更多相关操作信息。
+
+如果您正在使用该功能,您需要在应用中对Adjust SDK做一个额外的调用,以便用户被正确地再归因。
+
+一旦您已经在应用中接收到深度链接内容信息,添加一个至`appWillOpenUrl` 方式的调用。为完成该调用,Adjust SDK将会尝试在深度链接内寻找是否有任何新的归因信息,一旦找到,该信息将被发送至Adjust后台。如果您的用户因为点击带有深度链接内容的adjust跟踪URL,而应该被再归因,您将会在应用中看到 [归因回传](#attribution-callback) 被该用户新的归因信息触发。
+
+在所有的iOS版本中,请参照如下调用`appWillOpenUrl`以设置深度链接再归因:
+
+```objc
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
+ sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
+ // url object contains your deep link content
+
+ [Adjust appWillOpenUrl:url];
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+``` objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL url = [userActivity webpageURL];
+
+ [Adjust appWillOpenUrl:url];
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+## 故障排查
+
+### SDK延迟初始化问题
+
+如在[基本设置步骤](#basic-setup)中所描述的,我们强烈建议您在应用委托中以`didFinishLaunching` 或者 `didFinishLaunchingWithOptions`方式初始化Adjust SDK。为了让您能够使用SDK的所有功能,您必须尽快地初始化Adjust SDK。
+
+不立即初始化Adjust SDK将会对应用跟踪产生多种影响。**为了在您的应用中执行所有的跟踪,Adjust SDK *一定* 要被初始化。**
+
+如果您决定执行以下任一操作:
+
+* [事件跟踪](#event-tracking)
+* [通过深度链接再归因](#deeplinking-reattribution)
+* [禁用跟踪](#disable-tracking)
+* [离线模式](#offline-mode)
+
+在您初始化SDK之前,`这些操作不会被执行`。
+
+如果您希望在Adjust SDK被真正初始化之前,跟踪以上任一操作,您必须在应用中创建`custom actions queueing mechanism`(自定义操作队列机制)。您需要将所有希望SDK执行的操作排成队列,在SDK被初始化之后执行它们。
+
+离线模式状态不会被改变,跟踪启用/禁用状态不会被改变,深度链接再归因无法执行,所有跟踪事件将被`丢弃`。
+
+另一个可能会被SDK延迟初始化影响的是会话跟踪。Adjust SDK在被初始化之前,不能收集任何会话长度的信息。您控制面板中的DAU数量将无法被跟踪。
+
+举例来说,让我们假设这个场景:您正在初始化Adjust SDK,要求一些特定的视图或视图控制器(view controller)被加载。假设这不是您的应用初始启动或第一个屏幕,但是用户必须从主屏幕中导航至它们。如果用户下载并打开您的应用,主屏幕将被显示。正常情况下此时该安装应该被跟踪。然而,因为用户需要导航至
+之前提到的您初始化Adjust SDK的屏幕,所以Adjust SDK无法获取任何相关信息。此外,如果用户不喜欢该应用,并在看到主屏幕之后立即卸载该应用,之上提到的所有信息将不会被我们的SDK跟踪,也不会被显示在控制面板中。
+
+#### 事件跟踪
+
+为跟踪事件,请使用内部队列机制将其排列,并在SDK初始化之后跟踪它们。在初始化SDK之前跟踪事件将会造成事件被`dropped`(丢弃)以及`permanently lost`(永久丢失),所以请确认您在SDK被`initialised`(初始化)并[`enabled`(启用)](#is-enabled)之后跟踪它们。
+
+#### 离线模式和启用/禁用跟踪
+
+离线模式功能在SDK初始化之间无法保留,所以它被默认设置为`false`。如果您尝试在SDK初始化之前启用离线模式,当SDK最终被初始化之后,将仍然被设置为 `false` 。
+
+启用/禁用跟踪状态在SDK初始化之间保持不变。如果您尝试在SDK初始化之前切换它们,切换尝试将被忽略。当SDK被初始化之后,SDK将处于切换尝试之前的(启用或禁用)状态。
+
+#### 通过深度链接的再归因
+
+如[之前](#deeplinking-reattribution)所描述的,当处理深度链接再归因时,取决于您正在使用的深度链接机制(老式vs.通用链接),在进行以下调用后您将获得`NSURL` 对象:
+
+```objc
+[Adjust appWillOpenUrl:url]
+```
+
+如果您在SDK被初始化之前进行此调用,来自深度链接的归因信息将会永久丢失。如果您希望Adjust SDK成功再归因用户,您需要在SDK被初始化之后,队列`NSURL`对象信息,并触发`appWillOpenUrl`方法。
+
+#### 会话跟踪
+
+会话跟踪将由Adjust SDK自动执行,不受应用开发者的影响。 如本README所建议的,初始化Adjust SDK对于会话跟踪是至关重要的。否则,将对会话跟踪以及控制面板的DAU数量有着不可预测的影响。
+
+例如:
+
+*用户打开应用,但在SDK初始化之前删除应用,导致安装和会话从未被跟踪,因此也不会在控制面板中被报告。
+*如果用户在午夜前下载并打开您的应用,然而Adjust SDK在午夜后被初始化,则所有的安装和会话数据将在错误日期被报告。
+*如果用户在午夜之后短暂打开了应用,但是没有在同一天使用应用,Adjust SDK于午夜后被初始化,将DAU于非应用打开的那一天被报告。
+
+由于各种原因,请按照本文档的说明,在您的应用委托`didFinishLaunching` 或 `didFinishLaunchingWithOptions`方式中初始化Adjust SDK。
+
+### 显示 "adjust requires ARC" 出错信息
+
+如果您的构建失败,错误为`adjust requires ARC`,可能是因为您的项目没有使用[ARC][arc]。在这种情况下,我们建议[过渡您的项目][transition]至ARC。如果您不想使用ARC,您必须在目标的Build Phases中,对Adjust的所有源文件启用ARC:
+
+展开`Compile Sources`组,选择所有Adjust文件并将`Compiler Flags`改为`-fobjc-arc`(选择全部并按下`Return`键立即全部更改)。
+
+### 显示 "[UIDevice adjTrackingEnabled]: unrecognized selector sent to instance" 出错信息
+
+当添加Adjust SDK framework至您的应用时可能发生该错误。Adjust SDK源文件包含`categories`,因此如果您已经选择此种SDK集成方式,您需要添加`-ObjC` flags至Xcode项目设置中`Other Linker Flags` 。添加该flag可以解决此错误。
+
+### 显示 "Session failed (Ignoring too frequent session.)" 出错信息
+
+此错误通常在测试安装时出现。卸载和重新安装应用并不足以触发新的安装。依据服务器中关于设备的可用信息,服务器将决定是否SDK丢失其本地汇总的会话数据并忽略错误
+消息。
+
+这种行为在测试期间可能很麻烦,但为了尽可能地让沙箱(sandbox)行为与真实情况匹配,该行为是非常必要的。
+
+您可以在我们的服务器上重置设备会话数据。请查看日志中的错误信息:
+
+```
+Session failed (Ignoring too frequent session. Last session: YYYY-MM-DDTHH:mm:ss, this session: YYYY-MM-DDTHH:mm:ss, interval: XXs, min interval: 20m) (app_token: {yourAppToken}, adid: {adidValue})
+```
+
+With the `{yourAppToken}` and either `{adidValue}` or `{idfaValue}` values filled in below, open one
+of the following links:
+
+```
+http://app.adjust.com/forget_device?app_token={yourAppToken}&adid={adidValue}
+```
+
+```
+http://app.adjust.com/forget_device?app_token={yourAppToken}&idfa={idfaValue}
+```
+
+当设备被忘记,链接仅返回`Forgot device`(忘记设备)。如果设备之前已经被忘记或出现错误值,链接将返回`Device not found`(未找到设备)。
+
+### 日志未显示 "Install tracked"
+
+如果您希望在测试设备上模拟应用的安装场景,仅仅在您的测试设备上重新运行Xcode开发的应用是不够的。重新运行Xcode开发的应用不会清除应用数据,SDK保存在您的应用中的所有内部数据仍然会存在。因此在重新运行时,我们的SDK将会看到这些文件并认为您的应用已被安装(SDK已被启用),应用只是又一次被打开,而不是第一次。
+
+为了运行应用安装场景,您需要进行以下步骤:
+
+*从您的设备中卸载应用 (完全删除应用)
+*如之前[above](#forget-device)所解释的,在Adjust后台忘记您的测试设备
+*在测试设备上运行Xcode开发的应用,您将会看到日志信息“安装已跟踪”
+
+### 显示 "Unattributable SDK click ignored" 信息
+
+当您在`沙箱`(sandbox)`环境中测试您的应用时,您可能会看到该信息。这个与`iAd.framework` 版本3中Apple作出的一些更改有关。因此,点击iAd banner的用户将被定向至您的应用,导致我们的SDK发送一个`sdk_click` 包至Adjust后台并通知后台关于被点击URL的内容。由于某些原因,Apple决定如果应用在没有点击iAD banner
+的情况下被打开,它们将人工生成一个带有随机值的iAd banner URL点击。我们的SDK无法区分iAd banner点击是真实或者人工生成的,所以无论在何种情况下都会发送一个 `sdk_click` 包至adjust后台。如果您已将日志级别设置为`verbose`级别,您将看到如下`sdk_click`包:
+
+```
+[Adjust]d: Added package 1 (click)
+[Adjust]v: Path: /sdk_click
+[Adjust]v: ClientSdk: ios4.10.1
+[Adjust]v: Parameters:
+[Adjust]v: app_token {YourAppToken}
+[Adjust]v: created_at 2016-04-15T14:25:51.676Z+0200
+[Adjust]v: details {"Version3.1":{"iad-lineitem-id":"1234567890","iad-org-name":"OrgName","iad-creative-name":"CreativeName","iad-click-date":"2016-04-15T12:25:51Z","iad-campaign-id":"1234567890","iad-attribution":"true","iad-lineitem-name":"LineName","iad-creative-id":"1234567890","iad-campaign-name":"CampaignName","iad-conversion-date":"2016-04-15T12:25:51Z"}}
+[Adjust]v: environment sandbox
+[Adjust]v: idfa XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+[Adjust]v: idfv YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
+[Adjust]v: needs_response_details 1
+[Adjust]v: source iad3
+```
+
+如果由于某种原因,该`sdk_click`被接受,这表示通过点击其他推广URL或者自然搜索打开您的应用的用户,被归因到这个不存在的iAd来源。因此,我们的后台将忽略该点击,并显示以下信息:
+
+```
+[Adjust]v: Response: {"message":"Unattributable SDK click ignored."}
+[Adjust]i: Unattributable SDK click ignored.
+```
+
+所以,该错误信息并不代表您的SDK集成出现问题,而仅是告知您我们的后台忽略了这个人工生成的`sdk_click` ,此点击可能会导致您的用户被错误地归因/再归因。
+
+### Adjust控制面板显示错误收入金额
+
+Adjust SDK仅跟踪您要求它跟踪的内容。如果您添加收入至事件,您所输入的金额是唯一到达Adjust后台并显示在控制面板中的金额。我们的SDK和后台都不会操纵您的金额。如果您看到错误的金额被跟踪,那是因为我们的SDK被告知跟踪该金额。
+
+通常,跟踪收入事件的用户代码如下:
+
+```objc
+// ...
+
+- (double)someLogicForGettingRevenueAmount {
+ // This method somehow handles how user determines
+ // what's the revenue value which should be tracked.
+
+ // It is maybe making some calculations to determine it.
+
+ // Or maybe extracting the info from In-App purchase which
+ // was successfully finished.
+
+ // Or maybe returns some predefined double value.
+
+ double amount; // double amount = some double value
+
+ return amount;
+}
+
+// ...
+
+- (void)someRandomMethodInTheApp {
+ double amount = [self someLogicForGettingRevenueAmount];
+
+ ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+ [event setRevenue:amount currency:@"EUR"];
+ [Adjust trackEvent:event];
+}
+
+```
+
+如果您在控制面板中看到任何您不期望被跟踪的值,**请务必检查您决定量值的逻辑**。
+
+[dashboard]: http://adjust.com
+[adjust.com]: http://adjust.com
+
+[en-readme]: ../../README.md
+[zh-readme]: ../chinese/README.md
+[ja-readme]: ../japanese/README.md
+[ko-readme]: ../korean/README.md
+
+
+[arc]: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
+[examples]: http://github.com/adjust/ios_sdk/tree/master/examples
+[carthage]: https://github.com/Carthage/Carthage
+[releases]: https://github.com/adjust/ios_sdk/releases
+[cocoapods]: http://cocoapods.org
+[transition]: http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
+
+[example-tvos]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-tvOS
+[AEPriceMatrix]: https://github.com/adjust/AEPriceMatrix
+[event-tracking]: https://docs.adjust.com/zh/event-tracking
+[example-iwatch]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-iWatch
+[callbacks-guide]: https://docs.adjust.com/zh/callbacks
+[universal-links]: https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html
+
+[special-partners]: https://docs.adjust.com/zh/special-partners
+[attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md
+[example-ios-objc]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-iOS
+[example-ios-swift]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-Swift
+[example-imessage]: https://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-iMessage
+[ios-web-views-guide]: https://github.com/adjust/ios_sdk/blob/master/doc/english/web_views.md
+[currency-conversion]: https://docs.adjust.com/zh/event-tracking/#tracking-purchases-in-different-currencies
+
+[universal-links-guide]: https://docs.adjust.com/zh/universal-links/
+[adjust-universal-links]: https://docs.adjust.com/zh/universal-links/#redirecting-to-universal-links-directly
+[universal-links-testing]: https://docs.adjust.com/zh/universal-links/#testing-universal-link-implementations
+[reattribution-deeplinks]: https://docs.adjust.com/zh/deeplinking/#manually-appending-attribution-data-to-a-deep-link
+[ios-purchase-verification]: https://github.com/adjust/ios_purchase_sdk
+
+[reattribution-with-deeplinks]: https://docs.adjust.com/zh/deeplinking/#manually-appending-attribution-data-to-a-deep-link
+
+[run]: https://raw.github.com/adjust/sdks/master/Resources/ios/run5.png
+[add]: https://raw.github.com/adjust/sdks/master/Resources/ios/add5.png
+[drag]: https://raw.github.com/adjust/sdks/master/Resources/ios/drag5.png
+[delegate]: https://raw.github.com/adjust/sdks/master/Resources/ios/delegate5.png
+[framework]: https://raw.github.com/adjust/sdks/master/Resources/ios/framework5.png
+
+[adc-ios-team-id]: https://raw.github.com/adjust/sdks/master/Resources/ios/adc-ios-team-id5.png
+[custom-url-scheme]: https://raw.github.com/adjust/sdks/master/Resources/ios/custom-url-scheme.png
+[adc-associated-domains]: https://raw.github.com/adjust/sdks/master/Resources/ios/adc-associated-domains5.png
+[xcode-associated-domains]: https://raw.github.com/adjust/sdks/master/Resources/ios/xcode-associated-domains5.png
+[universal-links-dashboard]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard5.png
+
+[associated-domains-applinks]: https://raw.github.com/adjust/sdks/master/Resources/ios/associated-domains-applinks.png
+[universal-links-dashboard-values]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard-values5.png
+
+## 许可协议
+
+The Adjust SDK is licensed under the MIT License.
+
+Copyright (c) 2012-2019 Adjust GmbH, http://www.adjust.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/doc/chinese/fb_pixel.md b/doc/chinese/fb_pixel.md
new file mode 100644
index 000000000..b8fb536d6
--- /dev/null
+++ b/doc/chinese/fb_pixel.md
@@ -0,0 +1,126 @@
+## Facebook像素集成
+
+[Facebook像素](https://www.facebook.com/business/help/952192354843755)是由Facebook提供的仅限于Web的分析工具。在过去,我们无法使用Facebook SDK来跟踪应用网页视图(Webview)中的像素事件。[FB SDK](https://developers.facebook.com/docs/analytics)4.34版本的发布使之成为可能,并通过[混合移动应用事件(Hybrid Mobile App Events)](https://developers.facebook.com/docs/app-events/hybrid-app-events)将Facebook像素事件转化为Facebook应用事件。
+
+您现在还可通过Adjust SDK跟踪Facebook像素,而无需集成FB SDK。
+
+## Facebook集成
+
+### 示例应用
+
+[`AdjustExample-FbPixel`目录][example-fbpixel]中的示例应用向您演示了如何使用Adjust网页视图SDK跟踪Facebook像素事件。
+
+### Facebook应用ID
+
+虽然无需集成FB SDK,但您必须遵循与FB SDK相同的一些集成步骤以将Facebook像素集成到Adjust SDK中。
+
+如[FB SDK iOS SDK指南](https://developers.facebook.com/docs/ios/getting-started/#xcode)中所述,您须将Facebook应用ID添加到应用中。 您可按照该指南中的步骤操作,同时我们将步骤复制如下:
+
+- 在Xcode中,右键单击项目的`Info.plist`文件,然后选择Open As(打开方式) - > Source Code(源代码)。
+- 在最后的` dict>`元素前将以下XML代码片段插入到文件正文中:
+
+ ```xml
+
+ ...
+ FacebookAppID
+ {your-app-id}
+ ...
+
+ ```
+
+- 将`{your-app-id}`替换为您应用的应用ID(该ID可在*Facebook应用控制面板*中找到)。
+
+### Facebook像素配置
+
+请参考Facebook指南了解如何集成Facebook像素。Javascript代码应如下所示:
+
+```js
+
+
+...
+
+```
+
+现在,正如[混合移动应用事件指南](https://developers.facebook.com/docs/app-events/hybrid-app-events)`Update Your Pixel(更新您的像素)`部分所述,您须更新Facebook像素代码如下:
+
+```js
+fbq('init', );
+fbq('set', 'mobileBridge', , );
+```
+
+**注意**:**非常重要**的一点是您必须首先调用''init'`并且之后立即调用`'set'`方法。Facebook提供给您需粘贴到HTML网页的代码片段(如上所示)包含调用`'init'`方法后的页面视图事件的`'track'`方法。为了正确跟踪此页面视图事件,请务必在两者之间调用`'set'`方法!
+
+## Adjust集成
+
+### 加载网页视图
+
+请按照[iOS Web视图](web_views.md)应用的集成指南进行操作。如下文加载网页视图桥:
+
+```objc
+- (void)viewWillAppear:(BOOL)animated {
+ ...
+ UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
+ // or with WKWebView:
+ // WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
+
+ // add @property (nonatomic, strong) AdjustBridge *adjustBridge; on your interface
+ self.adjustBridge = [[AdjustBridge alloc] init];
+ [self.adjustBridge loadUIWebViewBridge:webView];
+ // optionally you can add a web view delegate so that you can also capture its events
+ // [self.adjustBridge loadUIWebViewBridge:webView webViewDelegate:(UIWebViewDelegate*)self];
+
+ // or with WKWebView:
+ // [self.adjustBridge loadWKWebViewBridge:webView];
+ // optionally you can add a web view delegate so that you can also capture its events
+ // [self.adjustBridge loadWKWebViewBridge:webView wkWebViewDelegate:(id)self];
+ ...
+```
+
+无论您选择如何将网页视图加载到Adjust桥,请通过添加以下行来执行该步骤:
+
+```objc
+[self.adjustBridge augmentHybridWebView];
+```
+
+### 事件名称配置
+
+Adjust网桥SDK将Facebook像素事件转化为Adjust事件。
+
+因此,您必须将Facebook像素映射到特定的Adjust事件,或者在启动Adjust SDK和跟踪任意Facebook像素事件***之前***配置默认的Adjust事件识别码,包括从Facebook像素配置中复制粘贴的`fbq('track', 'PageView');`。
+
+为了将Facebook像素事件映射到Adjust事件,请在初始化Adjust SDK之前在`adjustConfig`实例中调用`addFbPixelMapping(fbEventNameKey,adjEventTokenValue)`。应类似以下示例:
+
+```js
+adjustConfig.addFbPixelMapping('fb_mobile_search', adjustEventTokenForSearch);
+adjustConfig.addFbPixelMapping('fb_mobile_purchase', adjustEventTokenForPurchase);
+```
+
+请注意,在跟踪Facebook像素事件:`fbq('track', 'Search', ...);` 和 `fbq('track', 'Purchase', ...);` 时应可实现匹配。但遗憾的是我们无法访问Javascript中跟踪的事件名称与FB SDK使用的事件名称之间的完整映射方案。
+
+以下为到目前为止我们收集的事件名称信息,供您参考:
+
+| 像素事件名称 | 对应Facebook应用事件名称
+| ---------------- | -------------------------------------
+| ViewContent | fb_mobile_content_view
+| Search | fb_mobile_search
+| AddToCart | fb_mobile_add_to_cart
+| AddToWishlist | fb_mobile_add_to_wishlist
+| InitiateCheckout | fb_mobile_initiated_checkout
+| AddPaymentInfo | fb_mobile_add_payment_info
+| Purchase | fb_mobile_purchase
+| CompleteRegistration | fb_mobile_complete_registration
+
+以上列表也许还不完整;Facebook也可能添加或更新当前列表。在测试时,请查看Adjust日志以获取提示信息,例如:
+
+```
+未就名称为:'fb_mobile_search'的事件配置默认事件识别码或找到匹配。它将不会被Adjust作为事件来跟踪。
+```
+
+如果您未配置映射,还可以选择使用默认的Adjust事件。您只需在初始化Adjust SDK之前调用`adjustConfig.setFbPixelDefaultEventToken(defaultEventToken);`。
+
+[example-fbpixel]: ../../examples/AdjustExample-FbPixel
diff --git a/doc/japanese/1_sdk_readme_ja.md b/doc/japanese/1_sdk_readme_ja.md
deleted file mode 100644
index 6ac5d5cbc..000000000
--- a/doc/japanese/1_sdk_readme_ja.md
+++ /dev/null
@@ -1,427 +0,0 @@
-
-こちらは、adjust™のiOS 用SDKです。adjust™についての詳細は
-[adjust.comをご覧ください]。
-
-
-
-### 見本アプリ
-
-[`example` ダイレクトリー][example]の中に、[`iOS`][example-ios]と
-[`tvOS`][example-tvos]用の見本アプリが格納されています。
-このXcodeプロジェクトを開けば、adjust のSDK の統合方法の実例をご確認いただけます。
-
-### 基本的な統合方法
-
-adjust のSDK をiOS のプロジェクトに統合するための手順を説明します。
-ここでは、iOS アプリケーションの開発にXcodeを使用していると想定してします。
-
-[CocoaPods][cocoapods]を使用している場合は、
-`Podfile`に次のコードを追加して、
-
-```
-pod 'Adjust', :git => 'git://github.com/adjust/ios_sdk.git', :tag => 'v4.5.0'
-```
-
-[Carthage][carthage]を利用している場合は次のコードを`Cartfile`に追加して、[ステップ 3](#step3)に進んで下さい。
-
-```
-github "adjust/ios_sdk"
-```
-
-SDKをプロジェクトにフレームワークとして追加することもできます。
-[こちらのページ][releases]で2つのアーカイブがあります:
-
-* `AdjustSdkStatic.framework.zip`
-* `AdjustSdkDynamic.framework.zip`
-
-iOS8にてAppleがdynamic frameworks(embedded frameworks)を導入しました。アプリがiOS8以上の端末用の場合は、dynamic frameworkを利用することができます。
-StaticかDynamicフレームワークを選択し、プロジェクトに追加して、[ステップ3][#step3]に進んでください。
-
-#### SDKの入手
-
-最新バージョンのSDKを[公開ページ][releases]からダウンロードし、アーカイブを任意のダイレクトリーに
-解凍してください。
-
-#### プロジェクトへのSDKの追加
-
-Xcodeのプロジェクトナビゲータで`Supporting Files`グループ(または他の任意のグループ)を指定し、
-Finderから`Adjust`というサブダイレクトリーをXcodeの
-`Supporting Files`グループへドラッグしてください。
-
-![][drag]
-
-`Choose options for adding these files`のダイアログでは必ず
-`Copy items if needed`というチェックボックスをチェックし、`Create
-groups`のラジオボタンを選択してください。
-
-![][add]
-
-#### AdSupportとiAdのフレームワークの追加
-
-プロジェクトナビゲータで対象のプロジェクトを選択し、メインビューの左側で、
-追加先のターゲットを選択してください。`Build Phases`のタブから`Link
-Binary with Libraries` のグループを展開し、セクション下部の`+`ボタンをクリックしてください。
-`AdSupport.framework`を選択し、`Add`ボタンをクリックします。同様の手順で
-`iAd.framework`も追加してください。最後に、両方のフレームワークの`Status`を
-`Optional`に変更します。
-
-![][framework]
-
-### アプリへのAdjustの統合
-
-#### Importステートメント
-
-adjustSDKをソース、もしくはPod repositoryから追加した場合は、下記のimportステートメントをご利用ください:
-
-```
-#import "Adjust.h"
-```
-
-フレームワークもしくはCarthageとしてSDKを追加した場合は、次の行を利用ください:
-
-```
-#import <AdjustSdk/Adjust.h>
-```
-
-はじめに、基本的なセッションのトラッキングの設定を行います。
-
-#### 基本設定
-
-プロジェクトナビゲータからアプリケーション デリゲートのソースファイルを開いてください。
-ファイルの先頭に`import`というステートメントを追加し、次に
-アプリケーション デリゲートの、`didFinishLaunching`または`didFinishLaunchingWithOptions`というメソッドに、`Adjust`への
-呼び出しを次の通り追加してください。
-
-```
-#import "Adjust.h"
-// ...
-NSString *yourAppToken = @"{YourAppToken}";
-NSString *environment = ADJEnvironmentSandbox;
-ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken
- environment:environment];
-[Adjust appDidLaunch:adjustConfig];
-```
-
-![][delegate]
-
-`{YourAppToken}`の箇所を、対象アプリのトークンと置き換えてください。トークンは
-[ダッシュボード]にて確認できます。
-
-アプリのビルドがテスト版か製品版かにより、
-`environment`に以下のいずれかの値を適宜設定してください。
-
-```
-NSString *environment = ADJEnvironmentSandbox;
-NSString *environment = ADJEnvironmentProduction;
-```
-
-**重要:**アプリがテスト版の場合のみ値を`ADJEnvironmentSandbox`に設定し、
-アプリの公開前に必ずこの値を
-`ADJEnvironmentProduction`に変更してください。再度開発やテストを行う際は、設定を
-`ADJEnvironmentSandbox`に戻してください。
-
-adjust ではこの設定により、トラフィックが実際のものなのか、テスト機から生じたものなのかを判別しています。
-この値を常に正しく設定することは非常に大切で、売上のトラッキングを行う際には
-特に重要となります。
-
-##### Adjustのログ設定
-
-`ADJConfig`インスタンスで、以下のパラメータのいずれかを設定して`setLogLevel:`関数を呼び出せば、
-テスト時に表示されるログの量を
-増減させることができます。
-
-```
-[adjustConfig setLogLevel:ADJLogLevelVerbose]; // enable all logging
-[adjustConfig setLogLevel:ADJLogLevelDebug]; // enable more logging
-[adjustConfig setLogLevel:ADJLogLevelInfo]; // the default
-[adjustConfig setLogLevel:ADJLogLevelWarn]; // disable info logging
-[adjustConfig setLogLevel:ADJLogLevelError]; // disable warnings as well
-[adjustConfig setLogLevel:ADJLogLevelAssert]; // disable errors as well
-```
-
-#### アプリのビルド
-
-アプリをビルドし、実行します。ビルドに成功したら、コンソールから
-SDKのログをよくお読みください。またアプリの初回起動後は、
-`Install tracked`という情報をログで確認してください。
-
-![][run]
-
-##### トラブルシューティング
-
-`Adjust requires ARC`というエラーによりビルドが失敗した場合は、
-プロジェクトで[自動参照カウント(ARC)][arc]機能を使用していない可能性があります。この場合は、[プロジェクトをARCを使用したものに切り替える]
-[transition]ことをお勧めします。ARCを使用したくない場合は、
-ターゲットのBuild Phases ペイン内で、全てのadjustのソースファイルで、次の通りARCを有効にする必要があります。
-
-`Compile Sources`グループを展開したら、全てのadjust 用ファイル(Adjust、ADJ...、...+ADJAdditions)を選択し
-+、`Compiler Flags`を`-fobjc-arc`に変更してください(変更を一度に行いたい場合は、全てを選択し、
-`Return`キーを押してください)。
-
-### 追加機能
-
-プロジェクトにadjust のSDKを統合すると、以下の
-機能を利用できるようになります。
-
-#### イベントトラッキングの設定
-
-adjustを使用してイベントをトラッキングすることができます。例えば、あるボタンへのタップをトラッキング
-したい時は、[ダッシュボード]で新しいイベントトークンを作成し、
-そこに`abc123`のようなイベントトークンを関連付けてください。[
-そして、タップをトラッキングするために、ボタンの`buttonDown`メソッドに次の文字列を
-追加してください。
-
-```
-ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
-[Adjust trackEvent:event];
-```
-
-この時点でボタンをタップすると、ログに`Event tracked`という文字列が確認できます。
-
-このイベントインスタンスを使って事前に設定を行えば、更に詳細なトラッキングを行うことも可能です。
-
-
-##### コールバックパラメータの追加
-
-[[ダッシュボード]でイベント追跡用のコールバックURLを設定することが可能で、
-イベントがトラッキングされる度に、そのURLへGETリクエストが送信されます。
-`addCallbackParameter`トラッキング前に、イベントインスタンスで`addCallbackParameter` を呼び出して、そのイベント用のコールバックパラメーターを設定することができます。
-その後、設定されたパラメーターがコールバックURLに付け足されます。
-
-
-例えば、
-`http://www.adjust.com/callback`をコールバックURLとして登録し、イベントを次のようにトラッキングする場合、
-
-```
-ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
-[event addCallbackParameter:@"key" value:@"value"];
-[event addCallbackParameter:@"foo" value:@"bar"];
-[Adjust trackEvent:event];
-```
-
-イベントがトラッキングされると、次のURLにリクエストが送信されます。
-
-```
-http://www.adjust.com/callback?key=value&foo=bar
-```
-
-注目すべき機能として、adjustでは`{idfa}`といった、パラメータ値として利用できる様々なプレースホルダに対応しています。
-実際に生成されるコールバックでは、この
-プレースホルダはデバイスの広告識別子(IDFA)で置き換えらることになります。
-また、adjust ではカスタムパラメータはコールバックに付加されるだけで、
-一切保存されませんのでご注意下さい。イベントにコールバックを登録していなければ、
-これらのパラメータは読み込まれることすらありません。
-
-URLコールバックの使い方については、
-[コールバックについての説明][callbacks-guide]ページで、使用可能な値を網羅したリストと一緒に、[詳しく紹介しています。
-
-##### 売上のトラッキング
-
-広告のタップや
-アプリ内購入で売上が発生する場合は、売上情報をイベントと一緒にトラッキングすることができます。
-例えば、タップ1回で0.01ユーロの収入が発生する場合、次のように設定して売上イベントをトラッキングすることができます。
-
-```
-ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
-[event setRevenue:0.01 currency:@"EUR"];
-[Adjust trackEvent:event];
-```
-
-もちろん、このコードはコールバック パラメータと組み合わせることもできます。
-
-通貨トークンを設定した場合、adjustは売上高を自動的に為替計算し、任意の通貨で表示します。詳細は[為替レートの計算][currency-conversion]ページをご覧ください。
-
-売上とイベントトラッキングの詳細は、[イベントトラッキングについて][event-tracking]をご覧ください。
-
-##### 売上情報の重複登録防止
-
-オプションの取引IDを引き渡すことで、売上の重複トラッキングを防ぐこともできます。
-adjust では最新の取引IDが10個記録され、重複する取引IDを含む売上イベントはスキップされます。
-この機能は、アプリ内購入をトラッキングする際に特に便利です。
-以下の例をご覧ください。
-
-アプリ内購入を追跡する場合、
-ソースに`paymentQueue:updatedTransaction`と記述のある箇所で、ステータスが`SKPaymentTransactionStatePurchased`に変わった場合にのみ、`finishTransaction`(取引終了)の後に、`trackEvent` が呼び出されるよう設定して下さい。
-このようにして、
-実際には発生していない売上がトラッキングされるのを防ぐことができます。
-
-```
-- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
- for (SKPaymentTransaction *transaction in transactions) {
- switch (transaction.transactionState) {
- case SKPaymentTransactionStatePurchased:
- [self finishTransaction:transaction];
-
- ADJEvent *event = [ADJEvent eventWithEventToken:...];
- [event setRevenue:... currency:...];
- [event setTransactionId:transaction.transactionIdentifier]; // avoid duplicates
- [Adjust trackEvent:event];
-
- break;
- // more cases
- }
- }
-}
-```
-
-##### レシートの照合
-
-アプリ内購入を追跡する場合は、トラッキングデータにレシートを添付することができます。
-この場合、adjustのサーバーはAppleにレシートの照会を行い、
-確認が取れなかったイベントは破棄されます。この機能を使用するには、
-追跡を行う購入の取引IDをadjustに送る必要があります。取引IDは
-[上述の](#deduplication)SDK側での重複防止にも使用されます。
-
-```
-NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
-NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
-
-ADJEvent *event = [ADJEvent eventWithEventToken:...];
-[event setRevenue:... currency:...];
-[event setReceipt:receipt transactionId:transaction.transactionIdentifier];
-
-[Adjust trackEvent:event];
-```
-
-#### ディープリンク リアトリビューションの設定
-
-adjust のSDKをディープリンクに対応するよう設定して、カスタムURLからアプリが開かれた際にトラッキングを行うことができます。
-adjustでは、adjust専用のパラメータだけを読み込みます。
-ディープリンクを使ったリターゲッティングやリエンゲージメントキャンペーンを予定している場合、この設定は必須となります。
-
-
-プロジェクトナビゲータでアプリケーション デリゲートのソースファイルを開いてください。
-`openURL`メソッドを表示または追加し、以下のadjustへの呼び出しコードを追加します。
-
-```
-- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url
- sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
-{
- [Adjust appWillOpenUrl:url];
-
- // Your code goes here
- Bool canHandle = [self someLogic:url];
- return canHandle;
-}
-```
-
-#### イベントのバッファリングの有効化
-
-アプリでイベント トラッキングが頻繁に発生する場合、
-一部のHTTPリクエストを遅らせておいて、1分ごとに一括送信した方がよいことがあります。
-その場合は、`ADJConfig`インスタンスでイベント バッファリングを有効にしてください。
-
-```
-[adjustConfig setEventBufferingEnabled:YES];
-```
-
-#### アトリビューションのコールバックの実装
-
-トラッカーがアトリビューションの変化を検出した際に通知を受け取れるよう、デリゲート コールバックを登録することができます。
-アトリビューションのソースを比較しなければいけないため、
-変化の発生時に通知を行うことは出来ません。最も簡単な方法で設定するには、単一の匿名リスナを作成してください。
-以下の手順で行って下さい。
-
-また、adjustの[アトリビューションデータの適切な利用に関する方針]
-[attribution-data]を必ず参照してください。
-
-1. `AppDelegate.h`を開いて、インポートと`AdjustDelegate`の宣言を次の通り追加してください。
-
- ```
- #import "Adjust.h"
-
- @interface AppDelegate : UIResponder
- ```
-
-2. `AppDelegate.m`を開き、以下のデリゲート コールバック関数をAppDelegateクラスの実装コードに追加します。
-
- ```
- - (void)adjustAttributionChanged:(ADJAttribution *)attribution {
- }
- ```
-
-3. AppDelegateクラスに`ADJConfig` インスタンスを設定します。
-
- ```
- [adjustConfig setDelegate:self];
- ```
-
-デリゲートコールバックの設定には`ADJConfig` インスタンスを使用するため、
-`[Adjust appDidLaunch:adjustConfig]`関数より先に、`setDelegate`インスタンスを呼び出すようにして下さい。
-
-このデリゲート関数は、SDKが最後のアトリビューションデータを取得した際に呼び出されます。
-呼び出されたデリゲート関数内には`attribution`パラメータが含まれており、アトリビューションの種類を確認することができます。
-以下に、このパラメータのプロパティを簡単にまとめました。
-
-- `NSString trackerToken` 発生したインストールのトラッカー トークン。
-- `NSString trackerName` 発生したインストールのトラッカー名。
-- `NSString network` 発生したインストールのネットワーク階層のグループ名。
-- `NSString campaign` 発生したインストールのキャンペーン階層のグループ名。
-- `NSString adgroup` 発生したインストールの広告グループ階層のグループ名。
-- `NSString creative` 発生したインストールのクリエイティブ階層のグループ名。
-- `NSString clickLabel` 発生したインストールのクリック ラベル。
-
-#### トラッキングの無効化
-
-`setEnabled``NO`adjustSDKが行っているデバイスのアクティビティのトラッキングをすべて無効化することができます。
-そのためには、`NO`パラメータをセットして`setEnabled`関数を呼び出します。この設定はセッションが進んでも
-維持され、最初のセッションの後にしか有効化できません。
-
-```
-[Adjust setEnabled:NO];
-```
-
-`isEnabled`関数を呼び出せば、adjust のSDKが現在有効かどうかを確認できます。
-また、`YES`パラメータをセットして`setEnabled`関数を呼び出せば、いつでもadjust のSDKを
-有効化することができます。
-
-### オフラインモード
-
-一旦adjustサーバまでの送信を停止スルことができます。すると、すべての数値がファイルで保存されますので、たくさんのイベントを発生しないようにご注意ください。
-
-`true`というパラメータで`setOfflineMode`を呼び出すことでオフラインモードを利用できます。
-
-```
-[Adjust setOfflineMode:YES];
-```
-
-また、`false`パラメータで`setOfflineMode`を呼び出すとオンラインになります。すると、すべてのデータが正しいタイムスタンプと一緒に弊社のサーバへ送信されます。
-
-トラッキングの無効化と違って、こちらの設定は起動旅にリセットしますので、オフラインモードの状態でアプリを終了しても、再起動するとオンラインモードとしてアプリが起動します。
-
-#### パートナー パラメータ
-
-ダッシュボードでトラッキングデータを共有するよう設定したネットワーク パートナーに対し、送信されるパラメータを追加することもできます。
-
-
-これは、上記のコールバック パラメータと同様の働きを持つもので、
-`ADJEvent`インスタンスで`addPartnerParameter`メソッドを呼び出せば追加することができます。
-
-```
-ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
-[event addPartnerParameter:@"key" value:@"value"];
-[Adjust trackEvent:event];
-```
-
-adjust のパートナーとその統合については
-[スペシャルパートナーについて][special-partners]のページをご覧ください。
-
-[adjust.com]: https://adjust.com
-[cocoapods]: http://cocoapods.org
-[dashboard]: https://adjust.com
-[example]: http://github.com/adjust/ios_sdk/tree/master/example
-[releases]: https://github.com/adjust/ios_sdk/releases
-[arc]: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
-[transition]: http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
-[drag]: /images/sdk/Resources/ios/drag4.png
-[add]: /images/sdk/Resources/ios/add3.png
-[framework]: /images/sdk/Resources/ios/framework4.png
-[delegate]: /images/sdk/Resources/ios/delegate4.png
-[run]: /images/sdk/Resources/ios/run4.png
-[AEPriceMatrix]: https://github.com/adjust/AEPriceMatrix
-[attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md
-[callbacks-guide]: /ja//callbacks
-[event-tracking]: /ja/event-tracking
-[special-partners]: https://docs.adjust.com/en/special-partners
-[currency-conversion]: /ja/event-tracking/#tracking-purchases-in-different-currencies
-[ダッシュボード]: https://adjust.com/apps
diff --git a/doc/japanese/README.md b/doc/japanese/README.md
new file mode 100644
index 000000000..13a17b486
--- /dev/null
+++ b/doc/japanese/README.md
@@ -0,0 +1,1117 @@
+これはネイティブadjust™iOS SDKガイドです。adjust™については[adjust.com]をご覧ください。
+
+Web viewを使用するアプリで、JavascriptコードからAdjustのトラッキングをご利用いただくには、
+[iOS Web view SDKガイド][ios-web-views-guide]をご確認ください。
+
+Read this in other languages: [English][en-readme], [中文][zh-readme], [日本語][ja-readme], [한국어][ko-readme].
+
+
+
+### サンプルアプリ
+
+[`iOS (Objective-C)`][example-ios-objc]と[`iOS (Swift)`][example-ios-swift]、[`tvOS`][example-tvos]、[`iMessage`][example-imessage]、[`Apple Watch`][example-iwatch]のサンプルアプリが[`examples`デイレクトリー][examples]にあります。
+このXcodeプロジェクトを開けば、adjust SDKの統合方法の実例をご確認いただけます。
+
+### 基本的な統合方法
+
+adjust SDKをiOSプロジェクトに連携する手順を説明します。
+ここでは、iOSアプリケーションの開発にXcodeを使用していると想定しています。
+
+#### プロジェクトにSDKを追加する
+
+
+[CocoaPods][cocoapods]を使用している場合は、`Podfile`に以下のコードを追加し、
+[こちらの手順](#sdk-integrate)に進んでください。
+
+```ruby
+pod 'Adjust', '~> 4.17.1'
+```
+
+または
+
+```ruby
+pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.17.1'
+```
+
+---
+
+[Carthage][carthage]を使用している場合は、`Cartfile`に以下のコードを追加し、
+[こちらの手順](#sdk-frameworks)に進んでください。
+
+```ruby
+github "adjust/ios_sdk"
+```
+
+---
+
+adjust SDKはフレームワークとしてプロジェクトに追加することもできます。
+[リリースページ][releases]に以下の3つのアーカイブがあります。
+
+* `AdjustSdkStatic.framework.zip`
+* `AdjustSdkDynamic.framework.zip`
+* `AdjustSdkTv.framework.zip`
+* `AdjustSdkIm.framework.zip`
+
+iOS 8リリース以降、AppleはDynamic Frameworks (Embedded Framework)を導入しています。
+iOS 8以降の端末をターゲットにしている場合は、adjustの SDK dynamic frameworkが使用できます。
+StaticかDynamicフレームワークを選択し、プロジェクトに追加してください。
+
+`tvOS`アプリの場合もadjust SDKの利用が可能です。
+`AdjustSdkTv.framework.zip`アーカイブからadjustのtvOSフレームワークを展開してください。
+
+同様に`iMessage`アプリの場合もadjust SDKの利用が可能です。`AdjustSdkIm.framework.zip`アーカイブからIMフレームワークを展開してください。
+
+#### iOSフレームワークを追加する
+
+1. プロジェクトナビゲータ上でプロジェクトを選択します。
+2. メインビューの左側にある該当ターゲットを選択します。
+3. `Build Phases`タブで、`Link Binary with Libraries`を開きます。
+4. そのセクションの最下部にある`+`ボタンをクリックします。
+5. `AdSupport.framework`を選び、`Add`をクリックします。
+6. tvOSを使用していない場合は、同じ手順を繰り返して`iAd.framework`と`CoreTelephony.framework`を追加してください。
+7. フレームワークの`Status`を`Optional`にしてください。
+
+#### SDKをアプリに実装する
+
+Podリポジトリからadjust SDKを追加した場合は、次のimport statement(インポートステートメント)のいづれかを使用します。
+
+```objc
+#import "Adjust.h"
+```
+
+または
+
+```objc
+#import
+```
+
+---
+
+adjust SDKをStaticまたはDynamicフレームワークとして追加した場合、またはCarthageを使う場合は、以下のインポートステートメントを使用します。
+
+```objc
+#import
+```
+
+---
+
+tvOSアプリケーションでadjust SDKを使用している場合は、以下のインポートステートメントを使用します。
+
+```objc
+#import
+```
+
+---
+
+iMessageアプリケーションでadjust SDKを使用している場合は、以下のインポートステートメントを使用します。
+
+```objc
+#import
+```
+
+
+次に基本的なセッションのトラッキングを設定します。
+
+#### 基本設定
+
+Project Navigator上で、アプリケーションデリゲートのソースファイルを開いてください。
+ソースコードの先頭に`import`の記述を追加し、`didFinishLaunching`か`didFinishLaunchingWithOptions`のメソッド中に
+下記の`Adjust`コールを追加してください。
+
+```objc
+#import "Adjust.h"
+// or #import
+// or #import
+// or #import
+// or #import
+
+// ...
+
+NSString *yourAppToken = @"{YourAppToken}";
+NSString *environment = ADJEnvironmentSandbox;
+ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken
+ environment:environment];
+
+[Adjust appDidLaunch:adjustConfig];
+```
+
+![][delegate]
+
+**注意**: adjust SDKの初期化は、手順に沿い`確実に`行なってください。[トラブルシューティングのセクション](#ts-delayed-init)で説明しているように、さまざまな問題が発生することがあります。
+
+`{YourAppToken}`をあなたのアプリケーショントークンに置き換えてください。これはダッシュボードで見つけることができます。
+
+テストのためにアプリケーションをビルドするか実行のためにビルドするかによって、以下の値を選び`environment`を設定してください。
+
+```objc
+NSString *environment = ADJEnvironmentSandbox;
+NSString *environment = ADJEnvironmentProduction;
+```
+
+**重要** お客様や、その他の人がアプリのテストをしている場合にのみ、この値は`ADJEnvironmentSandbox`に設定してください。
+アプリを公開する直前に環境を`ADJEnvironmentProduction`に設定してください。開発とテストを再び開始する時は、`ADJEnvironmentSandbox`に戻してください。
+
+これらの環境から、実際のトラフィックとテストデバイスのトラフィックを区別することができます。
+特に収益をトラッキングする場合に重要な値となりますので、大切にしてください。
+
+### iMessage固有の設定
+
+**ソースからSDKを追加する:** adjust SDKをiMessageアプリケーションにソースから追加する場合、プリプロセッサマクロ**ADJUST_IM=1**がiMessageプロジェクトで設定されていることを確認してください。
+
+**SDKをフレームワークとして追加する:** iMessageアプリケーションに`AdjustSdkIm.framework`を追加した後、`Build Phases`プロジェクト設定で`New Copy Files Phase`を追加します。`AdjustSdkIm.framework`を`Frameworks`フォルダにコピーする、を選択してください。
+
+**セッショントラッキング:** セッショントラッキングをiMessageアプリで正しく機能させるためには、追加の統合ステップを1回実行してください。標準のiOSアプリでは、Adjust SDKはiOSシステム通知に自動的に登録され、いつアプリ内に入り、フォアグラウンドから離れたかを知ることができます。これはiMessageアプリの場合には該当しないため、iMessageアプリビューコントローラの`trackSubsessionStart`メソッドと`trackSubsessionEnd`メソッドへの明示的な呼び出しを追加する必要があります。 これにより、アプリがフォアグラウンドに 表示されているかどうかをSDKに認識させることができます。
+
+`didBecomeActiveWithConversation`のメソッド中に`trackSubsessionStart`を追加します:
+
+```objc
+-(void)didBecomeActiveWithConversation:(MSConversation *)conversation {
+ // Called when the extension is about to move from the inactive to active state.
+ // This will happen when the extension is about to present UI.
+ // Use this method to configure the extension and restore previously stored state.
+ [Adjust trackSubsessionStart];
+}
+```
+
+`willResignActiveWithConversation`のメソッド中に`trackSubsessionEnd`を追加します:
+
+```objc
+-(void)willResignActiveWithConversation:(MSConversation *)conversation {
+ // Called when the extension is about to move from the active to inactive state.
+ // This will happen when the user dissmises the extension, changes to a different
+ // conversation or quits Messages.
+
+ // Use this method to release shared resources, save user data, invalidate timers,
+ // and store enough state information to restore your extension to its current state
+ // in case it is terminated later.
+ [Adjust trackSubsessionEnd];
+}
+```
+
+このセットを使用すると、Adjust SDKはiMessageアプリ内でセッションのトラッキングを正常に行うことができます。
+
+**注意:** 書き込んだiOSアプリとiMessageの拡張機能は、異なるメモリ空間で動作しており、バンドル識別子も異なります。2つの場所で同じアプリトークンを使用してAdjust SDKを初期化すると、相互が認識しない2つの独立したインスタンスが生成され、ダッシュボードのデータが混在してしまうことがあります。これを避けるために、iMessageアプリ用に別のアプリをAdjustダッシュボードに作成し、別のアプリトークンを使ってSDKの初期化をその中で行ってください。
+
+
+#### Adjustログ
+
+`ADJConfig`インスタンスの`setLogLevel:`に設定するパラメータを変更することによって記録するログのレベルを調節できます。
+パラメータは以下の種類があります。
+
+```objc
+[adjustConfig setLogLevel:ADJLogLevelVerbose]; // すべてのログを有効にする
+[adjustConfig setLogLevel:ADJLogLevelDebug]; // より詳細なログを記録する
+[adjustConfig setLogLevel:ADJLogLevelInfo]; // デフォルト
+[adjustConfig setLogLevel:ADJLogLevelWarn]; // infoのログを無効にする
+[adjustConfig setLogLevel:ADJLogLevelError]; // warningsを無効にする
+[adjustConfig setLogLevel:ADJLogLevelAssert]; // errorsも無効にする
+[adjustConfig setLogLevel:ADJLogLevelSuppress]; // すべてのログを無効にする
+```
+
+本番用のアプリにadjust SDKのログを表示させたくない場合は、ログレベルを`ADJLogLevelSuppress`に設定してください。
+加えて、ログレベルをsuppressに設定する部分で`ADJConfig`オブジェクトを以下のように初期化してください。
+
+```objc
+#import "Adjust.h"
+// or #import
+// or #import
+// or #import
+// or #import
+
+// ...
+
+NSString *yourAppToken = @"{YourAppToken}";
+NSString *environment = ADJEnvironmentSandbox;
+ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken
+ environment:environment
+ allowSupressLogLevel:YES];
+
+[Adjust appDidLaunch:adjustConfig];
+```
+
+#### アプリのビルド
+
+アプリをビルドして実行しましょう。ビルドが成功したら、コンソールに表示されるSDKログを注視してください。
+初めてアプリが実行されたあと、`Install tracked`のinfoが出力されるはずです。
+
+![][run]
+
+### 追加機能
+
+adjust SDKの実装ができたら、更に以下の機能を利用することができます。
+
+#### イベントトラッキング
+
+adjustを使ってイベントトラッキングができます。ここではあるボタンのタップを毎回トラックしたい場合について説明します。
+[dashboard]にてイベントトークンを作成し、そのイベントトークンは仮に`abc123`というイベントトークンと関連しているとします。
+タップをトラックするため、ボタンの`buttonDown`メソッドに以下のような記述を追加します。
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+[Adjust trackEvent:event];
+```
+
+こうすると、ボタンがタップされた時にログに`Event tracked`と出力されるようになります。
+
+このイベントインスタンスはトラッキング前のイベントを設定するためにも使えます。
+
+##### 収益のトラッキング
+
+広告をタップした時やアプリ内課金をした時などにユーザーが報酬を得る仕組みであれば、そういったイベントもトラッキングできます。
+1回のタップで1ユーロセントの報酬と仮定すると、報酬イベントは以下のようになります。
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event setRevenue:0.01 currency:@"EUR"];
+
+[Adjust trackEvent:event];
+```
+
+もちろんこれはコールバックパラメータと紐付けることができます。
+
+通貨トークンを設定する場合、adjustは自動的に収益を任意の報酬に変換します。
+更に詳しくは[通貨の変換][currency-conversion]をご覧ください。
+
+収益とイベントトラッキングについては[イベントトラッキングガイド](https://docs.adjust.com/en/event-tracking/#reference-tracking-purchases-and-revenues)もご参照ください。
+
+##### 収益の重複排除
+
+報酬を重複してトラッキングすることを防ぐために、トランザクションIDを随意で設定することができます。
+最新の10のトランザクションIDが記憶され、重複したトランザクションIDの収益イベントは除外されます。
+これはアプリ内課金のトラッキングに特に便利です。下記に例を挙げます。
+
+アプリ内課金をトラッキングする際は、状態が`SKPaymentTransactionStatePurchased`に変わって初めて
+`paymentQueue:updatedTransaction`中の`finishTransaction`の後で`trackEvent`をコールするようにしてください。
+こうすることで、実際には生成されない報酬をトラッキングすることを防ぐことができます。
+
+```objc
+- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
+ for (SKPaymentTransaction *transaction in transactions) {
+ switch (transaction.transactionState) {
+ case SKPaymentTransactionStatePurchased:
+ [self finishTransaction:transaction];
+
+ ADJEvent *event = [ADJEvent eventWithEventToken:...];
+ [event setRevenue:... currency:...];
+ [event setTransactionId:transaction.transactionIdentifier]; // avoid duplicates
+ [Adjust trackEvent:event];
+
+ break;
+ // more cases
+ }
+ }
+}
+```
+
+##### アプリ内課金の検証
+
+adjustのサーバーサイドのレシート検証ツール、Purchase Verificationを使ってアプリ内で行われたアプリ内課金の妥当性を調べる際は、
+iOS purchase SDKをご利用ください。詳しくは[こちら][ios-purchase-verification]
+
+##### コールバックパラメータ
+
+[dashboard]でイベントにコールバックURLを登録することができます。イベントがトラッキングされるたびに
+そのURLにGETリクエストが送信されます。トラッキングする前にイベントで`addCallbackParameter`をコールすることによって、
+イベントにコールバックパラメータを追加できます。そうして追加されたパラメータはコールバックURLに送られます。
+
+例えば、コールバックURLに`http://www.mydomain.com/callback`を登録した場合、イベントトラッキングは以下のようになります。
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event addCallbackParameter:@"key" value:@"value"];
+[event addCallbackParameter:@"foo" value:@"bar"];
+
+[Adjust trackEvent:event];
+```
+
+この場合、adjustはこのイベントをトラッキングし以下にリクエストが送られます。
+
+ http://www.mydomain.com/callback?key=value&foo=bar
+
+パラメータの値として使われることのできるプレースホルダーは、`{idfa}`のような様々な形に対応しています。
+得られるコールバック内で、このプレースホルダーは該当デバイスの広告主用のIDに置き換えられます。
+独自に設定されたパラメータには何も格納しませんが、コールバックに追加されます。
+イベントにコールバックを登録していない場合は、これらのパラメータは使われません。
+
+URLコールバックについて詳しくは[コールバックガイド][callbacks-guide]をご覧ください。
+利用可能な値のリストもこちらで参照してください。
+
+##### パートナーパラメータ
+
+adjustのダッシュボード上で連携が有効化されているネットワークパートナーに送信するパラメータを設定することができます。
+
+これは上記のコールバックパラメータと同様に機能しますが、
+`ADJEvent`インスタンスの`addPartnerParameter`メソッドをコールすることにより追加されます。
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event addPartnerParameter:@"key" value:@"value"];
+[event addPartnerParameter:@"foo" value:@"bar"];
+
+[Adjust trackEvent:event];
+```
+
+スペシャルパートナーとその統合について詳しくは[連携パートナーガイド][special-partners]をご覧ください。
+
+### コールバック ID
+トラッキングしたいイベントにカスタムIDを追加できます。このIDはイベントをトラッキングし、成功か失敗かの通知を受け取けとれるようコールバックを登録することができます。このIDは`ADJEvent`インスタンスの`setCallbackId`メソッドと呼ぶように設定できます:
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event setCallbackId:@"Your-Custom-Id"];
+
+[Adjust trackEvent:event];
+```
+
+#### セッションパラメータ
+
+いくつかのパラメータは、adjust SDKのイベントごと、セッションごとに送信するために保存されます。
+このいずれかのパラメータを追加すると、これらはローカル保存されるため、毎回追加する必要はありません。
+同じパラメータを再度追加しても何も起こりません。
+
+これらのセッションパラメータはadjust SDKが立ち上がる前にコールすることができるので、インストール時に送信を確認することもできます。
+インストール時に送信したい場合は、adjust SDKの初回立ち上げを[遅らせる](#delay-start)ことができます。
+ただし、必要なパラメータの値を得られるのは立ち上げ後となります。
+
+##### セッションコールバックパラメータ
+
+[イベント](#callback-parameters)で設定された同じコールバックパラメータを、
+adjust SDKのイベントごとまたはセッションごとに送信するために保存することもできます。
+
+セッションコールバックパラメータのインターフェイスとイベントコールバックパラメータは似ています。
+イベントにキーと値を追加する代わりに、`Adjust`の`addSessionCallbackParameter:value:`メソッドへのコールで追加されます。
+
+```objc
+[Adjust addSessionCallbackParameter:@"foo" value:@"bar"];
+```
+
+セッションコールバックパラメータは、イベントに追加されたコールバックパラメータとマージされます。
+イベントに追加されたコールバックパラメータは、セッションコールバックパラメータより優先されます。
+イベントに追加されたコールバックパラメータがセッションから追加されたパラメータと同じキーを持っている場合、
+イベントに追加されたコールバックパラメータの値が優先されます。
+
+`removeSessionCallbackParameter`メソッドに指定のキーを渡すことで、
+特定のセッションコールバックパラメータを削除することができます。
+
+```objc
+[Adjust removeSessionCallbackParameter:@"foo"];
+```
+
+セッションコールバックパラメータからすべてのキーと値を削除したい場合は、
+`resetSessionCallbackParameters`メソッドを使ってリセットすることができます。
+
+```objc
+[Adjust resetSessionCallbackParameters];
+```
+
+##### セッションパートナーパラメータ
+
+adjust SDKのイベントごとやセッションごとに送信される[セッションコールバックパラメータ](#session-callback-parameters)があるように、
+セッションパートナーパラメータも用意されています。
+
+これらはネットワークパートナーに送信され、adjust[ダッシュボード]で有効化されている連携のために利用されます。
+
+セッションパートナーパラメータのインターフェイスとイベントパートナーパラメータは似ています。
+イベントにキーと値を追加する代わりに、`Adjust`の`addSessionPartnerParameter:value:`メソッドへのコールで追加されます。
+
+```objc
+[Adjust addSessionPartnerParameter:@"foo" value:@"bar"];
+```
+
+セッションパートナーパラメータはイベントに追加されたパートナーパラメータとマージされます。イベントに追加されたパートナーパラメータは、
+セッションパートナーパラメータより優先されます。イベントに追加されたパートナーパラメータが
+セッションから追加されたパラメータと同じキーを持っている場合、イベントに追加されたパートナーパラメータの値が優先されます。
+
+`removeSessionPartnerParameter`.メソッドに指定のキーを渡すことで、
+特定のセッションパートナーパラメータを削除することができます。
+
+```objc
+[Adjust removeSessionPartnerParameter:@"foo"];
+```
+
+セッションパートナーパラメータからすべてのキーと値を削除したい場合は、
+`resetSessionPartnerParameters`メソッドを使ってリセットすることができます。
+
+```objc
+[Adjust resetSessionPartnerParameters];
+```
+
+##### ディレイスタート
+
+adjust SDKのスタートを遅らせると、ユニークIDなどのセッションパラメータを取得しインストール時に送信できるようにすることがでいます。
+
+`ADJConfig`インスタンスの`setDelayStart`メソッドで、遅らせる時間を秒単位で設定できます。
+
+```objc
+[adjustConfig setDelayStart:5.5];
+```
+
+この場合、adjust SDKは最初のインストールセッションと生成されるイベントを初めの5.5秒間は送信しません。
+この時間が過ぎるまで、もしくは`[Adjust sendFirstPackages]`がコールされるまで、
+セッションパラメータはすべてディレイインストールセッションとイベントに追加され、adjust SDKは通常通り再開します。
+
+**adjust SDKのディレイスタートは最大で10秒です。**
+
+#### アトリビューションコールバック
+
+トラッカーのアトリビューション変化の通知を受けるために、デリゲートコールバックを登録することができます。
+アトリビューションには複数のソースがあり得るため、この情報は同時に送ることができません。
+次の手順に従って、アプリデリゲートでデリゲートプロトコルを実装してください。
+
+[アトリビューションデータに関するポリシー][attribution-data]を必ずご確認ください。
+
+1. `AppDelegate.h`を開いてインポートと`AdjustDelegate`の宣言を追加してください。
+
+ ```objc
+ @interface AppDelegate : UIResponder
+ ```
+
+2. `AppDelegate.m`を開き、以下のデリゲートコールバック関数を追加してください。
+
+ ```objc
+ - (void)adjustAttributionChanged:(ADJAttribution *)attribution {
+ }
+ ```
+
+3. `ADJConfig`インスタンスにデリゲートを設定してください。
+
+ ```objc
+ [adjustConfig setDelegate:self];
+ ```
+
+デリゲートコールバックが`ADJConfig`インスタンスを使っているため、`[Adjust appDidLaunch:adjustConfig]`をコールする前に`setDelegate`をコールする必要があります。
+
+このデリゲート関数は、SDKが最後のアトリビューションデータを取得した時に作動します。
+デリゲート関数内で`attribution`パラメータを確認することができます。このパラメータのプロパティの概要は以下の通りです。
+
+- `NSString trackerToken` 最新アトリビューションのトラッカートークン
+- `NSString trackerName` 最新アトリビューションのトラッカー名
+- `NSString network` 最新アトリビューションのネットワークのグループ階層
+- `NSString campaign` 最新アトリビューションのキャンペーンのグループ階層
+- `NSString adgroup` 最新アトリビューションのアドグループのグループ階層
+- `NSString creative` 最新アトリビューションのクリエイティブのグループ階層
+- `NSString clickLabel` 最新アトリビューションのクリックラベル
+- `NSString adid` adjustユニークID
+
+#### イベントとセッションのコールバック
+
+イベントとセッションの双方もしくはどちらかをトラッキングし、成功か失敗かの通知を受け取れるようデリゲートコールバックを登録することができます。
+[アトリビューションコールバック](#attribution-callback)に使われる`AdjustDelegate`プロトコルをここでも任意で使うことができます。
+
+成功したイベントへのデリゲートコールバック関数を以下のように実装してください。
+
+```objc
+- (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData {
+}
+```
+
+失敗したイベントへは以下のように実装してください。
+
+```objc
+- (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData {
+}
+```
+
+同様に、成功したセッション
+
+```objc
+- (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessResponseData {
+}
+```
+
+失敗したセッション
+
+```objc
+- (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseData {
+}
+```
+
+デリゲート関数はSDKがサーバーにパッケージ送信を試みた後で呼ばれます。
+デリゲートコールバック内でデリゲートコールバック用のレスポンスデータオブジェクトを確認することができます。
+レスポンスデータのプロパティの概要は以下の通りです。
+
+- `NSString message` サーバーからのメッセージまたはSDKのエラーログ
+- `NSString timeStamp` サーバーからのタイムスタンプ
+- `NSString adid` adjustから提供されるユニークデバイスID
+- `NSDictionary jsonResponse` サーバーからのレスポンスのJSONオブジェクト
+
+イベントのレスポンスデータは以下を含みます。
+
+- `NSString eventToken` トラッキングされたパッケージがイベントだった場合、そのイベントトークン
+- `NSString callbackid` イベントオブジェクトにカスタム設定されたコールバックID
+
+失敗したイベントとセッションは以下を含みます。
+
+- `BOOL willRetry` しばらく後に再送を試みる予定であるかどうかを示します。
+
+#### トラッキングの無効化
+
+`setEnabled`にパラメータ`NO`を渡すことで、adjustSDKが行うデバイスのアクティビティのトラッキングをすべて無効にすることができます。
+**この設定はセッション間で記憶されます** 最初のセッションの後でしか有効化できません。
+
+```objc
+[Adjust setEnabled:NO];
+```
+
+adjust SDKが現在有効かどうか、`isEnabled`関数を呼び出せば確認できます。
+また、`setEnabled`関数に`YES`を渡せば、adjust SDKを有効にすることができます。
+
+#### オフラインモード
+
+adjustのサーバーへの送信を一時停止し、保持されているトラッキングデータを後から送信するために
+adjust SDKをオフラインモードにすることができます。
+オフラインモード中はすべての情報がファイルに保存されるので、イベントをたくさん発生させすぎないようにご注意ください。
+
+`YES`パラメータで`setOfflineMode`を呼び出すとオフラインモードを有効にできます。
+
+```objc
+[Adjust setOfflineMode:YES];
+```
+
+反対に、`NO`パラメータで`setOfflineMode`を呼び出せばオフラインモードを解除できます。
+adjust SDKがオンラインモードに戻った時、保存されていた情報は正しいタイムスタンプでadjustのサーバーに送られます。
+
+トラッキングの無効化とは異なり、この設定はセッション間で*記憶されません*。
+オフラインモード時にアプリを終了しても、次に起動した時にはオンラインモードとしてアプリが起動します。
+
+#### イベントバッファリング
+
+イベントトラッキングを酷使している場合、HTTPリクエストを遅らせて1分毎にまとめて送信したほうがいい場合があります。
+その場合は、`ADJConfig`インスタンスでイベントバッファリングを有効にしてください。
+
+```objc
+[adjustConfig setEventBufferingEnabled:YES];
+```
+
+設定されていない場合、イベントバッファリングは**デフォルトで無効**になっています。
+
+### GDPR消去する権利(忘れられる権利)
+
+次のメソッドを呼び出すと、EUの一般データ保護規制(GDPR)第17条に従い、ユーザーが消去する権利(忘れられる権利)を行使した際にAdjust SDKがAdjustバックエンドに情報を通知します。
+
+```objc
+[Adjust gdprForgetMe];
+```
+
+この情報を受け取ると、Adjustはユーザーのデータを消去し、Adjust SDKはユーザーの追跡を停止します。この削除された端末からのリクエストは今後、Adjustに送信されません。
+
+#### バックグラウンドでのトラッキング
+
+adjust SDKはデフォルドではアプリがバックグラウンドにある時はHTTPリクエストを停止します。
+この設定は`AdjustConfig`インスタンスで変更できます。
+
+```objc
+[adjustConfig setSendInBackground:YES];
+```
+
+設定されていない場合、バックグラウンドでの送信は**デフォルトで無効**になっています。
+
+#### デバイスID
+
+Google Analyticsなどの一部のサービスでは、レポートの重複を防ぐためにデバイスIDとクライアントIDを連携させることが求められます。
+
+デバイスID IDFAを取得するには、`idfa`関数をコールしてください。
+
+```objc
+NSString *idfa = [Adjust idfa];
+```
+
+#### Pushトークン
+
+プッシュ通知のトークンを送信するには、アプリケーションデリゲートにて
+`didRegisterForRemoteNotificationsWithDeviceToken`内の`Adjust`に以下の記述を追加してください。
+
+```objc
+- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+ [Adjust setDeviceToken:deviceToken];
+}
+```
+
+#### プレインストールのトラッカー
+
+すでにアプリをインストールしたことのあるユーザーをadjust SDKを使って識別したい場合は、次の手順で設定を行ってください。
+
+1. [dashboard]上で新しいトラッカーを作成してください。
+
+2. App Delegateを開き、`ADJConfig`のデフォルトトラッカーを設定してください。
+
+ ```objc
+ ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken environment:environment];
+ [adjustConfig setDefaultTracker:@"{TrackerToken}"];
+ [Adjust appDidLaunch:adjustConfig];
+ ```
+
+ `{TrackerToken}`にステップ2で作成したトラッカートークンを入れてください。
+ ダッシュボードには`http://app.adjust.com/`を含むトラッカーURLが表示されます。
+ ソースコード内にはこのURLすべてではなく、6文字のトークンを抜き出して指定してください。
+
+3. アプリをビルドしてください。Xcodeで下記のような行が表示されるはずです。
+
+ ```
+ Default tracker: 'abc123'
+ ```
+
+#### ディープリンキング
+
+URLからアプリへのディープリンクを使ったadjustトラッカーURLをご利用の場合、ディープリンクURLとその内容の情報を得られる可能性があります。
+ユーザーがすでにアプリをインストールしている状態でそのURLに訪れた場合(スタンダード・ディープリンキング)と、
+アプリをインストールしていないユーザーがURLを開いた場合(ディファード・ディープリンキング)が有り得ます。
+どちらの場合もadjust SDKでサポートでき、ディープリンクURLはユーザーがそのURLを訪れてからアプリを開いた後で提供されます。
+この機能を使う場合は、正しい設定を行ってください。
+
+##### スタンダード・ディープリンキング
+
+アプリをすでにインストールしているユーザーがディープリンクデータの付加されたトラッカーURLを開いた場合、
+アプリが開かれるとディープリンクの情報はアプリに送信されます。iOS 9以降において、Apple社はディープリンクの扱いを変更しています。
+どちらの状況でアプリにディープリンクを使うか、もしくはあらゆる端末をカバーするために両方でディープリンクを使うかによって、
+以下のいずれかまたは両方の設定を行ってください。
+
+##### iOS 8以前でのディープリンキング
+
+iOS 8以前の端末でのディープリンキングはカスタムURLスキームの設定によって行なわれます。アプリが開かれるためのカスタムURLスキーム名をつける必要があります。
+このスキーム名はadjustトラッカーURLでも`deep_link`パラメータとして使われます。これを設定するには、`Info.plist`ファイルを開き
+`URL types`の行を新たに追加してください。そこにアプリのバンドルIDを`URL identifier`として入力し、`URL schemes`の欄に該当のスキーム名を入れてください。
+下記の例では、`adjustExample`というスキーム名を扱います。
+
+![][custom-url-scheme]
+
+これが設定されると、該当のスキーム名を含む`deep_link`パラメータを持つadjustトラッカーURLをクリックした後でアプリが開かれます。
+アプリが開かれた後、`AppDelegate`クラスの`openURL`メソッドが呼ばれ、トラッカーURLの`deep_link`パラメータの内容が送信されます。
+このディープリンクの内容データを利用したい場合、このメソッドを上書きしてください。
+
+```objc
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
+ sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
+ // url object contains your deep link content
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+これで、iOS 8以前の端末へのディープリンクの設定は完了です。
+
+##### iOS 9以前でのディープリンキング
+
+iOS 9以降の端末へディープリンクを対応させるためには、Appleのユニバーサルリンクを有効化させる必要があります。
+ユニバーサルリンクについて、それらの設定については[こちら][universal-links]をご確認ください。
+
+adjustはユニバーサルリンクをサポートするために様々な対応をしています。
+adjustでユニバーサルリンクを使うには、adjustダッシュボードでユニバーサルリンクのための設定を行ってください。
+詳しくは[公式資料][universal-links-guide]をご覧ください。
+
+ダッシュボードでの設定が完了したら、以下の作業を行ってください。
+
+Appleディベロッパポータルでアプリの`Associated Domains`を有効化し、Xcodeプロジェクトでも同様にしてください。
+`applinks:`を前につけてadjustダッシュボードの`Domains`ページで生成されたユニバーサルリンクを追加してください。
+ユニバーサルリンクから`http(s)`を削除することを忘れずにご確認ください。
+
+![][associated-domains-applinks]
+
+この設定が完了すると、adjustのトラッカーユニバーサルリンクがクリックされた後にアプリが開かれます。
+アプリが開いた後、`AppDelegate`クラスの`continueUserActivity`メソッドが呼ばれ、ユニバーサルリンクURLの内容が送信されます。
+このディープリンクの内容データを利用したい場合、このメソッドを上書きしてください。
+
+``` objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL url = [userActivity webpageURL];
+
+ // url object contains your universal link content
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+これで、iOS 9以降の端末へのディープリンクの設定は完了です。
+
+従来のカスタムURLスキームのフォーマットでディープリンクを受け取るような独自のロジックを実装されている場合のために、
+adjustはユニバーサルリンクを従来のディープリンクURLに変換するヘルパー関数を用意しています。
+ユニバーサルリンクとカスタムURLスキームをこのメソッドに渡すと、カスタムURLスキームのディープリンクが生成されます。
+
+``` objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL url = [userActivity webpageURL];
+
+ NSURL *oldStyleDeeplink = [Adjust convertUniversalLink:url scheme:@"adjustExample"];
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+##### ディファード・ディープリンキング
+
+ディファード・ディープリンクが開く前に通知を受けるデリゲートコールバックを登録し、adjust SDKがそれを開くかどうか決めることができます。
+[アトリビューションコールバック](#attribution-callback)や[イベントとセッションのコールバック](event-session-callbacks)に使われる
+`AdjustDelegate`プロトコルをここでも使うことができます。
+
+次のステップに進み、ディファード・ディープリンクのデリゲートコールバック関数を以下のように実装してください。
+
+```objc
+- (void)adjustDeeplinkResponse:(NSURL *)deeplink {
+ // deeplink object contains information about deferred deep link content
+
+ // Apply your logic to determine whether the adjust SDK should try to open the deep link
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+コールバック関数はSDKがサーバーからDeferredディープリンクを受け取った後、それを開く前にコールされます。
+コールバック関数内で、ディープリンクとSDKがディープリンクを立ち上げるかどうかのboolean値を確認できます。
+例えば、ディープリンクをすぐには開かないようにした場合、それを保存し後から任意のタイミングで開くよう設定できます。
+
+このコールバックが実装されていない場合、**adjust SDKはデフォルトで常にディープリンクを開きます**。
+
+##### ディープリンクを介したリアトリビューション
+
+adjustはディープリンクを使ったリエンゲージメントキャンペーンをサポートしています。
+詳しくは[公式資料][reattribution-with-deeplinks]をご覧ください。
+
+この機能をご利用の場合、ユーザーが正しくリアトリビューションされるために、adjust SDKへのコールを追加してください。
+
+アプリでディープリンクの内容データを受信したら、`appWillOpenUrl`メソッドへのコールを追加してください。
+このコールによって、adjust SDKはディープリンクの中に新たなアトリビューションが存在するかを調べ、あった場合はadjustサーバーにこれを送信します。
+ディープリンクのついたadjustトラッカーURLのクリックによってユーザーがリアトリビュートされる場合、
+[アトリビューションコールバック](#attribution-callback)がこのユーザーの新しいアトリビューションデータで呼ばれます。
+
+すべてのiOSバージョンにおいて、ディープリンキング・リアトリビューションをサポートするための`appWillOpenUrl`のコールは下記のようになります。
+
+```objc
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
+ sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
+ // url object contains your deep link content
+
+ [Adjust appWillOpenUrl:url];
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+``` objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL url = [userActivity webpageURL];
+
+ [Adjust appWillOpenUrl:url];
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+### トラブルシューティング
+
+#### SDK初期化時の問題
+
+[基本設定](#basic-setup)で説明した通り、アプリケーションデリゲートの`didFinishLaunching`か`didFinishLaunchingWithOptions`の
+どちらかのメソッド内でadjust SDKを初期化することを強くお奨めします。
+ここでなるべく早くadjust SDKを初期化することは非常に重要で、こうすればSDKのすべての機能を使うことができます。
+
+この時にadjust SDKを初期化しないと、アプリ内のトラッキングにあらゆる影響が出ます。
+**トラッキングを正しく行うために、adjust SDKは*必ず*初期化してください。**
+
+以下のいずれかを行いたい場合、`SDK初期化前だと実行されません`。
+
+* [イベントトラッキング](#event-tracking)
+* [ディープリンクを介したリアトリビューション](#deeplinking-reattribution)
+* [トラッキングの無効化](#disable-tracking)
+* [オフラインモード](#offline-mode)
+
+実際に初期化する前にadjust SDKのすべての機能を利用できるようにしたい場合、
+アプリ内に`カスタムアクション・キューイングメカニズム`を構築するという方法があります。
+adjust SDKに行わせたいすべての処理をキューに格納し、SDKが初期化された後で処理させます。
+
+オフラインモードの状態は変わらず、トラッキングの有効/無効の状態も変わらず、
+ディープリンクリアトリビューションは不可でイベントトラッキングは`排除されます`。
+
+セッションのトラッキングもSDK初期化のタイミングに影響される可能性があります。
+adjust SDKは初期化されるまでどんなセッションも回収できません。
+これはトラッキングの精度に影響を与え、ダッシュボード上のDAUの数値が正しく測定されない可能性があります。
+
+ここに例を上げます: スプラッシュ画面や初めのスクリーン以外のあるViewまたはView Controllerがロードされる時にadjust SDKをスタートするとし、
+ユーザーはホームスクリーンからそこへ遷移すると仮定します。
+ユーザーがアプリをダウンロードして開いた時、ホームスクリーンが表示されます。
+この時、このユーザーによるインストールはトラッキングされているはずで、そのユーザーは何らかのキャンペーンから誘導されて来たのでしょう。
+そのユーザーがアプリを起動した時、そのデバイスからセッションが作られ、アプリのアクティブユーザーとなります。
+しかしadjust SDKはこの一連の流れを全く関知しません。adjust SDKを初期化すると設定されたスクリーンにユーザーが移動する必要があるからです。
+ユーザーが何らかの理由でアプリを気に入らず、ホームスクリーンを表示した直後にアンインストールした場合、
+このユーザーのアクションに関するすべての情報はadjust SDKにトラッキングされることはなく、ダッシュボードにも表示されません。
+
+##### イベントトラッキング
+
+イベントをトラッキングするために、トラッキングしたいイベントを内部でキューイングメカニズムに入れ、
+SDKが初期化された後でトラッキングしてください。
+SDKが初期化される前に作られたイベントトラッキングは、そのイベントが`除外されたり`、`永久に失われる`ことに繋がります。
+そうならないために、SDKが`初期化`されて[`有効化`](#is-enabled)されてからトラッキングするようにしてください。
+
+##### オフラインモード、トラッキングの有効化/無効化
+
+オフラインモードはSDKの初期化の間で保持されるものではありません。なので、デフォルトでは`無効`に設定されます。
+SDKの初期化前にオフラインモードを有効にしたい場合でも、最終的にSDKが初期化されるまでは`無効`のままです。
+
+トラッキングの有効化/無効化はSDK初期化の間でも保持されます。SDK初期化の前にこの値を切り替えたい場合は、
+切り替えは無視されます。初期化されると、SDKは切り替えを指示された状態(有効/無効)になります。
+
+##### Reattribution via deep linksディープリンクを介したリアトリビューション
+
+[上記](#deeplinking-reattribution)の通り、ディープリンク・リアトリビューションを使う際は、
+旧式かユニバーサルリンクのどちらのディープリンクメカニズムかによりますが、
+以下のコールをした後に`NSURL`オブジェクトが得られます。
+
+```objc
+[Adjust appWillOpenUrl:url]
+```
+
+このコールをSDK初期化の前に行った場合、アトリビュートされるべきだったURLからのディープリンクの情報は永久に失われます。
+リアトリビューションを正しく行いたい場合は、この`NSURL`オブジェクトをキューにし
+SDKが初期化されたら`appWillOpenUrl`メソッドが呼ばれるようにしてください。
+
+##### セッショントラッキング
+
+セッションのトラッキングはadjust SDKが自動で行い、アプリ開発者が制御することはできません。
+セッショントラッキングを正しく行うためには、このREADMEで推奨される通りにadjust SDKを初期化することは極めて重要です。
+これをしないと、セッショントラッキングやダッシュボードに表示されるDAUの数値に予測不能な影響が出る恐れがあります。
+起こりうる誤りは様々で、うちいくつかを下に挙げます。
+
+* SDKが初期化される前にユーザーがアプリを削除すると、そのインストールとセッションはトラッキングされず、ダッシュボードに記録されることもありません。
+* SDKの初期化が午前0時以降だった場合にユーザーが午前0時前にアプリをダウンロードし開いた場合、
+インストールとセッションは翌日のものとして記録される恐れがあります。
+* SDKの初期化が午前0時以降だった場合、ある日ユーザーが全くアプリを開かず、日付が変わった直後に開いたとき、
+アプリが開かれた日とは別の日のDAUに計上される恐れがあります。
+
+これらの現象を避けるため、アプリケーションデリゲートの`didFinishLaunching`か`didFinishLaunchingWithOptions`メソッドにて
+必ずadjust SDKを初期化してください。
+
+#### "Adjust requires ARC"というエラーが出る
+
+`Adjust requires ARC`というエラーが出てビルドに失敗した場合、そのプロジェクトは[ARC][arc]を使っていないと思われます。
+その場合、[ARCを使うようプロジェクトを移行する][transition]ことをお奨めします。
+ARCを使いたくない場合は、ターゲットのビルドの段階でadjustのすべてのソースファイルでARCを有効化する必要があります。手順は次の通りです。
+
+`Compile Sources`を展開し、adjustのすべてのソースファイルを選択してください。
+`Compiler Flags`を`-fobjc-arc`に変更してください。(すべてを選択し`Return`キーを押すとすべて一括で変えられます。)
+
+#### "\[UIDevice adjTrackingEnabled\]: unrecognized selector sent to instance"というエラーが出る
+
+このエラーはアプリにadjust SDKをフレームワークとして追加している場合に起こり得ます。
+adjust SDKはソースファイル中に`categories`があり、このためこの方法でSDKの統合をした場合は
+Xcodeプロジェクトの設定の`Other Linker Flags`に`-ObjC`フラグを追加する必要があります
+
+#### "Session failed (Ignoring too frequent session.)"というエラーが出る
+
+このエラーはインストールのテストの際に起こります。アンインストール後に再度インストールするだけでは新規インストールとして動作しません。
+SDKがローカルで統計したセッションデータを失ったとサーバーは判断してエラーメッセージを無視し、
+その端末に関する有効なデータのみが与えられます。
+
+この仕様はテスト中には厄介かもしれませんが、サンドボックスと本番用の挙動をできる限り近づけるために必要です。
+
+adjustのサーバーにある端末のセッションデータをリセットすることができます。ログにあるエラーメッセージをチェックしてください。
+
+```
+Session failed (Ignoring too frequent session. Last session: YYYY-MM-DDTHH:mm:ss, this session: YYYY-MM-DDTHH:mm:ss, interval: XXs, min interval: 20m) (app_token: {yourAppToken}, adid: {adidValue})
+```
+
+With the `{yourAppToken}` and either `{adidValue}` or `{idfaValue}` values filled in below, open one
+of the following links:
+
+```
+http://app.adjust.com/forget_device?app_token={yourAppToken}&adid={adidValue}
+```
+
+```
+http://app.adjust.com/forget_device?app_token={yourAppToken}&idfa={idfaValue}
+```
+
+端末に関する記録が消去されると、このリンクは`Forgot device`と返します。
+もしその端末の記録がすでに消去されていたり、値が不正だった場合は`Device not found`が返ります。
+
+#### ログに"Install tracked"が出力されない
+
+テスト端末でインストールをシミュレーションしたい場合、すでにインストールされたアプリがあるままのテスト端末で
+Xcodeからアプリを再度立ち上げるだけでは不十分です。アプリを再度立ち上げ直してもアプリのデータは消去されず、
+アプリ内にあるSDKのファイルはすべてそのままです。なので、再度立ち上げてもSDKはそれらのファイルを認識し、
+アプリはすでにインストール済み(かつSDKはすでに起動済み)であると判断します。
+初めての起動ではなく、何回めかに開かれたと判断されます。
+
+インストールをシミュレーションする場合は次の手順で行ってください。
+
+* 端末からアプリをアンインストールします (完全に消去してください)
+* [上記](#forget-device)の方法でadjustのサーバーから端末に関する記録を消去してください
+* Xcodeから端末上でアプリを立ち上げると、"Install tracked"が表示されるはずです
+
+#### "Unattributable SDK click ignored"というメッセージが出る
+
+`sandbox`環境でテストをしている時にこのメッセージが出ることがあり、
+これはAppleが`iAd.framework`バージョン3でリリースした変更と関連しています。
+ユーザーはiAdバナーをクリックすることでアプリへ誘導され、これによりSDKは`sdk_click`パッケージをadjustサーバーに送り
+クリックされたURLの内容について知らせます。iAdバナーがクリックされずにアプリが開かれた場合、iAdバナーURLが人為的に作られ、
+ランダムな値とともに送られるようAppleが設定しました。adjust SDKはこうした人為的なものと実際にクリックされてできたURLを判別できず、
+どちらであってもadjustサーバーに`sdk_click`パッケージを送ります。もしログレベルを`verbose`に設定していれば、
+以下のような`sdk_click`パッケージが表示されます。
+
+```
+[Adjust]d: Added package 1 (click)
+[Adjust]v: Path: /sdk_click
+[Adjust]v: ClientSdk: ios4.10.1
+[Adjust]v: Parameters:
+[Adjust]v: app_token {YourAppToken}
+[Adjust]v: created_at 2016-04-15T14:25:51.676Z+0200
+[Adjust]v: details {"Version3.1":{"iad-lineitem-id":"1234567890","iad-org-name":"OrgName","iad-creative-name":"CreativeName","iad-click-date":"2016-04-15T12:25:51Z","iad-campaign-id":"1234567890","iad-attribution":"true","iad-lineitem-name":"LineName","iad-creative-id":"1234567890","iad-campaign-name":"CampaignName","iad-conversion-date":"2016-04-15T12:25:51Z"}}
+[Adjust]v: environment sandbox
+[Adjust]v: idfa XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+[Adjust]v: idfv YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
+[Adjust]v: needs_response_details 1
+[Adjust]v: source iad3
+```
+
+何らかの理由でこの`sdk_click`が受け付けられた場合、別のキャンペーンURLをクリックすることによりアプリを開いたユーザーもしくはオーガニックユーザーが、
+この存在しないiAdソースにアトリビュートされることを意味します。このため、adjustサーバーはこれを無視し、下記のメッセージを表示します。
+
+```
+[Adjust]v: Response: {"message":"Unattributable SDK click ignored."}
+[Adjust]i: Unattributable SDK click ignored.
+```
+
+このメッセージはSDKの連携に問題があることを意味しているわけではありません。ユーザーが間違ってアトリビュートまたはリアトリビュートされる可能性のある
+人為的に生成された`sdk_click`をadjustが無視したことを示しています。
+
+#### adjustダッシュボード上で表示される収益データが間違っている
+
+adjust SDKはトラッキングするよう設定されたものをトラッキングします。イベントに収益を付加している場合、金額として入力した数字のみがadjustサーバーに送信され
+ダッシュボードに表示されます。adjust SDKおよびadjustサーバーは金額の値を操作しません。トラッキングされた値が間違っている場合は、
+adjust SDKがトラッキングするよう設定された値が間違っていることになります。
+
+通常、収益イベントをトラッキングするためのコードは次のようになります。
+
+```objc
+// ...
+
+- (double)someLogicForGettingRevenueAmount {
+ // This method somehow handles how user determines
+ // what's the revenue value which should be tracked.
+
+ // It is maybe making some calculations to determine it.
+
+ // Or maybe extracting the info from In-App purchase which
+ // was successfully finished.
+
+ // Or maybe returns some predefined double value.
+
+ double amount; // double amount = some double value
+
+ return amount;
+}
+
+// ...
+
+- (void)someRandomMethodInTheApp {
+ double amount = [self someLogicForGettingRevenueAmount];
+
+ ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+ [event setRevenue:amount currency:@"EUR"];
+ [Adjust trackEvent:event];
+}
+
+```
+
+トラッキングされるべき値とは違う値がダッシュボードに表示されている場合は、**金額の値を決定するロジックの部分をご確認ください**。
+
+
+[dashboard]: http://adjust.com
+[adjust.com]: http://adjust.com
+
+[en-readme]: ../../README.md
+[zh-readme]: ../chinese/README.md
+[ja-readme]: ../japanese/README.md
+[ko-readme]: ../korean/README.md
+
+[arc]: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
+[examples]: http://github.com/adjust/ios_sdk/tree/master/examples
+[carthage]: https://github.com/Carthage/Carthage
+[releases]: https://github.com/adjust/ios_sdk/releases
+[cocoapods]: http://cocoapods.org
+[transition]: http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
+
+[example-tvos]: examples/AdjustExample-tvOS
+[example-iwatch]: examples/AdjustExample-iWatch
+[example-imessage]: examples/AdjustExample-iMessage
+[example-ios-objc]: examples/AdjustExample-iOS
+[example-ios-swift]: examples/AdjustExample-Swift
+
+[AEPriceMatrix]: https://github.com/adjust/AEPriceMatrix
+[event-tracking]: https://docs.adjust.com/en/event-tracking
+[callbacks-guide]: https://docs.adjust.com/en/callbacks
+[universal-links]: https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html
+
+[special-partners]: https://docs.adjust.com/en/special-partners
+[attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md
+[ios-web-views-guide]: https://github.com/adjust/ios_sdk/blob/master/doc/japanese/web_views_ja.md
+[currency-conversion]: https://docs.adjust.com/en/event-tracking/#tracking-purchases-in-different-currencies
+
+[universal-links-guide]: https://docs.adjust.com/en/universal-links/
+[adjust-universal-links]: https://docs.adjust.com/en/universal-links/#redirecting-to-universal-links-directly
+[universal-links-testing]: https://docs.adjust.com/en/universal-links/#testing-universal-link-implementations
+[reattribution-deeplinks]: https://docs.adjust.com/en/deeplinking/#manually-appending-attribution-data-to-a-deep-link
+[ios-purchase-verification]: https://github.com/adjust/ios_purchase_sdk
+
+[reattribution-with-deeplinks]: https://docs.adjust.com/en/deeplinking/#manually-appending-attribution-data-to-a-deep-link
+
+[run]: https://raw.github.com/adjust/sdks/master/Resources/ios/run5.png
+[add]: https://raw.github.com/adjust/sdks/master/Resources/ios/add5.png
+[drag]: https://raw.github.com/adjust/sdks/master/Resources/ios/drag5.png
+[delegate]: https://raw.github.com/adjust/sdks/master/Resources/ios/delegate5.png
+[framework]: https://raw.github.com/adjust/sdks/master/Resources/ios/framework5.png
+
+[adc-ios-team-id]: https://raw.github.com/adjust/sdks/master/Resources/ios/adc-ios-team-id5.png
+[custom-url-scheme]: https://raw.github.com/adjust/sdks/master/Resources/ios/custom-url-scheme.png
+[adc-associated-domains]: https://raw.github.com/adjust/sdks/master/Resources/ios/adc-associated-domains5.png
+[xcode-associated-domains]: https://raw.github.com/adjust/sdks/master/Resources/ios/xcode-associated-domains5.png
+[universal-links-dashboard]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard5.png
+
+[associated-domains-applinks]: https://raw.github.com/adjust/sdks/master/Resources/ios/associated-domains-applinks.png
+[universal-links-dashboard-values]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard-values5.png
+
+
+### ライセンス
+
+adjust SDKはMITライセンスを適用しています。
+
+Copyright (c) 2012-2019 Adjust GmbH, http://www.adjust.com
+
+以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、
+ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、サブライセンス、
+および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。
+
+上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。
+
+ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。
+ここでいう保証とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるものではありません。
+作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、
+あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。
diff --git a/doc/japanese/fb_pixel.md b/doc/japanese/fb_pixel.md
new file mode 100644
index 000000000..d3ce7dbd7
--- /dev/null
+++ b/doc/japanese/fb_pixel.md
@@ -0,0 +1,139 @@
+## Facebook Pixelの統合
+
+
+[Facebook Pixel](https://www.facebook.com/business/help/952192354843755) はFacebookが提供するウェブサイト専用の分析ツールです。以前は、アプリ内のweb viewでPixelイベントをトラッキングするのにFacebook SDKを利用できませんでした。[FB SDK](https://developers.facebook.com/docs/analytics) v4.34のリリース以降はトラッキングが可能になり、[Hybrid Mobile App Events](https://developers.facebook.com/docs/app-events/hybrid-app-events) を使用して、Facebook PixelイベントをFacebook アプリイベントに変換します。
+
+また、FB SDKを統合しなくても、Adjust SDKを使用してアプリ内のweb viewでFacebook Pixelを利用できるようになりました。
+
+## Facebookの統合
+
+### アプリサンプル
+
+[`example-fbpixel` ディレクトリ][example-fbpixel]にあるアプリサンプルを見ると、Adjustのweb view SDKを使用してどのようにFacebook Pixelイベントをトラッキングできるかがわかります。
+
+### FacebookアプリID
+
+FB SDKを統合する必要はありませんが、Adjust SDKがFacebook Pixelを統合するために、一部FB SDKと同じ統合手順に従う必要があります。
+
+まず[FB SDK iOS SDKガイド](https://developers.facebook.com/docs/ios/getting-started/#xcode) に記載の通り、対象のFacebookアプリIDをアプリに追加する必要があります。
+統合手順は上記リンクに記載がありますが、以下にも転載致します。
+
+- Xcodeで、プロジェクトの`Info.plist`ファイルを右クリックして、[Open As] -> [Source Code]を選択します。
+- 以下のXMLスニペットをファイルのボディ部の最後の`` 要素の直前に挿入します。
+
+
+ ```xml
+
+ ...
+ FacebookAppID
+ {your-app-id}
+ ...
+
+ ```
+
+- `{{your-app-id}}`を対象アプリのアプリID(*Facebook App Dashboard*に表示される)に置き換えます。
+
+### Facebook Pixelの設定
+
+Facebook Pixelの統合方法については、Facebookのガイドに従ってください。
+
+```js
+
+
+...
+
+```
+
+この後、[Hybrid Mobile App Eventsガイド](https://developers.facebook.com/docs/app-events/hybrid-app-events) の`Update Your Pixel`セクションに記載の通り、Facebook Pixelのコードを以下のように変更するだけです。
+
+
+```js
+fbq('init', );
+fbq('set', 'mobileBridge', , );
+```
+
+**注意**:はじめに`'init'`メソッドを呼び出し、その直後に`'set'`メソッドを呼び出すことが**非常に重要**です。HTMLのウェブページに貼り付ける、Facebook提供の(上記のような)スクリプトスニペットは、`'init'`メソッドの呼び出しのすぐ後にページビューイベントの`'track'`メソッドが含まれています。このページビューイベントを正しくトラッキングするために、必ずこれらの間に`'set'`メソッドを呼び出してください。
+
+## Adjustの統合
+
+### Web viewの拡大
+
+[iOS web view](web_views_ja.md) アプリの統合ガイドに従ってください。こちらはWeb view bridgeをロードするセクションです。(以下を参照)
+
+
+```objc
+- (void)viewWillAppear:(BOOL)animated {
+ ...
+ UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
+ // or with WKWebView:
+ // WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
+
+ // add @property (nonatomic, strong) AdjustBridge *adjustBridge; on your interface
+ self.adjustBridge = [[AdjustBridge alloc] init];
+ [self.adjustBridge loadUIWebViewBridge:webView];
+ // optionally you can add a web view delegate so that you can also capture its events
+ // [self.adjustBridge loadUIWebViewBridge:webView webViewDelegate:(UIWebViewDelegate*)self];
+
+ // or with WKWebView:
+ // [self.adjustBridge loadWKWebViewBridge:webView];
+ // optionally you can add a web view delegate so that you can also capture its events
+ // [self.adjustBridge loadWKWebViewBridge:webView wkWebViewDelegate:(id)self];
+ ...
+```
+
+
+どのweb viewをAdjust bridgeに選択するかに関わらず、手順に従って下記のラインを追加してください。
+
+```objc
+[self.adjustBridge augmentHybridWebView];
+```
+
+### Event名の設定
+
+Adjust web bridge SDKは、Facebook PixelイベントをAdjustイベントに変換します。
+
+このため、Facebook Pixel設定の`fbq('track', 'PageView');`をコピーペーストで追加し、Adjust SDKを開始してFacebook Pixelイベントをトラッキングする**前**に、Facebook Pixelsを特定のAdjustイベントにマッピングするか、デフォルトのAdjustイベントトークンを設定する必要があります。
+
+Facebook PixelイベントをAdjustイベントにマッピングするには、Adjust SDKを初期化する前に`adjustConfig`インスタンスの`addFbPixelMapping(fbEventNameKey, adjEventTokenValue)`を呼び出します。マッピングの例は以下の通りです。
+
+
+```js
+adjustConfig.addFbPixelMapping('fb_mobile_search', adjustEventTokenForSearch);
+adjustConfig.addFbPixelMapping('fb_mobile_purchase', adjustEventTokenForPurchase);
+```
+
+注意:これは、以下のFacebook Pixelイベントをトラッキングする際の`fbq('track', 'Search', ...);`および`fbq('track', 'Purchase', ...);`にそれぞれ対応します。残念ながら、Javascriptでトラッキングされるイベント名とFB SDKで使用されるイベント名との間のすべてのマッピングスキームにはアクセスできません。
+
+参考として、以下はAdjustがこれまで確認したイベント名の情報になります。
+
+| Pixelイベント名 | 対応するFacebookアプリのイベント名
+| ---------------- | -------------------------------------
+| ViewContent | fb_mobile_content_view
+| Search | fb_mobile_search
+| AddToCart | fb_mobile_add_to_cart
+| AddToWishlist | fb_mobile_add_to_wishlist
+| InitiateCheckout | fb_mobile_initiated_checkout
+| AddPaymentInfo | fb_mobile_add_payment_info
+| Purchase | fb_mobile_purchase
+| CompleteRegistration | fb_mobile_complete_registration
+
+
+これは完全なリストではない可能性があります。また、Facebookが現在のリストに追加や更新を加える可能性もあります。テスト中は、Adjustログで以下のような警告を確認してください。
+
+```
+There is not a default event token configured or a mapping found for event named: 'fb_mobile_search'. It won't be tracked as an adjust event
+```
+
+```
+イベント名'fb_mobile_search'について、設定されたデフォルトイベントトークンが存在しないか、マッピングが見つかりません。Adjustイベントとしてトラッキングできません。
+```
+
+また、マッピングを設定しない場合でもデフォルトのAdjustイベントの使用は可能です。Adjust SDKを初期化する前に、`adjustConfig.setFbPixelDefaultEventToken(defaultEventToken);`を呼び出してください。
+
+
+[example-fbpixel]: ../../examples/AdjustExample-FbPixel
diff --git a/doc/japanese/idfa_ja.md b/doc/japanese/idfa.md
similarity index 100%
rename from doc/japanese/idfa_ja.md
rename to doc/japanese/idfa.md
diff --git a/doc/japanese/migrate_ja.md b/doc/japanese/migrate.md
similarity index 99%
rename from doc/japanese/migrate_ja.md
rename to doc/japanese/migrate.md
index 0199d0d53..f828663f4 100644
--- a/doc/japanese/migrate_ja.md
+++ b/doc/japanese/migrate.md
@@ -1,4 +1,4 @@
-## iOS用adjust SDKのv3.4.0からv4.17.1への移行
+## iOS用adjust SDKのv3.4.0からv4.15.0への移行
### 初期設定
diff --git a/doc/japanese/mixpanel_ja.md b/doc/japanese/mixpanel.md
similarity index 100%
rename from doc/japanese/mixpanel_ja.md
rename to doc/japanese/mixpanel.md
diff --git a/doc/japanese/sociomantic_plugin_ja.md b/doc/japanese/sociomantic_plugin.md
similarity index 100%
rename from doc/japanese/sociomantic_plugin_ja.md
rename to doc/japanese/sociomantic_plugin.md
diff --git a/doc/japanese/trademob_plugin_ja.md b/doc/japanese/trademob_plugin.md
similarity index 100%
rename from doc/japanese/trademob_plugin_ja.md
rename to doc/japanese/trademob_plugin.md
diff --git a/doc/japanese/web_views_ja.md b/doc/japanese/web_views.md
similarity index 100%
rename from doc/japanese/web_views_ja.md
rename to doc/japanese/web_views.md
diff --git a/doc/korean/README.md b/doc/korean/README.md
new file mode 100644
index 000000000..41a5af931
--- /dev/null
+++ b/doc/korean/README.md
@@ -0,0 +1,1063 @@
+## 요약
+
+Adjust™의 iOS SDK에 관한 문서입니다. [adjust.com]에서 Adjust™에 대한 정보를 더 자세히 알아보세요.
+
+앱이 Web view 를 사용하며, 자바스크립트 코드를 통해 Adjust 추적을 사용하려는 경우, [iOS 웹 보기 SDK 가이드][ios-web-views-guide]를 참조하세요.
+
+Read this in other languages: [English][en-readme], [中文][zh-readme], [日本語][ja-readme], [한국어][ko-readme].
+
+## 목차
+
+* [앱 예시](#example-apps)
+* [기본 연동](#basic-integration)
+ * [프로젝트에 SDK 추가](#sdk-add)
+ * [iOS 프레임워크 추가](#sdk-frameworks)
+ * [앱에 SDK 연동](#sdk-integrate)
+ * [기본 설정](#basic-setup)
+ * [iMessage용 설정](#basic-setup-imessage)
+ * [Adjust 로](#adjust-logging)
+ * [앱 빌드하기](#build-the-app)
+* [부가 기능](#additional-features)
+ * [이벤트 추적](#event-tracking)
+ * [매출 추적](#revenue-tracking)
+ * [매출 중복 제거](#revenue-deduplication)
+ * [인앱 결제 검증](#iap-verification)
+ * [콜백 파라미터](#callback-parameters)
+ * [파트너 파라미터](#partner-parameters)
+ * [콜백 ID](#callback-id)
+ * [세션 파라미터](#session-parameters)
+ * [세션 콜백 파라미터](#session-callback-parameters)
+ * [세션 파트너 파라미터](#session-partner-parameters)
+ * [지연 시작](#delay-start)
+ * [어트리뷰션 콜백](#attribution-callback)
+ * [이벤트 및 세션 콜백](#event-session-callbacks)
+ * [추적 비활성화](#disable-tracking)
+ * [오프라인 모드](#offline-mode)
+ * [이벤트 버퍼링](#event-buffering)
+ * [GDPR 잊혀질 권리(Right to be Forgotten)](#gdpr-forget-me)
+ * [SDK 서명](#sdk-signature)
+ * [백그라운드 추적](#background-tracking)
+ * [기기 ID](#device-ids)
+ * [iOS 광고 식별자](#di-idfa)
+ * [Adjust 기기 식별자](#di-adid)
+ * [사용자 어트리뷰션](#user-attribution)
+ * [푸시 토큰](#push-token)
+ * [사전 설치 트래커](#pre-installed-trackers)
+ * [딥링크](#deeplinking)
+ * [표준 딥링크 시나리오](#deeplinking-standard)
+ * [iOS 8 이전 버전에서의 딥링크](#deeplinking-setup-old)
+ * [iOS 9 이후 버전에서의 딥링크](#deeplinking-setup-new)
+ * [지연 딥링크(deferred deeplink) 시나리오](#deeplinking-deferred)
+ * [딥링크를 통한 리어트리뷰션( reattribution)](#deeplinking-reattribution)
+* [문제 해결](#troubleshooting)
+ * [SDK 초기화 지연 문제](#ts-delayed-init)
+ * ["Adjust requires ARC" 오류가 나타납니다](#ts-arc)
+ * ["\[UIDevice adjTrackingEnabled\]: unrecognized selector sent to instance" 오류가 나타납니다](#ts-categories)
+ * ["Session failed (Ignoring too frequent session.)" 오류가 나타납니다](#ts-session-failed)
+ * [로그에 "Install tracked"가 표시되지 않습니다](#ts-install-tracked)
+ * ["Unattributable SDK click ignored" 메시지가 나타납니다](#ts-iad-sdk-click)
+ * [Adjust 대시보드에 잘못된 매출 데이터가 표시됩니다](#ts-wrong-revenue-amount)
+* [라이선스](#license)
+
+## 앱 예시
+
+[`iOS(Objective-C)`][example-ios-objc], [`iOS(Swift)`][example-ios-swift], [`tvOS`][example-tvos], [`iMessage`][example-imessage] 및 [`Apple Watch`][example-iwatch]에 대한 [`examples` 디렉토리][examples]에서 앱 예시를 확인할 수 있습니다. Xcode 프로젝트를 실행하여 Adjust SDK의 연동 과정에 대한 사례를 살펴보세요.
+
+## 기본 연동
+
+iOS 개발용 Xcode를 사용한다는 가정하에 iOS 프로젝트에 Adjust SDK를 연동하는 방법을 설명합니다.
+
+### 프로젝트에 SDK 추가
+
+[CocoaPods][cocoapods]를 사용하는 경우, 다음 내용을 `Podfile`에 추가한 후 [해당 단계](#sdk-integrate)를 완료하세요.
+
+```ruby
+pod 'Adjust', '~> 4.17.1'
+```
+
+또는:
+
+```ruby
+pod 'Adjust', :git => 'https://github.com/adjust/ios_sdk.git', :tag => 'v4.17.1'
+```
+
+---
+
+[Carthage][carthage]를 사용하는 경우, 다음 내용을 `Cartfile`에 추가한 후 [해당 단계](#sdk-frameworks)를 완료하세요.
+
+```ruby
+github "adjust/ios_sdk"
+```
+
+---
+
+프로젝트에 Adjust SDK를 프레임워크로 추가하여 연동할 수도 있습니다. [릴리스 페이지][releases]에서 다음 항목을 확인해 보세요.
+
+* `AdjustSdkStatic.framework.zip`
+* `AdjustSdkDynamic.framework.zip`
+* `AdjustSdkTv.framework.zip`
+* `AdjustSdkIm.framework.zip`
+
+Apple은 iOS 8을 출시한 후, 임베디드 프레임워크로도 잘 알려진 동적 프레임워크(dynamic frameworks)를 도입했습니다. 앱이 iOS 8 이상 버전을 타겟팅하는 경우에는 Adjust SDK 동적 프레임워크를 사용할 수 있습니다. 필요에 따라 static 또는 dynamic 프레임워크를 선택하여 프로젝트에 추가하세요.
+
+`tvOS`앱의 경우, `AdjustSdkTv.framework.zip` 자료에서 추출 가능한 tvOS 프레임워크와 함께 Adjust SDK를 활용할 수 있습니다.
+
+`iMessage`앱의 경우, `AdjustSdkIm.framework.zip` 아카이브에서 추출 가능한 IM 프레임워크와 함께 Adjust SDK를 활용할 수 있습니다.
+
+### iOS 프레임워크 추가
+
+1. Project Navigator에서 프로젝트를 선택합니다.
+2. 메인 화면 좌측에서 타겟을 선택합니다.
+3. `Build Phases` 탭에서 `Link Binary with Libraries` 그룹을 확장합니다.
+4. 해당 섹션의 하단에서 `+` 버튼을 선택합니다.
+5. `AdSupport.framework`를 선택하고 `Add` 버튼을 클릭합니다.
+6. tvOS를 사용하는 경우를 제외하고, 같은 단계를 반복하여 `iAd.framework`와 `CoreTelephony.framework`를 추가합니다.
+7. 프레임워크의 `Status`를 `Optional`로 변경합니다.
+
+### 앱에 SDK 연동
+
+Pod 리포지토리를 통해 Adjust SDK를 추가했다면, 다음 import 명령어 중 하나를 실행해야 합니다.
+
+```objc
+#import "Adjust.h"
+```
+
+또는
+
+```objc
+#import
+```
+
+---
+
+Adjust SDK를 static/dynamic 프레임워크로 추가했거나 Carthage를 통해 등록했다면, 다음 import 명령어 중 하나를 실행해야 합니다.
+
+```objc
+#import
+```
+
+---
+
+tvOS 앱에서 Adjust SDK를 사용하는 경우, 다음 import 명령어 중 하나를 실행해야 합니다.
+
+```objc
+#import
+```
+
+---
+
+iMessage 앱에서 Adjust SDK를 사용하는 경우, 다음 가져오기 명령어 중 하나를 실행해야 합니다.
+
+```objc
+#import
+```
+
+다음으로는 기본 세션 추적을 설정하겠습니다.
+
+### 기본 설정
+
+Project Navigator에서 애플리케이션 delegate 의 소스 파일을 실행합니다. `import` 명령어를 파일 상단에 추가한 후, 다음 콜을 앱 delegate 의 `didFinishLaunching` 또는 `didFinishLaunchingWithOptions` 메서드 내 `Adjust`에 추가합니다.
+
+```objc
+#import "Adjust.h"
+// or #import
+// or #import
+// or #import
+// or #import
+
+// ...
+
+NSString *yourAppToken = @"{YourAppToken}";
+NSString *environment = ADJEnvironmentSandbox;
+ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken
+ environment:environment];
+
+[Adjust appDidLaunch:adjustConfig];
+```
+
+![][delegate]
+
+**참고**: Adjust SDK 초기화는 `아주 중요한` 단계입니다. 제대로 완료하지 않으면 [문제 해결 섹션](#ts-delayed-init)에서 설명하는 다양한 문제가 발생할 수 있습니다.
+
+`{YourAppToken}`을 사용 중인 앱 토큰으로 교체한 다음, [Dashboard]에서 결과를 확인해 보세요.
+
+테스트 또는 배포 등 어떤 목적으로 앱을 빌드하는에 따라 다음 두 값 중 하나의 `environment`(환경)으로 설정해야 합니다.
+
+```objc
+NSString *environment = ADJEnvironmentSandbox;
+NSString *environment = ADJEnvironmentProduction;
+```
+
+**중요:** 앱을 테스트해야 하는 경우, 해당 값을 `ADJEnvironmentSandbox` 로 설정해야 합니다. 앱을 퍼블리시할 준비가 완료되면 환경 설정을 `ADJEnvironmentProduction` 으로 변경하고, 앱 개발 및 테스트를 새로 시작한다면 `ADJEnvironmentSandbox` 로 다시 설정하세요.
+
+테스트 기기로 인해 발생하는 테스트 트래픽과 실제 트래픽을 구분하기 위해 다른 환경을 사용하고 있으니, 상황에 알맞은 설정을 적용하시기 바랍니다. 이는 매출을 추적하는 경우에 특히 중요합니다.
+
+### iMessage용 설정
+
+**소스에서 SDK 추가:** **소스에서** Adjust SDK를 iMessage 앱에 추가하기로 선택한 경우, iMessage 프로젝트 설정에 프리 프로세서 매크로 **ADJUST_IM=1**이 설정되어 있는지 확인하세요.
+
+**Framework(프레임워크)로 SDK 추가:** iMessage 앱에 `AdjustSdkIm.framework`를 추가했다면, `Build Phases`프로젝트 설정에 `New Copy Files Phase`를 추가하고 `AdjustSdkIm.framework`가 `Frameworks` 폴더로 복사되도록 선택했는지 확인하세요.
+
+**세션 추적:** iMessage 에서 세션 추적을 원활하게 실행하고 싶다면, 추가적인 연동 과정을 거쳐야 합니다. 표준 iOS 앱의 경우 Adjust SDK에서 iOS 시스템 알림을 자동으로 수신하기 때문에 Adjust가 앱의 세션 정보를 파악할 수 있으나, iMessage 앱의 경우에는 그렇지 않습니다. 따라서 explicit call(명시적인 콜)을 iMessage 앱 뷰 컨트롤러 내부의 `trackSubsessionStart`와 `trackSubsessionEnd` method(매서드)에 추가해야 Adjust SDK에서 앱이foreground에 있는지 여부를 추적할 수 있습니다.
+
+`didBecomeActiveWithConversation:` 메서드 내부의 `trackSubsessionStart`에 콜을 추가합니다.
+
+```objc
+-(void)didBecomeActiveWithConversation:(MSConversation *)conversation {
+ // Called when the extension is about to move from the inactive to active state.
+ // This will happen when the extension is about to present UI.
+ // Use this method to configure the extension and restore previously stored state.
+
+ [Adjust trackSubsessionStart];
+}
+```
+`willResignActiveWithConversation:` 메서드 내부의 `trackSubsessionEnd`에 콜을 추가합니다.
+
+```objc
+-(void)willResignActiveWithConversation:(MSConversation *)conversation {
+ // Called when the extension is about to move from the active to inactive state.
+ // This will happen when the user dissmises the extension, changes to a different
+ // conversation or quits Messages.
+
+ // Use this method to release shared resources, save user data, invalidate timers,
+ // and store enough state information to restore your extension to its current state
+ // in case it is terminated later.
+
+ [Adjust trackSubsessionEnd];
+}
+```
+
+이렇게 설정을 완료하면, Adjust SDK를 통해 iMessage 앱 내부에서 세션을 추적할 수 있습니다.
+
+**참고:** 빌드한 iOS 앱 및 iMessage 확장자가 서로 다른 메모리 공간에서 운영되며, 상이한 번들 식별자를 사용하고 있는지 확인해야 합니다. 두 공간에서 같은 앱 토큰으로 Adjust SDK를 초기화하면 두 개의 독립 인스턴스가 생성되며, 두 인스턴스가 각자 서로의 존재를 모르는 채로 추적하여 대시보드 데이터에서 적합하지 않은 데이터 혼합이 발생할 수 있습니다. 따라서 iMessage 앱용 Adjust 대시보드에서 별도의 앱을 생하여 다른 앱 토큰으로 SDK를 초기화하는 것이 좋습니다.
+
+### Adjust 로깅(logging)
+
+다음 파라미터 중 하나를 통해 `ADJConfig` 인스턴스에서 `setLogLevel:` 을 호출하여 테스트하는 동안 조회할 로그의 양을 늘리거나 줄일 수 있습니다.
+
+```objc
+[adjustConfig setLogLevel:ADJLogLevelVerbose]; // enable all logging
+[adjustConfig setLogLevel:ADJLogLevelDebug]; // enable more logging
+[adjustConfig setLogLevel:ADJLogLevelInfo]; // the default
+[adjustConfig setLogLevel:ADJLogLevelWarn]; // disable info logging
+[adjustConfig setLogLevel:ADJLogLevelError]; // disable warnings as well
+[adjustConfig setLogLevel:ADJLogLevelAssert]; // disable errors as well
+[adjustConfig setLogLevel:ADJLogLevelSuppress]; // disable all logging
+```
+
+개발 중인 앱에 Adjust SDK가 기록하는 로그를 표시하지 않으려면, `ADJLogLevelSuppress` 를 선택한 후 로그 수준 모드를 조절할 수 있는 생성자에서 `ADJConfig` 객체를 초기화해야 합니다.
+
+```objc
+#import "Adjust.h"
+// or #import
+// or #import
+// or #import
+// or #import
+
+// ...
+
+NSString *yourAppToken = @"{YourAppToken}";
+NSString *environment = ADJEnvironmentSandbox;
+ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken
+ environment:environment
+ allowSuppressLogLevel:YES];
+
+[Adjust appDidLaunch:adjustConfig];
+```
+
+### 앱 빌드
+
+앱을 빌드하고 실행합니다. 빌드를 성공적으로 완료했다면, 콘솔에서 SDK 로그를 꼼꼼하게 살펴보시기 바랍니다. 앱을 처음으로 출시한 경우, `Install tracked` 로그 정보를 반드시 확인하세요.
+
+![][run]
+
+## 부가 기능
+
+Adjust SDK를 프로젝트에 연동한 후에는 다음 기능을 사용할 수 있습니다.
+
+### 이벤트 추적
+
+Adjust로 이벤트를 추적할 수 있습니다. 특정 버튼의 모든 탭을 추적하려는 경우 `abc123`와 같은 관련 이벤트 토큰이 있는 새 이벤트 토큰을 [대시보드](adjust.com)에서 만듭니다. 그런 다음 버튼의 `buttonDown` 메서드에 다음 행을 추가하여 클릭을 추적할 수 있습니다.
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+[Adjust trackEvent:event];
+```
+
+버튼을 누르면 `Event tracked`가 로그에 나타납니다.
+
+이벤트 인스턴스를 사용하여 이벤트를 추적하기 전에 더 자세한 환경 설정을 할 수 있습니다.
+
+### 매출 추적
+
+사용자가 광고를 누르거나 인앱 구매를 통해 매출을 발생시킬 수 있는 경우 이벤트를 사용하여 해당 수익을 추적할 수 있습니다. 한 번 누를 때 0.01 유로의 수익이 발생한다고 가정할 경우 매출 이벤트를 다음과 같이 추적할 수 있습니다.
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event setRevenue:0.01 currency:@"EUR"];
+
+[Adjust trackEvent:event];
+```
+
+이것을 콜백 파라미터와 결합할 수도 있습니다.
+
+통화 토큰을 설정하면 들어오는 매출을 Adjust가 자동으로 미리 지정한 보고용 통화로 전환해 줍니다. 통화 전환에 관한 자세한 내용은 [여기][currency-conversion]에서 확인하세요.
+
+매출 및 이벤트 추적에 대한 자세한 내용은 [이벤트 추적 설명서](https://docs.adjust.com/ko/event-tracking/#part-5)를 참조하십시오.
+
+### 매출 중복 제거
+
+거래 ID를 선택 사항으로 추가하여 수익 중복 추적을 피할 수 있습니다. 가장 최근에 사용한 거래 ID 10개를 기억하며, 똑같은 거래 ID로 이루어진 매출 이벤트는 중복 집계하지 않습니다. 인앱 구매 추적 시 특히 유용합니다. 사용 예는 아래에 나와 있습니다.
+
+인앱 구매를 추적하려면 상태가 `SKPaymentTransactionStatePurchased`로 변경된 경우에만 `paymentQueue:updatedTransaction`에서 `finishTransaction` 후에 `trackEvent`를 호출해야 합니다. 이렇게 해야 실제로 발생하지 않은 매출을 추적하는 오류를 막을 수 있습니다.
+
+```objc
+- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
+ for (SKPaymentTransaction *transaction in transactions) {
+ switch (transaction.transactionState) {
+ case SKPaymentTransactionStatePurchased:
+ [self finishTransaction:transaction];
+
+ ADJEvent *event = [ADJEvent eventWithEventToken:...];
+ [event setRevenue:... currency:...];
+ [event setTransactionId:transaction.transactionIdentifier]; // avoid duplicates
+ [Adjust trackEvent:event];
+
+ break;
+ // more cases
+ }
+ }
+}
+```
+
+### 인앱 결제 검증
+
+Adjust의 서버 측 수신 확인 도구인 구매 검증(Purchase Verification)을 사용하여 앱에서 이루어지는 구매의 유효성을 확인하려면 iOS 구매 SDK를 확인하십시오. 자세한 내용은 [여기][ios-purchase-verification]에서 확인할 수 있습니다.
+
+### 콜백 파라미터
+
+[대시보드](adjust.com)에서 이벤트 콜백 URL을 등록할 수 있습니다. 이벤트를 추적할 때마다 GET 요청이 해당 URL로 전송됩니다. 이벤트를 추적하기 전에 이벤트 인스턴스에서 `addCallbackParameter`를 호출하여 콜백 파라미터를 해당 이벤트에 추가할 수 있습니다. 그러면 해당 파라미터가 콜백 URL에 추가됩니다.
+
+예를 들어 `http://www.adjust.com/callback` URL을 등록한 경우 이벤트를 다음과 같이 추적할 수 있습니다.
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event addCallbackParameter:@"key" value:@"value"];
+[event addCallbackParameter:@"foo" value:@"bar"];
+
+[Adjust trackEvent:event];
+```
+
+이 경우에는 이벤트를 추적하여 다음 주소로 요청을 전송합니다.
+
+```
+http://www.mydomain.com/callback?key=value&foo=bar
+```
+
+Adjust는 `{idfa}`와 같이 파라미터 값으로 사용할 수 있는 다양한 자리 표시자(placeholder)를 지원합니다. 그 결과로 생성한 콜백에서 이 자리 표시자는 현재 기기의 광고 ID로 대체됩니다. 사용자 지정 파라미터는 저장되지 않으며 콜백에만 추가됩니다. 이벤트에 대한 콜백을 등록하지 않은 경우 해당 파라미터는 읽을 수 없습니다.
+
+사용 가능한 값의 전체 목록을 포함한 URL 콜백 사용에 대한 자세한 내용은 [콜백 설명서][callbacks-guide]를 참조하십시오.
+
+### 파트너 파라미터
+
+Adjust 대시보드에서 활성화된 연동에 대해 네트워크 파트너로 전송할
+파라미터도 추가할 수 있습니다.
+
+위에서 설명한 콜백 매개변수의 경우와 비슷하지만, `ADJEvent` 인스턴스에서 `addPartnerParameter` 메서드를 호출해야 추가할 수 있습니다.
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event addPartnerParameter:@"key" value:@"value"];
+[event addPartnerParameter:@"foo" value:@"bar"];
+
+[Adjust trackEvent:event];
+```
+
+특별 파트너와 해당 파트너와의 연동에 대한 자세한 내용은 [특별 파트너 설명서][special-partners]를 참조하십시오.
+
+### 콜백 ID
+추적하고자 하는 각 이벤트에 개별 스트링 ID를 따로 붙일 수도 있습니다. 나중에 이벤트 성공/실패 콜백에서 해당 ID에 전달하여 이벤트 트래킹의 성공 또는 실패 여부를 추적할 수 있게 해 줍니다. `AdjustEvent` 인스턴스에서 `setCallbackId` 메서드를 호출하여 설정할 수 있습니다.
+
+```objc
+ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+
+[event setCallbackId:@"Your-Custom-Id"];
+
+[Adjust trackEvent:event];
+```
+
+### 세션 파라미터
+
+일부 파라미터는 Adjust SDK 이벤트 및 세션 발생시마다 전송을 위해 저장합니다. 어느 파라미터든 한 번 저장하면 로컬에 바로 저장되므로 매번 새로 추가할 필요가 없습니다. 같은 파라미터를 두 번 저장해도 효력이 없습니다.
+
+세션 파라미터를 최초 설치 이벤트시에 전송하려면, `[Adjust appDidLaunch:]`를 통해 Adjust SDK 런칭을 하기 전에 해당 파라미터를 호출해야 합니다. 설치 시 전송하지만 필요한 값은 런칭 후에야 들어갈 수 있게 하고 싶다면 Adjust SDK 런칭 시 [예약 시작](#delay-start)을 걸 수 있습니다.
+
+### 세션 콜백 파라미터
+
+[이벤트](#callback-parameters)에 등록한 콜백 파라미터는 Adjust SDK 전체 이벤트 및 세션 시 전송할 목적으로 저장할 수 있습니다.
+
+세션 콜백 파라미터는 이벤트 콜백 파라마터와 비슷한 인터페이스를 지녔지만, 이벤트에 키와 값을 추가하는 대신 `Adjust` 인스턴스에 있는 `addSessionCallbackParameter` 메서드를 호출하여 추가합니다.
+
+```objc
+[Adjust addSessionCallbackParameter:@"foo" value:@"bar"];
+```
+
+세션 콜백 파라미터는 이벤트에 추가된 콜백 파라미터와 합쳐지며, 이벤트에 추가된 콜백 파라미터가 우선권을 지닙니다. 그러나 세션에서와 같은 키로 이벤트에 콜백 파라미터를 추가한 경우 새로 추가한 콜백 파라미터가 우선권을 가집니다.
+
+원하는 키를 `Adjust` 인스턴스의 `removeSessionCallbackParameter` 메서드로 전달하여 특정 세션 콜백 파라미터를 제거할 수 있습니다.
+
+```objc
+[Adjust removeSessionCallbackParameter:@"foo"];
+```
+
+세션 콜백 파라미터의 키와 값을 전부 없애고 싶다면 `Adjust` 인스턴스의 `resetSessionCallbackParameters` 메서드로 재설정하면 됩니다.
+
+```objc
+[Adjust resetSessionCallbackParameters];
+```
+
+### 세션 파트너 파라미터
+
+Adjust SDK 내 모든 이벤트 및 세션에서 전송되는 [세션 콜백 파라미터](#session-callback-parameters)가 있는 것처럼, 세션 파트너 파라미터도 있습니다.
+
+이들 파라미터는 Adjust [대시보드](adjust.com)에서 연동을 활성화한 네트워크 파트너에게 전송할 수 있습니다.
+
+세션 파트너 파라미터는 이벤트 파트너 파라미터와 인터페이스가 비슷하지만, 이벤트에 키와 값을 추가하는 대신 `Adjust` 인스턴스에서 `addSessionPartnerParameter` 메서드를 호출하여 추가합니다.
+
+```objc
+[Adjust addSessionPartnerParameter:@"foo" value:@"bar"];
+```
+
+세션 파트너 파라미터는 이벤트에 추가한 파트너 파라미터와 합쳐지며, 이벤트에 추가된 파트너 파라미터가 우선순위를 지닙니다. 그러나 세션에서와 같은 키로 이벤트에 파트너 파라미터를 추가한 경우, 새로 추가한 파트너 파라미터가 우선권을 가집니다.
+
+원하는 키를 `Adjust` 인스턴스의 `removeSessionPartnerParameter` 메서드로 전달하여 특정 세션 파트너 파라미터를 제거할 수 있습니다.
+
+```objc
+[Adjust removeSessionPartnerParameter:@"foo"];
+```
+
+세션 파트너 파라미터의 키와 값을 전부 없애고 싶다면 `Adjust` 인스턴스의 `resetSessionPartnerParameters` 메서드로 재설정하면 됩니다.
+
+```objc
+[Adjust resetSessionPartnerParameters];
+```
+
+### 지연 시작
+
+Adjust SDK에 예약 시작을 걸면 앱이 고유 식별자 등의 세션 파라미터를 얻어 설치 시에 전송할 시간을 벌 수 있습니다.
+
+`ADJConfig` 인스턴스의 `setDelayStart` 메서드에서 예약 시작 시각을 초 단위로 설정하세요.
+
+```objc
+[adjustConfig setDelayStart:5.5];
+```
+
+이 경우 Adjust SDK는 최초 인스톨 세션 및 생성된 이벤트를 5.5초간 기다렸다가 전송합니다. 이 시간이 지난 후, 또는 그 사이에 `[Adjust sendFirstPackages]`을 호출했을 경우 모든 세션 파라미터가 지연된 인스톨 세션 및 이벤트에 추가되며 Adjust SDK는 원래대로 돌아옵니다.
+
+**Adjust SDK의 최대 지연 예약 시작 시간은 10초입니다**.
+
+### 어트리뷰션 콜백
+
+delegate(델리게이트) 콜백을 등록하여 트래커 어트리뷰션 변경에 대한 알림을 받을 수 있습니다. 어트리뷰션에서 고려하는 소스가 각각 다르기 때문에 이 정보는 동시간에 제공할 수 없습니다. 앱 델리게이트에서 델리게이트 프로토콜(선택 사항)을 구현하려면 다음 단계를 수행하십시오.
+
+[해당 어트리뷰션 데이터 정책][attribution-data]을 고려하십시오.
+
+1. `AppDelegate.h`를 열고 `AdjustDelegate` 선언을 추가합니다.
+
+```objc
+@interface AppDelegate : UIResponder
+```
+
+2. `AppDelegate.m`을 열고 다음 델리게이트 호출 함수를 앱 델리게이트 구현에 추가합니다.
+
+```objc
+- (void)adjustAttributionChanged:(ADJAttribution *)attribution {
+ }
+```
+
+3. `ADJConfig` 인스턴스를 사용하여 델리게이트를 설정합니다.
+
+```objc
+[adjustConfig setDelegate:self];
+```
+
+델리게이트 콜백은 `ADJConfig` 인스턴스를 써서 구성하므로, `[Adjust appDidLaunch:adjustConfig]`를 호출하기 전에 `setDelegate`를 호출해야 합니다.
+
+SDK에 최종 속성 데이터가 수신되면 델리게이트 함수가 호출됩니다.
+델리게이트 함수를 통해 `attribution` 파라미터에 액세스할 수 있습니다.
+각 파라미터 속성에 대한 개요는 다음과 같습니다.
+
+- `NSString trackerToken` 현재 설치의 트래커 토큰.
+- `NSString trackerName` 현재 설치의 트래커 이름.
+- `NSString network` 현재 설치의 network 그룹화 기준.
+- `NSString campaign` 현재 설치의 campaign 그룹화 기준.
+- `NSString adgroup` 현재 설치의 ad group 그룹화 기준.
+- `NSString creative` 현재 설치의 creative 그룹화 기준.
+- `NSString clickLabel` 현재 설치의 클릭 레이블.
+- `NSString adid` Adjust 기기 식별자.
+
+값을 사용할 수 없을 경우 `nil`로 기본 설정됩니다.
+
+### 이벤트 및 세션 콜백
+
+델리게이트 콜백을 등록하여 성공 또는 실패한 추적 대상 이벤트 및/또는 세션에 대한 알림을 받을 수 있습니다.
+
+[어트리뷰션 콜백](#attribution-callback)에 사용되는 것과 동일한 선택적 프로토콜인 `AdjustDelegate`가 사용됩니다.
+
+동일한 단계에 따라 이벤트 추적 성공 시에 대해 다음 델리게이트 콜백 함수를 구현하십시오.
+
+```objc
+- (void)adjustEventTrackingSucceeded:(ADJEventSuccess *)eventSuccessResponseData {
+}
+```
+
+다음은 이벤트 추적 실패 시에 구현하는 델리게이트 콜백 함수입니다.
+
+```objc
+- (void)adjustEventTrackingFailed:(ADJEventFailure *)eventFailureResponseData {
+}
+```
+
+세선 추적 성공의 경우입니다.
+
+```objc
+- (void)adjustSessionTrackingSucceeded:(ADJSessionSuccess *)sessionSuccessResponseData {
+}
+```
+
+그리고 추적 세션 실패의 경우입니다.
+
+```objc
+- (void)adjustSessionTrackingFailed:(ADJSessionFailure *)sessionFailureResponseData {
+}
+```
+
+델리게이트 함수는 SDK에서 서버로 패키지를 보내려고 시도한 후에 호출됩니다. 델리게이트 콜백에서는 전용 응답 데이터 개체에 액세스할 수 있습니다. 세션 응답 데이터 속성에 대한 개요는 다음과 같습니다.
+
+- `NSString message` 서버에서 전송한 메시지 또는 SDK가 기록한 오류
+- `NSString timeStamp` 서버에서 전송한 데이터의 타임스탬프
+- `NSString adid` Adjust가 제공하는 고유 기기 식별자
+- `NSDictionary jsonResponse` 서버로부터의 응답이 있는 JSON 개체
+
+두 이벤트 응답 데이터 개체에는 모두 다음이 포함됩니다.
+
+- `NSString eventToken` 트래킹 패키지가 이벤트인 경우 이벤트 토큰
+- `NSString callbackid` 이벤트 객체에서 사용자가 설정하는 콜백 ID.
+
+값을 사용할 수 없을 경우 `nil`로 기본 설정됩니다.
+
+그리고 이벤트 및 세션 실패 개체에는 모두 다음이 포함됩니다.
+
+- `BOOL willRetry` 나중에 패키지 재전송 시도가 있을 것임을 나타냅니다.
+
+### 추적 비활성화
+
+`setEnabled`를 `No` 파라미터로 설정한 상태로 호출하면 Adjust SDK에서 현재 장치의 모든 작업 추적을 중지할 수 있습니다. **이 설정은 세션 간에 기억되지만**, 첫 번째 세션 후에만 활성화할 수 있습니다.
+
+```objc
+[Adjust setEnabled:NO];
+```
+
+`isEnabled` 함수를 호출하여 Adjust SDK가 현재 사용 가능한지 확인할 수 있습니다. 파라미터가 `YES`로 설정된 `setEnabled`를 호출하면 Adjust SDK를 언제든 활성화할 수 있습니다.
+
+### 오프라인 모드
+
+Adjust SDK를 오프라인 모드로 전환하여 Adjust 서버로 전송하는 작업을 일시 중단하고 추적 데이터를 보관하여 나중에 보낼 수 있습니다. 오프라인 모드일 때는 모든 정보가 파일에 저장되므로 너무 많은 이벤트를 촉발(trigger)하지 않도록 주의하십시오.
+
+`setOfflineMode`를 `YES`로 설정하여 호출하면 오프라인 모드를 활성화할 수 있습니다.
+
+```objc
+[Adjust setOfflineMode:YES];
+```
+
+반대로 `setOfflineMode`를 `NO`로 설정한 상태로 호출하면 오프라인 모드를 비활성화할 수 있습니다. Adjust SDK를 다시 온라인 모드로 전환하면 저장된 정보가 모두 올바른 시간 정보와 함께 Adjust 서버로 전송됩니다.
+
+트래킹 사용 중지와 달리 이 설정은 세션 간에 **기억되지 않습니다.** 따라서 앱을 오프라인 모드에서 종료한 경우에도 SDK는 항상 온라인 모드로 시작됩니다.
+
+### 이벤트 버퍼링
+
+앱이 이벤트 추적을 많이 사용하는 경우, 매 분마다 배치(batch) 하나씩만 보내도록 하기 위해 일부 HTTP 요청을 지연시키고자 할 경우가 있을 수 있습니다. `ADJConfig` 인스턴스로 이벤트 버퍼링을 적용할 수 있습니다.
+
+```objc
+[adjustConfig setEventBufferingEnabled:YES];
+```
+
+설정한 내용이 없으면 이벤트 버퍼링은 **기본값으로 비활성화됩니다**.
+
+### GDPR 잊혀질 권리(Right to be Forgotten)
+
+유럽연합(EU) 일반 개인정보 보호법 제 17조에 의거하여, 사용자가 잊힐 권리를 행사하였을 경우 Adjust에 이를 통보할 수 있습니다. 다음 매서드를 호출하면 Adjust SDK는 사용자가 잊힐 권리를 사용하기로 했음을 Adjust 백엔드에 전달합니다:
+
+```objc
+[Adjust gdprForgetMe];
+```
+
+이 정보를 받는 즉시 Adjust는 사용자의 데이터를 삭제하며 Adjust SDK는 해당 사용자 추적을 중단합니다. 향후 이 기기로부터 어떤 요청도 Adjust에 전송되지 않습니다.
+
+### SDK 서명
+
+Adjust SDK 서명이 클라이언트 간에 사용 가능합니다. 이 기능을 사용해 보고자 할 경우 계정 매니저에게 연락해 주십시오.
+
+SDK 서명이 계정에서 이미 사용 가능 상태로 Adjust 대시보드에서 App Secret에 억세스할 수 있는 상태라면, 아래 매서드를 사용하여 SDK 서명을 앱에 연동하십시오.
+
+`AdjustConfig` 인스턴스에서 `setAppSecret`를 호출하면 App Secret이 설정됩니다.
+
+```objc
+[adjustConfig setAppSecret:secretId info1:info1 info2:info2 info3:info3 info4:info4];
+```
+
+### 백그라운드 추적
+
+Adjust SDK 기본값 행위는 앱이 백그라운드에 있을 동안에는 HTTP 요청 전송을 잠시 중지하는 것입니다. `AdjustConfig` 인스턴스에서 이를 바꿀 수 있습니다.
+
+```objc
+[adjustConfig setSendInBackground:YES];
+```
+
+설정한 내용이 없으면 백그라운드 추적은 **기본값으로 비활성화됩니다**.
+
+### 기기 ID
+
+Adjust SDK로 기기 식별자 몇 가지를 획득할 수 있습니다.
+
+### iOS 광고 식별자
+
+Google Analytics와 같은 서비스를 사용하려면 중복 보고가 발생하지 않도록 장치 ID와 클라이언트 ID를 조정해야 합니다.
+
+기기 식별자 IDFA를 얻으려면 `idfa` 함수를 호출하세요.
+
+```objc
+NSString *idfa = [Adjust idfa];
+```
+
+### Adjust 기기 식별자
+
+Adjust 백엔드는 앱을 설치한 기기에서 고유한 **Adjust 기기 식별자** (**adid**)를 생성합니다. 이 식별자를 얻으려면 `Adjust` 인스턴스에서 다음 메서드를 호출하면 됩니다.
+
+```objc
+NSString *adid = [Adjust adid];
+```
+
+**주의**: **adid** 관련 정보는 Adjust 백엔드가 앱 설치를 추적한 후에만 얻을 수 있습니다. 그 순간부터 Adjust SDK는 기기 **adid** 정보를 갖게 되며 이 메서드로 액세스할 수 있습니다. 따라서 SDK가 초기화되고 앱 인스톨 추적이 성공적으로 이루어지기 전에는 **adid** 액세스가 **불가능합니다**.
+
+### 사용자 어트리뷰션
+
+[어트리뷰션 콜백 섹션](#attribution-callback)에서 설명한 바와 같이, 이 콜백은 변동이 있을 때마다 새로운 어트리뷰션 관련 정보를 전달할 목적으로 촉발됩니다. 사용자의 현재 어트리뷰션 정보에 액세스하고 싶다면, `Adjust` 인스턴스에서 다음 메서드를 호출하면 됩니다.
+
+```objc
+ADJAttribution *attribution = [Adjust attribution];
+```
+
+**주의**: 사용자의 현재 어트리뷰션 정보는 Adjust 백엔드가 앱 설치를 추적하여 최초 어트리뷰션 콜백이 촉발된 후에만 얻을 수 있습니다. 그 순간부터 Adjus SDK는 사용자 어트리뷰션 정보를 갖게 되며 이 메소드로 억세스할 수 있습니다. 따라서 SDK가 초기화되고 최초 어트리뷰션 콜백이 촉발되기 전에는 사용자 어트리뷰션 값에 액세스가 **불가능합니다**.
+
+### 푸시 토큰
+
+Adjust로 푸시 알림 토큰을 보내려면 app delegate의 `didRegisterForRemoteNotificationsWithDeviceToken`에서 다음 호출을 `Adjust`에 추가합니다.
+
+```objc
+- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
+ [Adjust setDeviceToken:deviceToken];
+}
+```
+
+푸시 토큰은 Audience Builder와 클라이언트 콜백에 사용되며, 앱 제거(uninstall) 및 재설치 (reinstall) 트래킹을 위해 필수입니다.
+
+
+### 사전 설치 트래커
+
+Adjust SDK를 사용하여 앱이 사전 설치된 기기를 지닌 사용자를 인식하고 싶다면 다음 절차를 따르세요.
+
+1. [대시보드](adjust.com)에 새 트래커를 생성합니다.
+2. 앱 델리케이트를 열어 `ADJConfig` 기본값 트래커를 다음과 같이 설정합니다.
+
+ ```objc
+ ADJConfig *adjustConfig = [ADJConfig configWithAppToken:yourAppToken environment:environment];
+ [adjustConfig setDefaultTracker:@"{TrackerToken}"];
+ [Adjust appDidLaunch:adjustConfig];
+ ```
+
+`{TrackerToken}`을 2에서 생성한 트래커 토큰으로 대체합니다. 대시보드에서는 (`http://app.adjust.com/`을 포함하는) 트래커 URL을 표시한다는 사실을 명심하세요. 소스코드에서는 전체 URL을 표시할 수 없으며 6자로 이루어진 토큰만을 명시해야 합니다.
+
+3. 앱 빌드를 실행하세요. 앱 로그 출력 시 다음과 같은 라인을 볼 수 있을 것입니다.
+
+```
+Default tracker: 'abc123'
+```
+
+### 딥링크
+
+URL에서 앱으로 딥링크를 거는 옵션이 있는 Adjust 트래커 URL을 사용하고 있다면, 딥링크 URL과 그 내용 관련 정보를 얻을 가능성이 있습니다. 해당 URL 클릭 시 사용자가 이미 앱을 설치한 상태(기본 딥링크)일 수도, 앱을 설치하지 않은 상태(지연된 딥링크)일 수도 있습니다. Adjust SDK는 두 가지 상황을 모두 지원하며, 어느 상황이든 트래커 URL을 클릭하여 앱이 시작되는 경우 딥링크 URL을 제공합니다. 지원합니다. 앱에서 이 기능을 사용하려면 올바로 설정해야 합니다.
+
+#### 표준 딥링크 시나리오
+
+사용자가 앱을 설치하고 딥링크 정보가 들어간 트래커 URL을 클릭할 경우, 앱이 열리고 딥링크 내용이 앱으로 전달되어 이를 분석하고 다음 행동을 결정하게 됩니다. Apple은 iOS 9를 런칭하면서 앱에서의 딥링크 취급 방식을 바꿨습니다. 앱에 어떤 상황을 사용하고자 하는지에 따라 (또는 다양한 장치를 지원하기 위해 두 가지 다 사용하려 할 경우) 앱이 다음 상황 중 하나 또는 두 가지 다 취급할 수 있도록 설정해야 합니다.
+
+#### iOS 8 이전 버전에서의 딥링크
+
+iOS 8 이하 버전 장치에서 딥링크는 사용자 설정 URL 스킴 설정을 사용하여 이루어집니다. 따라서 앱이 여는 사용자 설정 URL 스킴명을 지정해야 합니다. 이 스킴명은 `deep_link` 파라미터의 일부분인 Adjust 트래커 URL에서도 사용합니다. 앱에서 설정하려면 `Info.plist` 파일을 열고 `URL types` 열을 새로 추가합니다. 그 다음 `URL identifier`가 앱 번들 ID를 작성할 때 `URL schemes`에서 앱이 취급할 스킴명을 추가하면 됩니다. 아래 예시에서는 앱이 `adjustExample` 스킴명을 취급하도록 설정하였습니다.
+
+![][custom-url-scheme]
+
+이 설정을 마치면, 선택한 스킴명이 들어있는 `deep_link` 파라미터가 들어간 Adjust 트래커 URL을 클릭 시 앱이 열립니다. 앱이 열리고 나면 `AppDelegate` 클래스의 `openURL` 메서드가 촉발되어 트래커 URL의 `deep_link` 파라미터 내용이 들어간 장소를 전송합니다. 딥링크 내용에 액세스하려면 아래 메소드를 재정의하세요.
+
+```objc
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
+ sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
+ // url object contains your deep link content
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+이렇게 하면 iOS 8 이하 버전을 사용하는 iOS 기기에서 딥링크를 성공적으로 설정할 수 있습니다.
+
+#### iOS 9 이후 버전에서의 딥링크
+
+iOS 9 이상 버전 장치에서 딥링크를 설정하려면 앱이 Apple 유니버설 링크를 취급하도록 해야 합니다. 유니버설 링크 및 관련 설정에 대한 자세한 정보는 [여기][universal-links]를 참조하십시오.
+
+Adjust는 유니버설 링크 관련 다양한 내용을 취급합니다. 그러나 Adjust로 유니버설 링크를 지원하려면 대시보드에서 약간의 설정이 필요합니다. 설정 절차에 관한 자세한 내용은 다음 [문서][universal-links-guide]를 참조하십시오.
+
+대시보드에서 유니버설 링크 기능을 성공적으로 활성화하면 앱에서 다음 절차를 수행해야 합니다.
+
+Apple Developer Portal에서 앱 `Associated Domains`를 활성화한 후, 이를 앱 Xcode 프로젝트에서도 똑같이 수행해야 합니다. `Associated Domains` 활성화를 마치고 나면, Adjust 대시보드에 생성한 유니버설 링크를 `applinks:` 접두어를 사용하여 `Domains` 섹션에 추가합니다. 유니버설 링크에서 `http(s)` 부분을 삭제하는 걸 잊지 마세요.
+
+![][associated-domains-applinks]
+
+이 설정을 마치고 나면, Adjust 트래커 유니버설 링크를 클릭 시 앱이 열립니다. 앱이 열리면 `AppDelegate` 클래스의 `continueUserActivity` 메서드가 촉발되어 유니버설 링크 URL 내용이 들어간 장소를 전송합니다. 딥링크 내용에 액세스하려면 아래 메서드를 재정의하세요.
+
+```objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL *url = [userActivity webpageURL];
+
+ // url object contains your universal link content
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+이렇게 하면 iOS 9 이상 버전을 사용하는 iOS 기기에서 딥링크를 성공적으로 설정할 수 있습니다.
+
+코드에 사용한 사용자 설정 로직이 기존 스타일 사용자 설정 URL 스킴 포맷에 도착하기 위해 딥링크 정보가 필요한 경우, Adjust는 유니버설 링크를 기존 스타일 딥링크 URL로 변환하는 도움 함수를 제공합니다. 유니버설 링크 및 딥링크 접두어로 쓸 사용자 설정 URL 스킴명으로 이 메서드를 호출할 수 있습니다. 그러면 Adjust가 사용자 설정 URL 스킴 딥링크를 생성해 드립니다.
+
+```objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL *url = [userActivity webpageURL];
+
+ NSURL *oldStyleDeeplink = [Adjust convertUniversalLink:url scheme:@"adjustExample"];
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+#### 지연 딥링크(deferred deeplink) 시나리오
+
+지연된 딥링크가 열리기 전에 알림을 받을 델리게이트 콜백을 등록하고 Adjust SDK에서 딥링크를 열도록 할 것인지 결정할 수 있습니다. [속성 콜백](#attribution-callback) 및 [이벤트 및 세션 콜백](#event-session-callbacks)에 사용되는 것과 동일한 선택적 프로토콜인 `AdjustDelegate`가 사용됩니다
+
+동일한 단계로 지연된 딥링크에 대해 다음 델리게이트 콜백 함수를 구현하십시오.
+
+```objc
+- (BOOL)adjustDeeplinkResponse:(NSURL *)deeplink {
+ // deeplink object contains information about deferred deep link content
+
+ // Apply your logic to determine whether the adjust SDK should try to open the deep link
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+콜백 함수는 SDK에서 지연된 딥링크를 서버로부터 수신한 후 딥링크를 열기 전에 호출됩니다. 콜백 함수에서 딥링크에 액세스할 수 있으며, boolean 리턴값에 의해 SDK에서 딥링크를 실행할 것인지 결정합니다. 예를 들어 딥링크를 SDK에서 지금 열지 않고 딥링크를 저장한 후 나중에 직접 열도록 할 수 있습니다.
+
+콜백을 실행하지 않을 경우, **Adjust SDK는 항상 기본값으로 딥링크를 엽니다**.
+
+#### 딥링크를 통한 리어트리뷰션(reattribution)
+
+Adjust는 딥링크를 사용하여 광고 캠페인 리인게이지먼트(re-engagement)를 수행할 수 있게 해줍니다. 이에 대한 자세한 정보는 [관련 문서][reattribution-with-deeplinks]를 참조하세요.
+
+이 기능을 사용 중이라면, 사용자를 올바로 리어트리뷰트하기 위해 앱에서 호출을 하나 더 수행해야 합니다.
+
+앱에서 딥링크 내용을 수신했다면, `appWillOpenUrl` 메서드 호출을 추가하세요. 이 호출이 이루어지면 Adjust SDK는 딥링크 내에 새로운 어트리뷰션 정보가 있는지 확인하고, 새 정보가 있으면 Adjust 백엔드로 송신합니다. 딥링크 정보가 담긴 Adjust 트래커 URL을 클릭한 사용자를 리어트리뷰트해야 할 경우, 앱에서 해당 사용자의 새 어트리뷰션 정보로 [어트리뷰션 콜백](#attribution-callback)이 촉발되는 것을 확인할 수 있습니다.
+
+모든 iOS 버전에서 딥링크 리어트리뷰션을 지원하기 위한 `appWillOpenUrl` 호출은 다음과 같이 이루어집니다.
+
+```objc
+- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
+ sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
+ // url object contains your deep link content
+
+ [Adjust appWillOpenUrl:url];
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+```objc
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
+ restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
+ if ([[userActivity activityType] isEqualToString:NSUserActivityTypeBrowsingWeb]) {
+ NSURL url = [userActivity webpageURL];
+
+ [Adjust appWillOpenUrl:url];
+ }
+
+ // Apply your logic to determine the return value of this method
+ return YES;
+ // or
+ // return NO;
+}
+```
+
+## 문제 해결
+
+### SDK 초기화 지연 문제
+
+[기본 설정 단계](#basic-setup)의 설명처럼 Adjust SDK를 앱 delegate의 `didFinishLaunching` 또는 `didFinishLaunchingWithOptions` 메서드에서 초기화하는 것이 좋습니다. SDK의 모든 기능을 사용할 수 있도록 최대한 빨리 Adjust SDK를 초기화하는 것이 중요합니다.
+
+Adjust SDK를 초기화하지 않기로 할 경우 앱 트래킹에 중대한 영향을 미칠 수 있으므로 다음 내용에 대해 잘 알고 있어야 합니다. **앱에서 모든 종류의 추적을 수행하려면 Adjust SDK를 *초기화해야* 합니다.**
+
+SDK를 초기화하기 전에 아래 작업 중 하나를 수행하기로 하면
+
+* [이벤트 추적](#event-tracking)
+* [딥링크를 통한 리어트리뷰션(reattribution)](#deeplinking-reattribution)
+* [추적 사용 중지](#disable-tracking)
+* [오프라인 모드](#offline-mode)
+
+`해당 작업은 수행되지 않습니다`.
+
+Adjust SDK를 실제로 초기화하기 전에 하려고 했던 모든 작업을 수행하려면 앱에 `custom actions queueing mechanism`을 만들어야 합니다.
+
+오프라인 모드 상태는 변경되지 않으며 추적 사용 가능/사용 중지 상태도 변경되지 않습니다. 딥링크 리어트리뷰션은 수행되지 않으며 추적된 이벤트는 모두 `삭제됩니다`.
+
+세션 추적도 지연된 SDK의 영향을 받을 수 있습니다. Adjust SDK를 실제로 초기화하기 전에는 세션 길이 정보를 수집할 수 없습니다. 이 경우 대시보드에서 DAU 수치가 올바로 추적되지 않을 수 있습니다.
+
+예를 들어, 특정 뷰나 뷰 컨트롤러가 로드되면 Adjust SDK를 시작하고 사용자가 앱의 스플래시 화면 또는 처음 화면이 아닌 홈 화면에서 이 뷰로 이동해야 한다고 가정해 봅시다. 사용자가 앱을 다운로드하고 열면 홈 화면이 표시됩니다. 이 때 추적이 필요한 설치를 수행했는데, 이 사용자는 특정 광고 캠페인에서 왔을 수 있고 앱을 시작했으며 자신의 장치에서 세션을 만들었으므로 해당 사용자는 실제로 앱의 일일 활성 사용자였습니다. 하지만 Adjust SDK는 이런 내용에 대해 전혀 모릅니다. 사용자가 이 SDK를 초기화하기로 결정한 화면으로 이동해야 하기 때문입니다. 사용자가 홈 화면을 본 후 바로 앱을 제거하기로 결정하면, 위에서 언급한 모든 정보는 Adjust SDK에 의해 추적되거나 대시보드에 표시되지 않습니다.
+
+#### 이벤트 추적
+
+추적할 이벤트를 내부 대기열 메커니즘으로 정렬하여 대기열로 보낸다음 SDK가 초기화된 후 이벤트를 추적합니다. SDK를 초기화하기 전에 이벤트를 추적하면 이벤트가 `영구 삭제`되므로, SDK가 초기화되고 [사용 가능](#is-enabled)으로 설정된 후에 이벤트가 추적되는지 확인하십시오.
+
+#### 오프라인 모드와 추적 사용/사용 중지
+
+오프라인 모드는 SDK 초기화 후에도 계속 실행되는 기능이 아니므로 기본적으로 `false`로 설정됩니다. SDK를 초기화하기 전에 오프라인 모드를 사용하도록 설정하면 나중에 SDK를 초기화해도 `false`로 설정됩니다.
+
+추적 사용/사용 중지 설정은 SDK 초기화 후에도 유지됩니다. SDK를 초기화하기 전에 이 값을 토글하려고 하면 그 시도는 무시됩니다. 초기화된 SDK는 토글 시도 전의 상태(사용 또는 사용 중지)로 유지됩니다.
+
+#### 딥링크를 통한 리어트리뷰션(reattribution)
+
+[위 단계](#deeplinking-reattribution)에서 설명한 대로, 딥링크 리어트리뷰션을 처리할 때에는 사용하는 딥링크 연결 메커니즘(이전 방식 또는 universal link)에 따라 `NSURL` 개체를 얻게 되고 그런 다음 아래와 같이 호출을 수행해야 합니다.
+
+```objc
+[Adjust appWillOpenUrl:url]
+```
+
+SDK가 초기화되기 전에 이 호출을 수행하면 사용자가 클릭하고 리어트리뷰션되었어야 할 URL의 딥링크에 대한 정보를 영구적으로 잃게 됩니다. Adjust SDK에서 사용자를 성공적으로 리어트리뷰션하려면, SDK가 초기화된 후 이 `NSURL` 개체 정보를 대기열로 보내고 `appWillOpenUrl` 메서드를 촉발시켜야 합니다.
+
+#### 세션 추적
+
+세션 추적은 Adjust SDK에서 자동으로 수행하므로 앱 개발자가 제어할 수 없습니다. 올바른 세션 추적을 위해서는 이 추가 정보에서 권장하는 방법으로 Adjust SDK를 초기화해야 합니다. 그렇지 않으면 올바른 세션 추적 및 대시보드의 DAU 수치에 중대한 영향을 미칩니다. 예를 들어 다음과 같은 문제가 발생할 수 있습니다.
+
+* SDK가 초기화되기도 전에 사용자가 앱을 삭제하여 설치와 세션이 추적되지 않고, 따라서 대시보드에서 보고되지 않음.
+* 자정 전에 사용자가 앱을 다운로드하고 연 다음 자정이 지난 후 Adjust SDK가 초기화됨으로써 설치 및 세션이 다른 날에 보고됨.
+* 사용자가 같은 날에 앱을 사용하지 않고 자정 직후에 열고 자정이 지난 후에 SDK가 초기화되어 앱을 연 날이 아닌 날에 DAU가 보고됨.
+
+따라서 이 설명서의 내용을 준수하고 Adjust SDK를 앱 델리게이트의 `didFinishLaunching` 또는 `didFinishLaunchingWithOptions` 메서드에서 초기화하십시오.
+
+### "Adjust requires ARC" 오류가 나타납니다
+
+빌드 시 `Adjust requires ARC` 오류가 발생할 경우 프로젝트에서 [ARC][arc]를 사용하지 않은 것이 원인일 수 있습니다. 이 경우 [ARC를 사용하도록 프로젝트를 전환][transition]하는 것이 좋습니다. ARC를 사용하지 않으려면 대상의 빌드 단계에서 Adjust의 모든 소스 파일에 ARC를 사용하도록 설정해야 합니다.
+
+`Compile Sources` 그룹을 펼쳐 모든 Adjust 파일을 선택한 다음 `Compiler Flags`를 `-fobjc-arc`로 변경합니다. (모두 선택 후 `Return` 키를 눌러 동시에 변경)
+
+### "[UIDevice adjTrackingEnabled]: unrecognized selector sent to instance" 오류가 나타납니다
+
+이 오류는 Adjust SDK 프레임워크를 앱에 추가하는 경우 발생할 수 있습니다. Adjust SDK의 소스 파일에는 `categories`가 포함되어 있기 때문에 이 SDK 연동 방법을 선택한 경우 Xcode 프로젝트 설정에서 `-ObjC` 플래그를 `Other Linker Flags`에 추가해야 합니다. 이 플래그를 추가하면 오류가 해결됩니다.
+
+### "Session failed (Ignoring too frequent session.)" 오류가 나타납니다
+
+이 오류는 일반적으로 설치를 테스트할 때 발생합니다. 앱을 제거하고 다시 설치해도 새 설치를 촉발시킬 수 없습니다. 서버에서는 SDK가 로컬에서 집계된 세션 데이터를 유실했다고 판단하며 서버에 제공된 기기 관련 정보에 따라 오류 메시지를 무시합니다.
+
+이 동작은 테스트 중에 불편을 초래할 수도 있지만, sandbox 동작이 프로덕션 환경과 최대한 일치하도록 하기 위해 필요합니다.
+
+기기의 세션 데이터를 Adjust 서버에서 재설정할 수 있습니다. 로그에서 다음 오류 메시지를 확인합니다.
+
+```
+Session failed (Ignoring too frequent session. Last session: YYYY-MM-DDTHH:mm:ss, this session: YYYY-MM-DDTHH:mm:ss, interval: XXs, min interval: 20m) (app_token: {yourAppToken}, adid: {adidValue})
+```
+
+아래에 `{yourAppToken}` 및 `{adidValue}` 또는 `{idfaValue}`값을 입력하고 다음 링크 중 하나를 엽니다.
+
+```
+http://app.adjust.com/forget_device?app_token={yourAppToken}&adid={adidValue}
+```
+
+```
+http://app.adjust.com/forget_device?app_token={yourAppToken}&idfa={idfaValue}
+```
+
+기기가 메모리에서 삭제되면 링크에서 `Forgot device`만 반환됩니다. 장치가 이미 메모리에서 삭제되었거나 값이 올바르지 않으면 `Device not found`가 반환됩니다.
+
+### 로그에 "Install tracked"가 표시되지 않습니다
+
+테스트 기기에서 앱 설치 시나리오를 시뮬레이션하려는 경우 이미 앱이 설치되어 있는 테스트 기기의 Xcode에서 앱을 다시 실행하는 것만으로는 충분하지 않습니다. Xcode에서 앱을 다시 실행하면 앱 데이터가 모두 삭제되지 않고 Adjust SDK가 앱에 보관하는 모든 내부 파일이 유지되므로, Adjust SDK는 해당 파일을 확인한 후 앱이 이미 설치되어 있고 SDK가 앱에서 이미 시작되었지만 처음 열린 게 아니라 한 번 더 열렸을 뿐이라고 인식합니다.
+
+앱 설치 시나리오를 실행하려면 다음 작업을 수행해야 합니다.
+
+* 기기에서 앱을 제거합니다. (완전 제거)
+* [위](#forget-device) 문제에서 설명한 대로 테스트 기기를 Adjust 백엔드에서 삭제합니다.
+* 테스트 기기의 Xcode에서 앱을 실행하면 "Install tracked" 로그 메시지가 표시됩니다.
+
+### "Unattributable SDK click ignored" 메시지가 표시됩니다.
+
+앱을 `sandbox` 환경에서 테스트하는 중에 이 메시지가 표시될 수 있습니다. 이 메시지는 Apple이 `iAd.framework` 버전 3에서 변경한 내용과 관련이 있습니다. 사용자가 iAd 배너를 클릭하면 앱으로 이동될 수 있으며, 이로 인해 Adjust SDK에서 `sdk_click` 패키지를 Adjust 백엔드로 보내 클릭된 URL의 내용에 대해 알릴 수 있습니다. Apple은 iAd 배너를 클릭하지 않았는데 앱이 열릴 경우 임의의 값을 사용하여 iAd 배너 URL 클릭을 인위적으로 생성하기로 했습니다. Adjust SDK는 iAd 배너 클릭이 진짜인지 인위적으로 생성된 것인지 구별할 수 없으므로 모든 경우에 `sdk_click` 패키지를 Adjust 백엔드로 보냅니다. 로그 레벨을 `verbose` 레벨로 설정한 경우 이 `sdk_click` 패키지는 다음과 같이 표시됩니다.
+
+```
+[Adjust]d: Added package 1 (click)
+[Adjust]v: Path: /sdk_click
+[Adjust]v: ClientSdk: ios4.7.0
+[Adjust]v: Parameters:
+[Adjust]v: app_token {YourAppToken}
+[Adjust]v: created_at 2016-04-15T14:25:51.676Z+0200
+[Adjust]v: details {"Version3.1":{"iad-lineitem-id":"1234567890","iad-org-name":"OrgName","iad-creative-name":"CreativeName","iad-click-date":"2016-04-15T12:25:51Z","iad-campaign-id":"1234567890","iad-attribution":"true","iad-lineitem-name":"LineName","iad-creative-id":"1234567890","iad-campaign-name":"CampaignName","iad-conversion-date":"2016-04-15T12:25:51Z"}}
+[Adjust]v: environment sandbox
+[Adjust]v: idfa XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+[Adjust]v: idfv YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY
+[Adjust]v: needs_response_details 1
+[Adjust]v: source iad3
+```
+
+이 `sdk_click`을 고려할 경우 사용자가 다른 캠페인 URL을 클릭하거나 유기적 사용자로서 앱을 열 경우 존재하지 않는 iAd 소스에 어트리뷰션되는 상황이 발생할 수 있습니다. 따라서 Adjust 백엔드는 이를 무시하고 다음 메시지를 통해 알립니다.
+
+```
+[Adjust]v: Response: {"message":"Unattributable SDK click ignored."}
+[Adjust]i: Unattributable SDK click ignored.
+```
+
+따라서 이 메시지는 SDK 연동에 문제가 있다는 뜻이 아니며, Adjust 백엔드에서 사용자가 인위적으로 생성된 `sdk_click`을 무시함으로써 어트리뷰션/리어트리뷰션이 잘못 이루어되는 결과를 초래했을 가능성이 있음을 알려줄 뿐입니다.
+
+### Adjust 대시보드에 잘못된 매출 데이터가 있습니다
+
+Adjust SDK는 지정한 대상만 추적합니다. 매출을 이벤트에 연결하는 경우, 금액으로 작성하는 숫자만 Adjust 백엔드에 도달하며 대시보드에 표시되는 유일한 금액이 됩니다. Adjust SDK는 금액 값을 조작하지 않으며 Adjust 백엔드도 마찬가지입니다. 따라서 추적 금액이 틀렸다면 Adjust SDK에서 해당 금액을 추적하도록 지시받았기 때문입니다.
+
+사용자 매출 이벤트 추적 코드는 일반적으로 다음과 같습니다.
+
+```objc
+// ...
+
+- (double)someLogicForGettingRevenueAmount {
+ // This method somehow handles how user determines
+ // what's the revenue value which should be tracked.
+
+ // It is maybe making some calculations to determine it.
+
+ // Or maybe extracting the info from In-App purchase which
+ // was successfully finished.
+
+ // Or maybe returns some predefined double value.
+
+ double amount; // double amount = some double value
+
+ return amount;
+}
+
+// ...
+
+- (void)someRandomMethodInTheApp {
+ double amount = [self someLogicForGettingRevenueAmount];
+
+ ADJEvent *event = [ADJEvent eventWithEventToken:@"abc123"];
+ [event setRevenue:amount currency:@"EUR"];
+ [Adjust trackEvent:event];
+}
+```
+
+추적하도록 지정한 값이 아닌 다른 값이 대시보드에 보일 경우 **금액 값 결정 로직을 확인하십시오**.
+
+
+[dashboard]: http://adjust.com
+[adjust.com]: http://adjust.com
+
+[en-readme]: ../../README.md
+[zh-readme]: ../chinese/README.md
+[ja-readme]: ../japanese/README.md
+[ko-readme]: ../korean/README.md
+
+[arc]: http://en.wikipedia.org/wiki/Automatic_Reference_Counting
+[examples]: http://github.com/adjust/ios_sdk/tree/master/examples
+[carthage]: https://github.com/Carthage/Carthage
+[releases]: https://github.com/adjust/ios_sdk/releases
+[cocoapods]: http://cocoapods.org
+[transition]: http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
+
+[example-tvos]: examples/AdjustExample-tvOS
+[example-iwatch]: examples/AdjustExample-iWatch
+[example-imessage]: examples/AdjustExample-iMessage
+[example-ios-objc]: examples/AdjustExample-iOS
+[example-ios-swift]: examples/AdjustExample-Swift
+
+[AEPriceMatrix]: https://github.com/adjust/AEPriceMatrix
+[event-tracking]: https://docs.adjust.com/ko/event-tracking
+[example-iwatch]: http://github.com/adjust/ios_sdk/tree/master/examples/AdjustExample-iWatch
+[callbacks-guide]: https://docs.adjust.com/ko/callbacks
+[universal-links]: https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html
+
+[special-partners]: https://docs.adjust.com/ko/special-partners
+[attribution-data]: https://github.com/adjust/sdks/blob/master/doc/attribution-data.md
+[ios-web-views-guide]: doc/english/web_views.md
+[currency-conversion]: https://docs.adjust.com/ko/event-tracking/#part-7
+
+[universal-links-guide]: https://docs.adjust.com/ko/universal-links/
+[adjust-universal-links]: https://docs.adjust.com/ko/universal-links/
+[universal-links-testing]: https://docs.adjust.com/ko/universal-links/#part-4
+[reattribution-deeplinks]: https://docs.adjust.com/ko/deeplinking/#part-6-1
+[ios-purchase-verification]: https://github.com/adjust/ios_purchase_sdk/tree/master/doc/korean
+
+[reattribution-with-deeplinks]: https://docs.adjust.com/ko/deeplinking/#part-6-1
+
+[run]: https://raw.github.com/adjust/sdks/master/Resources/ios/run5.png
+[add]: https://raw.github.com/adjust/sdks/master/Resources/ios/add5.png
+[drag]: https://raw.github.com/adjust/sdks/master/Resources/ios/drag5.png
+[delegate]: https://raw.github.com/adjust/sdks/master/Resources/ios/delegate5.png
+[framework]: https://raw.github.com/adjust/sdks/master/Resources/ios/framework5.png
+
+[adc-ios-team-id]: https://raw.github.com/adjust/sdks/master/Resources/ios/adc-ios-team-id5.png
+[custom-url-scheme]: https://raw.github.com/adjust/sdks/master/Resources/ios/custom-url-scheme.png
+[adc-associated-domains]: https://raw.github.com/adjust/sdks/master/Resources/ios/adc-associated-domains5.png
+[xcode-associated-domains]: https://raw.github.com/adjust/sdks/master/Resources/ios/xcode-associated-domains5.png
+[universal-links-dashboard]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard5.png
+
+[associated-domains-applinks]: https://raw.github.com/adjust/sdks/master/Resources/ios/associated-domains-applinks.png
+[universal-links-dashboard-values]: https://raw.github.com/adjust/sdks/master/Resources/ios/universal-links-dashboard-values5.png
+
+## 라이선스
+
+Adjust SDK는 MIT 라이선스에 따라 사용이 허가됩니다.
+
+Copyright (c) 2012-2019 Adjust GmbH, http://www.adjust.com
+
+이로써 본 소프트웨어와 관련 문서 파일(이하 "소프트웨어")의 복사본을 받는 사람에게는 아래 조건에 따라 소프트웨어를 제한 없이 다룰 수 있는 권한이 무료로 부여됩니다. 이 권한에는 소프트웨어를 사용, 복사, 수정, 병합, 출판, 배포 및/또는 판매하거나 2차 사용권을 부여할 권리와 소프트웨어를 제공 받은 사람이 소프트웨어를 사용, 복사, 수정, 병합, 출판, 배포 및/또는 판매하거나 2차 사용권을 부여하는 것을 허가할 수 있는 권리가 제한 없이 포함됩니다.
+
+위 저작권 고지문과 본 권한 고지문은 소프트웨어의 모든 복사본이나 주요 부분에 포함되어야 합니다.
+
+소프트웨어는 상품성, 특정 용도에 대한 적합성 및 비침해에 대한 보증 등을 비롯한 어떤 종류의 명시적이거나 암묵적인 보증 없이 "있는 그대로" 제공됩니다. 어떤 경우에도 저작자나 저작권 보유자는 소프트웨어와 소프트웨어의 사용 또는 기타 취급에서 비롯되거나 그에 기인하거나 그와 관련하여 발생하는 계약 이행 또는 불법 행위 등에 관한 배상 청구, 피해 또는 기타 채무에 대해 책임지지 않습니다.
+--END--
diff --git a/doc/korean/fb_pixel.md b/doc/korean/fb_pixel.md
new file mode 100644
index 000000000..074b4efa5
--- /dev/null
+++ b/doc/korean/fb_pixel.md
@@ -0,0 +1,126 @@
+## Facebook 픽셀 연동
+
+[Facebook 픽셀](https://www.facebook.com/business/help/952192354843755)은 Facebook의 웹 전용 애널리틱스 도구입니다. 종전에는 Facebook SDK으로 앱 WebView에서 픽셀 이벤트를 추적할 수 없었으나 [Facebook SDK](https://developers.facebook.com/docs/analytics) v4.34 버전 출시와 더불어 이제 가능해졌으며, [하이브리드 모바일 앱 이벤트](https://developers.facebook.com/docs/app-events/hybrid-app-events)를 사용하여 Facebook 픽셀 이벤트를 Facebook 앱 이벤트로 전환할 수 있습니다.
+
+또한 Facebook SDK에 연동하지 않고도 Adjust SDK로 Facebook 픽셀을 사용할 수 있습니다.
+
+## Facebook 연동
+
+### 앱 예제
+
+[`AdjustExample-FbPixel` 디렉토리][example-fbpixel]에서 Adjust WebView SDK를 사용하지 않고 Facebook 픽셀 이벤트를 추적하는 방법을 설명하는 앱 예제를 찾아볼 수 있습니다.
+
+### Facebook App ID
+
+Facebook SDK 연동을 하지 않아도 됩니다. 그러나 Adjust SDK가 Facebook 픽셀을 연동하도록 하기 위해서는 Facebook SDK에서와 동일한 몇 단계의 절차를 밟아야 합니다.
+
+[Facebook iOS SDK 지침](https://developers.facebook.com/docs/ios/getting-started/#xcode)에 설명한 대로 Facebook App ID를 앱에 추가해야 합니다. 위 지침에 설명한 단계를 그대로 따르면 되며, 이용자의 편의를 위해 아래에 그대로 복사해 놓았습니다.
+
+- Xcode에서 프로젝트 내 `Info.plist` 파일을 우클릭한 후 'Open As' -> 'Source Code'를 선택합니다.
+- 다음 XML 라인을 파일 본문 마지막 `` 엘리먼트 바로 앞에 삽입합니다.
+
+ ```xml
+
+ ...
+ FacebookAppID
+ {your-app-id}
+ ...
+
+ ```
+
+- `{your-app-id}`를 사용 중인 앱의 App ID로 대체합니다. (App ID는 *Facebook App 대시보드*에서 확인할 수 있습니다.)
+
+### Facebook 픽셀 환경설정
+
+픽셀 연동에 대한 Facebook 지침을 따르면 됩니다. 자바스크립트 코드는 다음과 같이 보일 것입니다.
+
+```js
+
+
+...
+
+```
+
+이제 [하이브리드 모바일 앱 이벤트 지침](https://developers.facebook.com/docs/app-events/hybrid-app-events) 내 `Update Your Pixel` 섹션에서 설명한 대로 Facebook 픽셀 코드를 다음과 같이 업데이트합니다.
+
+```js
+fbq('init', );
+fbq('set', 'mobileBridge', , );
+```
+
+**주의**: `'init'`를 먼저 호출하고 바로 그 다음에 `'set'` 메서드를 호출하는 게 **대단히 중요**함을 명심해 주십시오. (위에 나온 것처럼) Facebook에서 제공하여 사용 대상 HTML 웹 페이지에 붙이는 스크립트 라인에는, `'init'` 호출 바로 다음에 페이지 보기 이벤트에 사용하는 `'track'` 메서드가 들어 있습니다. 이 페이지 보기 이벤트를 올바로 추적하려면 그 사이에 반드시 `'set'` 메서드를 호출해야 합니다!
+
+## Adjust 연동
+
+### WebView 증강
+
+[iOS WebView](web_views.md) 앱의 연동 지침을 따르면 됩니다. WebView 브릿지를 로드할 섹션은 아래를 참조하십시오.
+
+```objc
+- (void)viewWillAppear:(BOOL)animated {
+ ...
+ UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
+ // or with WKWebView:
+ // WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
+
+ // add @property (nonatomic, strong) AdjustBridge *adjustBridge; on your interface
+ self.adjustBridge = [[AdjustBridge alloc] init];
+ [self.adjustBridge loadUIWebViewBridge:webView];
+ // optionally you can add a web view delegate so that you can also capture its events
+ // [self.adjustBridge loadUIWebViewBridge:webView webViewDelegate:(UIWebViewDelegate*)self];
+
+ // or with WKWebView:
+ // [self.adjustBridge loadWKWebViewBridge:webView];
+ // optionally you can add a web view delegate so that you can also capture its events
+ // [self.adjustBridge loadWKWebViewBridge:webView wkWebViewDelegate:(id)self];
+ ...
+```
+
+WebView를 Adjust 브릿지에 로드하는 데 어떤 방법을 사용하든 상관 없이 공통적으로 아래 라인을 추가하고 해당 단계를 따르면 됩니다.
+
+```objc
+[self.adjustBridge augmentHybridWebView];
+```
+
+### 이벤트 이름 환경설정
+
+Adjust 웹 브릿지 SDK는 Facebook 픽셀 이벤트를 Adjust 이벤트로 전환시켜 줍니다.
+
+따라서 Facebook 픽셀을 특정한 Adjust 이벤트에 배치(매핑, mapping)하거나, Facebook 픽셀 환경설정에서 복사해 와서 붙이는 `fbq('track', 'PageView');` 등의 Facebook 픽셀 이벤트 추적을 Adjust SDK를 사용하여 시작하기 **전에** Adjust 이벤트 토큰의 기본값을 설정해야 합니다.
+
+Facebook 픽셀 이벤트와 Adjust 이벤트를 매핑하려면 Adjust SDK를 초기화하기 전에 `adjustConfig` 인스턴스에서 `addFbPixelMapping(fbEventNameKey, adjEventTokenValue)` 메서드를 호출합니다. 매핑이 이루어진 예는 아래와 같습니다.
+
+```js
+adjustConfig.addFbPixelMapping('fb_mobile_search', adjustEventTokenForSearch);
+adjustConfig.addFbPixelMapping('fb_mobile_purchase', adjustEventTokenForPurchase);
+```
+
+위에 보이는 매핑의 예시는 Facebook 이벤트 중 `fbq('track', 'Search', ...);` 및 `fbq('track', 'Purchase', ...);`를 각각 추적하는 경우에 해당함을 유의해 주십시오. 아쉽게도 Adjust는 자바스크립트에서 추적하는 이벤트 이름과 Facebook SDK에 사용하는 이벤트 이름 전체의 매핑 구조에는 접근할 수 없습니다.
+
+사용자에게 도움을 드리고자 Adjust가 지금까지 찾아 낸 이벤트 이름 정보를 다음과 같이 정리했습니다.
+
+| 픽셀 이벤트 이름 | 해당하는 Facebook 앱 이벤트 이름
+| ---------------- | -------------------------------------
+| ViewContent | fb_mobile_content_view
+| Search | fb_mobile_search
+| AddToCart | fb_mobile_add_to_cart
+| AddToWishlist | fb_mobile_add_to_wishlist
+| InitiateCheckout | fb_mobile_initiated_checkout
+| AddPaymentInfo | fb_mobile_add_payment_info
+| Purchase | fb_mobile_purchase
+| CompleteRegistration | fb_mobile_complete_registration
+
+위 목록은 완전하지 않을 수 있으며, Facebook이 현재 목록에 새 항목을 추가하거나 목록을 업데이트할 가능성도 있습니다. 테스트하는 중에는 다음과 같은 Adjust 경고 로그를 확인하십시오.
+
+```
+There is not a default event token configured or a mapping found for event named: 'fb_mobile_search'. It won't be tracked as an adjust event
+```
+
+매핑 환경설정을 하지 않았다면 그냥 Adjust 이벤트 기본값을 사용할 수도 있습니다. Adjust SDK를 초기화하기 전에 `adjustConfig.setFbPixelDefaultEventToken(defaultEventToken);` 메서드를 호출하기만 하면 됩니다.
+
+[example-fbpixel]: ../../examples/AdjustExample-FbPixel
diff --git a/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift b/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift
index d988312fd..ae83aae19 100644
--- a/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift
+++ b/examples/AdjustExample-Swift/AdjustExample-Swift/AppDelegate.swift
@@ -65,7 +65,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, AdjustDelegate {
NSLog("adjust session failure %@", sessionFailureResponseData ?? "")
}
- @objc func adjustDeeplinkResponse(_deeplink: NSURL!) -> Bool {
+ func adjustDeeplinkResponse(_ deeplink: URL?) -> Bool {
+ NSLog("adjust deferred deep link %@", deeplink?.absoluteString ?? "")
return true
}
diff --git a/examples/AdjustExample-Swift/AdjustExample-Swift/Info.plist b/examples/AdjustExample-Swift/AdjustExample-Swift/Info.plist
index 6905cc67b..38182b7b5 100644
--- a/examples/AdjustExample-Swift/AdjustExample-Swift/Info.plist
+++ b/examples/AdjustExample-Swift/AdjustExample-Swift/Info.plist
@@ -36,5 +36,16 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
+ CFBundleURLTypes
+
+
+ CFBundleURLName
+ com.adjust.examples
+ CFBundleURLSchemes
+
+ adjust-example
+
+
+