Skip to content

Commit 9a4454d

Browse files
Rjaintwiliorishabh-twilioMichaelGHSeg
authored
Deeplink not getting tracked. (#127)
* fix: deeplink not getting tracked on android. * fix: fixed deeplink not getting tracked on ios. * fix: removed unnecessary checks * Adjusting referring application to match documentation --------- Co-authored-by: Rishabh Jain <risjain@twilio.com> Co-authored-by: Michael Grosse Huelsewiesche <mihuelsewiesche@twilio.com>
1 parent 3f56e3e commit 9a4454d

File tree

4 files changed

+62
-22
lines changed

4 files changed

+62
-22
lines changed

packages/core/android/src/main/kotlin/com/segment/analytics/AnalyticsPlugin.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ import java.util.*
3131
val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L)
3232

3333
/** AnalyticsPlugin */
34-
class AnalyticsPlugin : FlutterPlugin, NativeContextApi, EventChannel.StreamHandler, ActivityAware,
34+
class AnalyticsPlugin : FlutterPlugin, NativeContextApi, EventChannel.StreamHandler, ActivityAware,
3535
PluginRegistry.NewIntentListener {
3636
private var context: Context? = null
37-
37+
private val pendingDeeplinkEventsQueue: Queue<Intent> = LinkedList()
3838
private fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }
3939

4040
private val eventsChannel = "analytics/deep_link_events"
@@ -182,13 +182,13 @@ class AnalyticsPlugin : FlutterPlugin, NativeContextApi, EventChannel.StreamHand
182182
private fun createChangeReceiver(events: EventSink): BroadcastReceiver {
183183
return object : BroadcastReceiver() {
184184
override fun onReceive(context: Context?, intent: Intent) {
185-
val referringApplication = intent.getStringExtra("referringApplication")
185+
val referringApplication = intent.getStringExtra("referring_application")
186186
// NOTE: assuming intent.getAction() is Intent.ACTION_VIEW
187187
val dataString: String? = intent.dataString
188188
if (dataString == null) {
189189
events.error("UNAVAILABLE", "Link unavailable", null)
190190
} else {
191-
val data = mapOf("url" to dataString, "referringApplication" to referringApplication)
191+
val data = mapOf("url" to dataString, "referring_application" to referringApplication)
192192
events.success(data)
193193
}
194194
}
@@ -198,13 +198,30 @@ class AnalyticsPlugin : FlutterPlugin, NativeContextApi, EventChannel.StreamHand
198198
private fun handleIntent(context: Context, intent: Intent) {
199199
val action = intent.action
200200
if (Intent.ACTION_VIEW == action) {
201-
if (changeReceiver != null) changeReceiver!!.onReceive(context, intent)
201+
if (changeReceiver != null) {
202+
changeReceiver!!.onReceive(context, intent)
203+
} else {
204+
pendingDeeplinkEventsQueue.add(intent.cloneFilter())
205+
}
206+
}
207+
}
208+
209+
private fun processPendingDeeplinkEventsQueue() {
210+
if (this.context == null ||
211+
changeReceiver == null
212+
) {
213+
return
214+
}
215+
while (pendingDeeplinkEventsQueue.isNotEmpty()) {
216+
val intent = pendingDeeplinkEventsQueue.poll()
217+
changeReceiver!!.onReceive(context, intent)
202218
}
203219
}
204220

205221
override fun onListen(arguments: Any?, events: EventSink?) {
206222
if (events != null) {
207223
this.changeReceiver = createChangeReceiver(events)
224+
processPendingDeeplinkEventsQueue()
208225
}
209226
}
210227

@@ -216,7 +233,10 @@ class AnalyticsPlugin : FlutterPlugin, NativeContextApi, EventChannel.StreamHand
216233
binding.addOnNewIntentListener(this)
217234
if (this.context != null) {
218235
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
219-
binding.activity.intent.putExtra("referringApplication", binding.activity.referrer.toString())
236+
binding.activity.intent.putExtra(
237+
"referring_application",
238+
binding.activity.referrer.toString()
239+
)
220240
}
221241
this.handleIntent(this.context!!, binding.activity.intent)
222242
}

packages/core/ios/Classes/AnalyticsPlugin.swift

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import UIKit
33
import Foundation
44

55
public class AnalyticsPlugin: NSObject, FlutterPlugin, NativeContextApi, FlutterStreamHandler, FlutterApplicationLifeCycleDelegate {
6+
private var pendingDeeplinkEventsQueue:[[String:String?]] = []
67
public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
78
_eventSink = events
9+
processPendingDeeplinkEventsQueue();
810
return nil
911
}
1012

@@ -14,19 +16,27 @@ public class AnalyticsPlugin: NSObject, FlutterPlugin, NativeContextApi, Flutter
1416
}
1517

1618
var _eventSink:FlutterEventSink?;
17-
public func application(_ application: UIApplication, open url: URL, sourceApplication: String, annotation: Any) -> Bool {
19+
public func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool{
20+
let sourceApplication = options[.sourceApplication] as? String;
1821
if (_eventSink != nil) {
19-
_eventSink?(["url": url.absoluteString, "referringApplication": sourceApplication])
22+
_eventSink?(["url": url.absoluteString, "referring_application": sourceApplication])
23+
}else{
24+
pendingDeeplinkEventsQueue.append(["url": url.absoluteString, "referring_application": sourceApplication]);
2025
}
21-
return true
26+
27+
28+
return false
2229
}
23-
public func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
24-
if (_eventSink != nil) {
25-
_eventSink?([url: url.absoluteString])
30+
31+
private func processPendingDeeplinkEventsQueue() -> Void{
32+
if(_eventSink == nil){
33+
return;
34+
}
35+
while(!pendingDeeplinkEventsQueue.isEmpty){
36+
let eventData:[String:String?] = pendingDeeplinkEventsQueue.removeFirst();
37+
_eventSink?(eventData);
2638
}
27-
return true
2839
}
29-
3040
internal static var device = VendorSystem.current
3141

3242
func getContext(collectDeviceId: Bool, completion: @escaping (Result<NativeContext, Error>) -> Void) {
@@ -88,10 +98,12 @@ public class AnalyticsPlugin: NSObject, FlutterPlugin, NativeContextApi, Flutter
8898

8999
public static func register(with registrar: FlutterPluginRegistrar) {
90100
let messenger : FlutterBinaryMessenger = registrar.messenger()
91-
let api : NativeContextApi & NSObjectProtocol & AnalyticsPlugin = AnalyticsPlugin.init()
101+
let plugin = AnalyticsPlugin.init();
102+
let api : NativeContextApi & NSObjectProtocol & AnalyticsPlugin = plugin
92103
NativeContextApiSetup.setUp(binaryMessenger: messenger, api: api)
93104

94105
let channel:FlutterEventChannel = FlutterEventChannel(name: "analytics/deep_link_events", binaryMessenger: registrar.messenger())
95106
channel.setStreamHandler(api)
107+
registrar.addApplicationDelegate(plugin)
96108
}
97109
}

packages/core/lib/state.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ class DeepLinkDataState extends PersistedState<DeepLinkData> {
360360

361361
@JsonSerializable(explicitToJson: true, includeIfNull: false)
362362
class DeepLinkData {
363-
final String referringApplication;
363+
final String? referringApplication;
364364
final String url;
365365

366366
DeepLinkData(this.referringApplication, this.url);

packages/core/lib/state.g.dart

Lines changed: 14 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)