diff --git a/Assets/AppsFlyer/AppsFlyer.cs b/Assets/AppsFlyer/AppsFlyer.cs index 6708e2ad..af1b1d39 100755 --- a/Assets/AppsFlyer/AppsFlyer.cs +++ b/Assets/AppsFlyer/AppsFlyer.cs @@ -7,10 +7,11 @@ namespace AppsFlyerSDK public class AppsFlyer : MonoBehaviour { - public static readonly string kAppsFlyerPluginVersion = "6.1.0"; + public static readonly string kAppsFlyerPluginVersion = "6.1.3"; public static string CallBackObjectName = null; private static EventHandler onRequestResponse; private static EventHandler onInAppResponse; + private static EventHandler onDeepLinkReceived; /// @@ -483,6 +484,40 @@ public static void generateUserInviteLink(Dictionary parameters, AppsFlyerAndroid.generateUserInviteLink(parameters, gameObject); #else +#endif + } + + + /// + /// Use this method if you’re integrating your app with push providers + /// that don’t use the default push notification JSON schema the SDK expects. + /// See docs for more info. + /// + /// array of nested json path + public static void addPushNotificationDeepLinkPath(params string[] paths) + { +#if UNITY_IOS && !UNITY_EDITOR + AppsFlyeriOS.addPushNotificationDeepLinkPath(paths); +#elif UNITY_ANDROID && !UNITY_EDITOR + AppsFlyerAndroid.addPushNotificationDeepLinkPath(paths); +#else + +#endif + } + + /// + /// Subscribe for unified deeplink API. + /// This is called automatically from OnDeepLinkReceived. + /// CallBackObjectName is set in the init method. + /// + public static void subscribeForDeepLink() + { +#if UNITY_IOS && !UNITY_EDITOR + AppsFlyeriOS.subscribeForDeepLink(CallBackObjectName); +#elif UNITY_ANDROID && !UNITY_EDITOR + AppsFlyerAndroid.subscribeForDeepLink(CallBackObjectName); +#else + #endif } @@ -516,6 +551,22 @@ public static event EventHandler OnInAppResponse } } + /// + /// Unified DeepLink Event + /// + public static event EventHandler OnDeepLinkReceived + { + add + { + onDeepLinkReceived += value; + subscribeForDeepLink(); + } + remove + { + onDeepLinkReceived -= value; + } + } + /// /// Used to accept start callback from UnitySendMessage on native side. /// @@ -538,6 +589,20 @@ public void requestResponseReceived(string response) } } + /// + /// Used to accept deeplink callback from UnitySendMessage on native side. + /// + public void onDeepLinking(string response) + { + + DeepLinkEventsArgs args = new DeepLinkEventsArgs(response); + + if (onDeepLinkReceived != null) + { + onDeepLinkReceived.Invoke(null, args); + } + } + private static AppsFlyerRequestEventArgs parseRequestCallback(string response) { int responseCode = 0; diff --git a/Assets/AppsFlyer/AppsFlyerAndroid.cs b/Assets/AppsFlyer/AppsFlyerAndroid.cs index 5edc3e1e..45b16bc9 100644 --- a/Assets/AppsFlyer/AppsFlyerAndroid.cs +++ b/Assets/AppsFlyer/AppsFlyerAndroid.cs @@ -620,6 +620,28 @@ public static void handlePushNotifications(){ #endif } + /// + /// Use this method if you’re integrating your app with push providers + /// that don’t use the default push notification JSON schema the SDK expects. + /// See docs for more info. + /// + /// array of nested json path + public static void addPushNotificationDeepLinkPath(params string[] paths) + { +#if !UNITY_EDITOR + appsFlyerAndroid.CallStatic("addPushNotificationDeepLinkPath", (object)paths); +#endif + } + + /// + /// subscribe to unified deep link callbacks + /// + public static void subscribeForDeepLink(string objectName){ +#if !UNITY_EDITOR + appsFlyerAndroid.CallStatic("subscribeForDeepLink", objectName); +#endif + } + /// /// Internal Helper Method. /// diff --git a/Assets/AppsFlyer/AppsFlyerEventArgs.cs b/Assets/AppsFlyer/AppsFlyerEventArgs.cs index 24d31b0b..d9b7bf16 100644 --- a/Assets/AppsFlyer/AppsFlyerEventArgs.cs +++ b/Assets/AppsFlyer/AppsFlyerEventArgs.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace AppsFlyerSDK { @@ -31,4 +32,184 @@ public AppsFlyerRequestEventArgs(int code, string description) public int statusCode { get; } public string errorDescription { get; } } -} \ No newline at end of file + + /// + /// Event args for OnDeepLinkReceived. + /// Used to handle deep linking results. + /// + public class DeepLinkEventsArgs : EventArgs + { + + /// + /// DeepLink dictionary to get additional parameters + /// + public Dictionary deepLink; + + /// + /// DeepLink status: FOUND, NOT_FOUND, ERROR + /// + public DeepLinkStatus status { get; } + + /// + /// DeepLink error: TIMEOUT, NETWORK, HTTP_STATUS_CODE, UNEXPECTED + /// + public DeepLinkError error { get; } + + public string getMatchType() + { + return getDeepLinkParameter("match_type"); + } + + public string getDeepLinkValue() + { + return getDeepLinkParameter("deep_link_value"); + } + + public string getClickHttpReferrer() + { + return getDeepLinkParameter("click_http_referrer"); + } + + public string getMediaSource() + { + return getDeepLinkParameter("media_source"); + } + + public string getCampaign() + { + return getDeepLinkParameter("campaign"); + } + + public string getCampaignId() + { + return getDeepLinkParameter("campaign_id"); + } + + public string getAfSub1() + { + return getDeepLinkParameter("af_sub1"); + } + + public string getAfSub2() + { + return getDeepLinkParameter("af_sub2"); + } + + public string getAfSub3() + { + return getDeepLinkParameter("af_sub3"); + } + + public string getAfSub4() + { + return getDeepLinkParameter("af_sub4"); + } + + public string getAfSub5() + { + return getDeepLinkParameter("af_sub5"); + } + + public bool isDeferred() + { + if (deepLink != null && deepLink.ContainsKey("is_deferred")) + { + try + { + return (bool)deepLink["is_deferred"]; + } + catch (Exception e) + { + AppsFlyer.AFLog("DeepLinkEventsArgs.isDeferred", String.Format("{0} Exception caught.", e)); + } + } + + return false; + } + + public Dictionary getDeepLinkDictionary() + { + return deepLink; + } + + public DeepLinkEventsArgs(string str) + { + try + { + Dictionary dictionary = AppsFlyer.CallbackStringToDictionary(str); + + string status = ""; + string error = ""; + Dictionary deepLink; + + if (dictionary.ContainsKey("status") && dictionary["status"] != null) + { + status = dictionary["status"].ToString(); + } + + if (dictionary.ContainsKey("error") && dictionary["error"] != null) + { + error = dictionary["error"].ToString(); + } + + if (dictionary.ContainsKey("deepLink") && dictionary["deepLink"] != null) + { + this.deepLink = AppsFlyer.CallbackStringToDictionary(dictionary["deepLink"].ToString()); + } + + switch (status) + { + case "FOUND": + this.status = DeepLinkStatus.FOUND; + break; + case "NOT_FOUND": + this.status = DeepLinkStatus.NOT_FOUND; + break; + default: + this.status = DeepLinkStatus.ERROR; + break; + } + + switch (error) + { + case "TIMEOUT": + this.error = DeepLinkError.TIMEOUT; + break; + case "NETWORK": + this.error = DeepLinkError.NETWORK; + break; + case "HTTP_STATUS_CODE": + this.error = DeepLinkError.HTTP_STATUS_CODE; + break; + default: + this.error = DeepLinkError.UNEXPECTED; + break; + } + + } + catch (Exception e) + { + AppsFlyer.AFLog("DeepLinkEventsArgs.parseDeepLink", String.Format("{0} Exception caught.", e)); + } + } + + private string getDeepLinkParameter(string name) + { + if (deepLink != null && deepLink.ContainsKey(name) && deepLink[name] != null) + { + return deepLink[name].ToString(); + } + + return null; + } + + } + + public enum DeepLinkStatus { + FOUND, NOT_FOUND, ERROR + } + + public enum DeepLinkError { + TIMEOUT, NETWORK, HTTP_STATUS_CODE, UNEXPECTED + } +} diff --git a/Assets/AppsFlyer/AppsFlyeriOS.cs b/Assets/AppsFlyer/AppsFlyeriOS.cs index 4e7e90a8..e82f7010 100644 --- a/Assets/AppsFlyer/AppsFlyeriOS.cs +++ b/Assets/AppsFlyer/AppsFlyeriOS.cs @@ -493,6 +493,27 @@ public static void disableSKAdNetwork(bool isDisabled) #endif } + /// + /// Use this method if you’re integrating your app with push providers + /// that don’t use the default push notification JSON schema the SDK expects. + /// See docs for more info. + /// + /// array of nested json path + public static void addPushNotificationDeepLinkPath(params string[] paths) + { +#if !UNITY_EDITOR + _addPushNotificationDeepLinkPath(paths.Length, paths); +#endif + } + + /// + /// subscribe to unified deep link callbacks + /// + public static void subscribeForDeepLink(string objectName){ +#if !UNITY_EDITOR + _subscribeForDeepLink(objectName); +#endif + } /* * AppsFlyer ios method mapping @@ -615,6 +636,12 @@ public static void disableSKAdNetwork(bool isDisabled) [DllImport("__Internal")] private static extern void _disableSKAdNetwork(bool isDisabled); + [DllImport("__Internal")] + private static extern void _addPushNotificationDeepLinkPath(int length, params string[] paths); + + [DllImport("__Internal")] + private static extern void _subscribeForDeepLink(string objectName); + } #endif diff --git a/Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml b/Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml index 702c4c67..2a8fbbd1 100644 --- a/Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml +++ b/Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml @@ -2,16 +2,16 @@ - + - + - + diff --git a/Assets/AppsFlyer/Plugins/iOS/AFUnityUtils.mm b/Assets/AppsFlyer/Plugins/iOS/AFUnityUtils.mm index a2288d4d..8e55713a 100644 --- a/Assets/AppsFlyer/Plugins/iOS/AFUnityUtils.mm +++ b/Assets/AppsFlyer/Plugins/iOS/AFUnityUtils.mm @@ -98,3 +98,38 @@ static EmailCryptType emailCryptTypeFromInt(int emailCryptTypeInt){ return emailCryptType; } +static NSString* stringFromDeepLinkResultStatus(AFSDKDeepLinkResultStatus deepLinkResult){ + NSString* result; + switch (deepLinkResult){ + case AFSDKDeepLinkResultStatusFound: + result = @"FOUND"; + break; + case AFSDKDeepLinkResultStatusFailure: + result = @"ERROR"; + break; + case AFSDKDeepLinkResultStatusNotFound: + result = @"NOT_FOUND"; + break; + default: + result = @"ERROR"; + break; + } + + return result; +} + +static NSString* stringFromDeepLinkResultError(AppsFlyerDeepLinkResult *result){ + NSString* res; + + if (result && result.error){ + if ([[result.error userInfo][NSUnderlyingErrorKey] code] == -1001) { + res = @"TIMEOUT"; + } else if ([[result.error userInfo][NSUnderlyingErrorKey] code] == -1009) { + res = @"NETWORK"; + } + } + + res = @"UNKNOWN"; + + return res; +} diff --git a/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.h b/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.h index 8655a69f..ca78044d 100644 --- a/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.h +++ b/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.h @@ -13,7 +13,7 @@ #import "AppsFlyerLib.h" #endif -@interface AppsFlyeriOSWarpper : NSObject +@interface AppsFlyeriOSWarpper : NSObject @end @@ -33,10 +33,13 @@ static const char* GENERATE_LINK_CALLBACK = "onInviteLinkGenerated"; static const char* OPEN_STORE_LINK_CALLBACK = "onOpenStoreLinkGenerated"; static const char* START_REQUEST_CALLBACK = "requestResponseReceived"; static const char* IN_APP_RESPONSE_CALLBACK = "inAppResponseReceived"; +static const char* ON_DEEPLINKING = "onDeepLinking"; + static NSString* validateObjectName = @""; static NSString* openStoreObjectName = @""; static NSString* generateInviteObjectName = @""; static NSString* startRequestObjectName = @""; static NSString* inAppRequestObjectName = @""; +static NSString* onDeeplinkingObjectName = @""; diff --git a/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.mm b/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.mm index 6636a60c..a68842c6 100644 --- a/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.mm +++ b/Assets/AppsFlyer/Plugins/iOS/AppsFlyeriOSWrapper.mm @@ -240,6 +240,22 @@ const void _waitForATTUserAuthorizationWithTimeoutInterval (int timeoutInterval) const void _disableSKAdNetwork (bool isDisabled) { [AppsFlyerLib shared].disableSKAdNetwork = isDisabled; } + + const void _addPushNotificationDeepLinkPath (int length, const char **paths) { + if(length > 0 && paths) { + [[AppsFlyerLib shared] addPushNotificationDeepLinkPath:NSArrayFromCArray(length, paths)]; + } + } + + const void _subscribeForDeepLink (const char* objectName) { + + onDeeplinkingObjectName = stringFromChar(objectName); + + if (_AppsFlyerdelegate == nil) { + _AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init]; + } + [[AppsFlyerLib shared] setDeepLinkDelegate:_AppsFlyerdelegate]; + } } @implementation AppsFlyeriOSWarpper @@ -260,5 +276,19 @@ - (void)onAppOpenAttributionFailure:(NSError *)error { unityCallBack(ConversionDataCallbackObject, OAOA_ERROR_CALLBACK, [[error localizedDescription] UTF8String]); } +- (void)didResolveDeepLink:(AppsFlyerDeepLinkResult *)result{ + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + + [dict setValue:stringFromDeepLinkResultError(result) forKey:@"error"]; + [dict setValue:stringFromDeepLinkResultStatus(result.status) forKey:@"status"]; + + if(result && result.deepLink){ + [dict setValue:result.deepLink.description forKey:@"deepLink"]; + } + + unityCallBack(onDeeplinkingObjectName, ON_DEEPLINKING, stringFromdictionary(dict)); +} + @end diff --git a/CHANGELOG.md b/CHANGELOG.md index fbf4305d..53ac9527 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Versions +## v6.1.3 + +* RD-50954 - Added Unified Deep Linking API +* RD-54264 - Added addPushNotificationDeepLinkPath api for iOS & Android +* RD-54266 - iOS SDK Version - 6.1.3 +* RD-54266 - Android SDK Version - 6.1.3 + ## v6.1.0 * iOS SDK Version - 6.1.1 diff --git a/README.md b/README.md index a64e2876..1ba7aba9 100755 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ ### This plugin is built for -- Android AppsFlyer SDK **v6.1.0** -- iOS AppsFlyer SDK **v6.1.1** +- Android AppsFlyer SDK **v6.1.3** +- iOS AppsFlyer SDK **v6.1.3** diff --git a/android-unity-wrapper/gradle.properties b/android-unity-wrapper/gradle.properties index d35446cd..240190e2 100644 --- a/android-unity-wrapper/gradle.properties +++ b/android-unity-wrapper/gradle.properties @@ -20,8 +20,8 @@ android.enableJetifier=true GROUP=com.appsflyer -VERSION_CODE=8 -VERSION_NAME=6.1.1 +VERSION_CODE=9 +VERSION_NAME=6.1.3 POM_ARTIFACT_ID=unity-wrapper POM_PACKAGING=aar diff --git a/android-unity-wrapper/unitywrapper/build.gradle b/android-unity-wrapper/unitywrapper/build.gradle index ba73e5c4..36fa0a94 100644 --- a/android-unity-wrapper/unitywrapper/build.gradle +++ b/android-unity-wrapper/unitywrapper/build.gradle @@ -31,7 +31,7 @@ repositories { dependencies { compileOnly fileTree(dir: 'libs', include: ['*.jar']) compileOnly 'androidx.appcompat:appcompat:1.1.0' - compileOnly 'com.appsflyer:af-android-sdk:6.1.0' + compileOnly 'com.appsflyer:af-android-sdk:6.1.3' } diff --git a/android-unity-wrapper/unitywrapper/src/main/java/com/appsflyer/unity/AppsFlyerAndroidWrapper.java b/android-unity-wrapper/unitywrapper/src/main/java/com/appsflyer/unity/AppsFlyerAndroidWrapper.java index 2681264c..7ccf1cfa 100644 --- a/android-unity-wrapper/unitywrapper/src/main/java/com/appsflyer/unity/AppsFlyerAndroidWrapper.java +++ b/android-unity-wrapper/unitywrapper/src/main/java/com/appsflyer/unity/AppsFlyerAndroidWrapper.java @@ -395,4 +395,8 @@ public void onDeepLinking(@NonNull DeepLinkResult deepLinkResult) { } }); } + + public static void addPushNotificationDeepLinkPath(String ... path){ + AppsFlyerLib.getInstance().addPushNotificationDeepLinkPath(path); + } } diff --git a/appsflyer-unity-plugin-6.1.0.unitypackage b/appsflyer-unity-plugin-6.1.0.unitypackage deleted file mode 100644 index 1d53f41c..00000000 Binary files a/appsflyer-unity-plugin-6.1.0.unitypackage and /dev/null differ diff --git a/appsflyer-unity-plugin-6.1.3.unitypackage b/appsflyer-unity-plugin-6.1.3.unitypackage new file mode 100644 index 00000000..0cec2b44 Binary files /dev/null and b/appsflyer-unity-plugin-6.1.3.unitypackage differ diff --git a/deploy/build_unity_package.sh b/deploy/build_unity_package.sh index 63c736a0..6308091b 100644 --- a/deploy/build_unity_package.sh +++ b/deploy/build_unity_package.sh @@ -4,7 +4,7 @@ echo "Start Build for appsflyer-unity-plugin.unitypackage" DEPLOY_PATH=outputs UNITY_PATH="/Applications/Unity/Unity.app/Contents/MacOS/Unity" -PACKAGE_NAME="appsflyer-unity-plugin-6.1.0.unitypackage" +PACKAGE_NAME="appsflyer-unity-plugin-6.1.3.unitypackage" mkdir -p $DEPLOY_PATH @@ -20,7 +20,7 @@ mkdir -p $DEPLOY_PATH Assets \ $PWD/$DEPLOY_PATH/$PACKAGE_NAME \ -quit \ -&& echo "package exported successfully to outputs/appsflyer-unity-plugin-6.1.0.unitypackage" \ +&& echo "package exported successfully to outputs/appsflyer-unity-plugin-6.1.3.unitypackage" \ || echo "Failed to export package. See create_unity_core.log for more info." diff --git a/deploy/strict_mode_build_package.sh b/deploy/strict_mode_build_package.sh new file mode 100644 index 00000000..5e1625ae --- /dev/null +++ b/deploy/strict_mode_build_package.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +echo "Start Build for appsflyer-unity-plugin.unitypackage. Strict Mode." + + + DEPLOY_PATH=outputs + UNITY_PATH="/Applications/Unity/Unity.app/Contents/MacOS/Unity" + PACKAGE_NAME="appsflyer-unity-plugin-strict-mode-6.1.3.unitypackage" + mkdir -p $DEPLOY_PATH + +echo "Changing AppsFlyerFramework to Strict Mode" +sed -i '' 's/AppsFlyerFramework/AppsFlyerFramework\/Strict/g' ../Assets/AppsFlyer/Editor/AppsFlyerDependencies.xml +echo "Changing AppsFlyerFramework to Strict Mode. Done." + + + # Build the .unitypackage + /Applications/Unity/Hub/Editor/2019.1.8f1/Unity.app/Contents/MacOS/Unity \ + -gvh_disable \ + -batchmode \ + -importPackage external-dependency-manager-1.2.144.unitypackage \ + -nographics \ + -logFile create_unity_core.log \ + -projectPath $PWD/../ \ + -exportPackage \ + Assets \ + $PWD/$DEPLOY_PATH/$PACKAGE_NAME \ + -quit \ + && echo "package exported successfully to outputs/appsflyer-unity-plugin-strict-mode-6.1.3.unitypackage" \ + || echo "Failed to export package. See create_unity_core.log for more info." + + + if [ $1 == "-p" ]; then + echo "removing ./Library" + rm -rf ../Library + echo "removing ./Logs" + rm -rf ../Logs + echo "removing ./Packages" + rm -rf ../Packages + echo "removing ./ProjectSettings" + rm -rf ../ProjectSettings + echo "removing ./deploy/create_unity_core.log" + rm ./create_unity_core.log + echo "Moving $DEPLOY_PATH/$PACKAGE_NAME to root" + mv ./outputs/$PACKAGE_NAME .. + echo "removing ./deploy/outputs" + rm -rf ./outputs + else + echo "dev mode. No files removed. Run with -p flag for production build." + fi diff --git a/docs/API.md b/docs/API.md index fc051151..87a9dfcc 100755 --- a/docs/API.md +++ b/docs/API.md @@ -72,6 +72,7 @@ The list of available methods for this plugin is described below. - [Events](#events) - [OnRequestResponse](#onRequestResponse) - [OnInAppResponse](#onInAppResponse) + - [OnDeepLinkReceived](#onDeepLinkReceived) --- @@ -1338,3 +1339,27 @@ For iOS : the callback will return a JSON string from apples verifyReceipt API. --- +##### **`public static event EventHandler OnDeepLinkReceived`** + + The callback for Unified Deeplink API.
+ + +*Example:* + +```c# + + // First call init with devKey, appId and gameObject + AppsFlyer.initSDK(devKey, appID, this); + + + AppsFlyer.OnDeepLinkReceived += (sender, args) => + { + var deepLinkEventArgs = args as DeepLinkEventsArgs; + + // DEEPLINK LOGIC HERE + }; + +``` + +--- + diff --git a/docs/UnifiedDeepLinking.md b/docs/UnifiedDeepLinking.md new file mode 100644 index 00000000..3a3aa4bc --- /dev/null +++ b/docs/UnifiedDeepLinking.md @@ -0,0 +1,83 @@ +## Unified Deep Linking + +Starting from v6.1.3, the new Unified Deep Linking API is available to handle deeplinking logic. + + +The flow works as follows: + +1. User clicks the OneLink short URL. +2. The iOS Universal Links/ Android App Links (for deep linking) or the deferred deep link, trigger the SDK. +3. The SDK triggers the didResolveDeepLink method, and passes the deep link result object to the user. +4. The OnDeepLinkReceived method uses the deep link result object that includes the deep_link_value and other parameters to create the personalized experience for the users, which is the main goal of OneLink. + +> Check out the Unified Deep Linking docs for [Android](https://dev.appsflyer.com/docs/android-unified-deep-linking) and [iOS](https://dev.appsflyer.com/docs/ios-unified-deep-linking). + +Considerations: + +* Requires AppsFlyer Android SDK V6.1.3 or later. +* Does not support SRN campaigns. +* Does not provide af_dp in the API response. +* onAppOpenAttribution will not be called. All code should migrate to `OnDeepLinkReceived`. +* OnDeepLinkReceived must be called **after** `initSDK`. +* AppsFlyer.cs **must** be attached to the game object. + +Implementation: + +1. Attach AppsFlyer.cs script to the game object with the AppsFlyer init code. (AppsFlyerObject) +2. After `initSDK()` implement `OnDeepLinkReceived`. + +Example: + +```c# +using AppsFlyerSDK; + +public class AppsFlyerObjectScript : MonoBehaviour +{ + void Start() + { + AppsFlyer.initSDK("devkey", "appID", this); + AppsFlyer.OnDeepLinkReceived += OnDeepLink; + AppsFlyer.startSDK(); + } + + void OnDeepLink(object sender, EventArgs args) + { + var deepLinkEventArgs = args as DeepLinkEventsArgs; + + // deeplink logic here + } +} + +``` + +Parsing deeplink object example: + +```c# + void OnDeepLink(object sender, EventArgs args) + { + var deepLinkEventArgs = args as DeepLinkEventsArgs; + + switch (deepLinkEventArgs.status) + { + case DeepLinkStatus.FOUND: + + if (deepLinkEventArgs.isDeferred()) + { + AppsFlyer.AFLog("OnDeepLink", "This is a deferred deep link"); + } + else + { + AppsFlyer.AFLog("OnDeepLink", "This is a direct deep link"); + } + + break; + case DeepLinkStatus.NOT_FOUND: + AppsFlyer.AFLog("OnDeepLink", "Deep link not found"); + break; + default: + AppsFlyer.AFLog("OnDeepLink", "Deep link error"); + break; + } + } +``` + diff --git a/strict-mode-sdk/appsflyer-unity-plugin-6.1.0-strict-mode.unitypackage b/strict-mode-sdk/appsflyer-unity-plugin-6.1.0-strict-mode.unitypackage deleted file mode 100644 index 88c9d55a..00000000 Binary files a/strict-mode-sdk/appsflyer-unity-plugin-6.1.0-strict-mode.unitypackage and /dev/null differ diff --git a/strict-mode-sdk/appsflyer-unity-plugin-strict-mode-6.1.3.unitypackage b/strict-mode-sdk/appsflyer-unity-plugin-strict-mode-6.1.3.unitypackage new file mode 100644 index 00000000..28fda14a Binary files /dev/null and b/strict-mode-sdk/appsflyer-unity-plugin-strict-mode-6.1.3.unitypackage differ