Skip to content

Commit 8e01414

Browse files
authored
Merge pull request #641 from OneSignal/fix/iOSNotificationClicked
[Fix] iOS notifications clicked event on app open
2 parents 7ebbba0 + 868454d commit 8e01414

File tree

5 files changed

+25
-21
lines changed

5 files changed

+25
-21
lines changed

OneSignalExample/Assets/OneSignal/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
### Changed
99
- `InstallEdm4uStep` now imports version [1.2.177](https://github.com/googlesamples/unity-jar-resolver/releases/tag/v1.2.177) of [EDM4U](https://github.com/googlesamples/unity-jar-resolver)
1010
- Updated included Android SDK to [5.0.1](https://github.com/OneSignal/OneSignal-Android-SDK/releases/tag/5.0.1)
11+
- Updated included iOS SDK to [5.0.2](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/5.0.2)
1112
### Fixed
1213
- Sending VSAttribution data from the editor
14+
- iOS notifications clicked event firing if the app was cold started from clicking a notification
1315

1416
## [5.0.2]
1517
### Fixed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<dependencies>
22
<iosPods>
3-
<iosPod name="OneSignalXCFramework" version="5.0.1" addToAllTargets="true" />
3+
<iosPod name="OneSignalXCFramework" version="5.0.2" addToAllTargets="true" />
44
</iosPods>
55
</dependencies>

com.onesignal.unity.ios/Runtime/Plugins/iOS/OneSignalUnityBridgeNotifications.mm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ - (instancetype) init {
7070
if (self = [super init]) {
7171
[OneSignal.Notifications addPermissionObserver:self];
7272
[OneSignal.Notifications addForegroundLifecycleListener:self];
73-
[OneSignal.Notifications addClickListener:self];
7473

7574
_willDisplayEvents = [NSMutableDictionary new];
7675
}
@@ -161,5 +160,7 @@ void _notificationsDisplay(const char* notifcationId) {
161160

162161
void _notificationsSetClickCallback(ClickListenerDelegate callback) {
163162
[[OneSignalNotificationsObserver sharedNotificationsObserver] setClickDelegate:callback];
163+
164+
[OneSignal.Notifications addClickListener:[OneSignalNotificationsObserver sharedNotificationsObserver]];
164165
}
165166
}

com.onesignal.unity.ios/Runtime/Plugins/iOS/UIApplication+OneSignalUnity.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ - (void)setOneSignalUnityDelegate:(id <UIApplicationDelegate>)delegate {
9797
- (BOOL)oneSignalApplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
9898
[OneSignalWrapper setSdkType:@"unity"];
9999
[OneSignalWrapper setSdkVersion:@"050002"];
100-
[OneSignal setLaunchOptions:launchOptions];
100+
[OneSignal initialize:nil withLaunchOptions:launchOptions];
101101

102102
if ([self respondsToSelector:@selector(oneSignalApplication:didFinishLaunchingWithOptions:)])
103103
return [self oneSignalApplication:application didFinishLaunchingWithOptions:launchOptions];

com.onesignal.unity.ios/Runtime/iOSNotificationsManager.cs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,30 @@ internal sealed class iOSNotificationsManager : INotificationsManager {
4848
[DllImport("__Internal")] private static extern void _notificationsWillDisplayEventPreventDefault(string notificationId);
4949
[DllImport("__Internal")] private static extern void _notificationsSetClickCallback(ClickListenerDelegate callback);
5050

51-
public delegate void PermissionListenerDelegate(bool permission);
51+
private delegate void PermissionListenerDelegate(bool permission);
5252
private delegate void WillDisplayListenerDelegate(string notification);
5353
private delegate void ClickListenerDelegate(string notification, string resultActionId, string resultUrl);
5454
private delegate void BooleanResponseDelegate(int hashCode, bool response);
5555

5656
public event EventHandler<NotificationWillDisplayEventArgs> ForegroundWillDisplay;
57-
public event EventHandler<NotificationClickEventArgs> Clicked;
5857
public event EventHandler<NotificationPermissionChangedEventArgs> PermissionChanged;
5958

59+
// Only set the native listner once
60+
private bool _clickNativeListenerSet;
61+
62+
private EventHandler<NotificationClickEventArgs> _clicked;
63+
public event EventHandler<NotificationClickEventArgs> Clicked {
64+
add {
65+
_clicked += value;
66+
67+
if (!_clickNativeListenerSet) {
68+
_clickNativeListenerSet = true;
69+
_notificationsSetClickCallback(_onClicked);
70+
}
71+
}
72+
remove { _clicked -= value; }
73+
}
74+
6075
private static iOSNotificationsManager _instance;
6176

6277
public iOSNotificationsManager() {
@@ -88,7 +103,6 @@ public void ClearAllNotifications() {
88103
public void Initialize() {
89104
_notificationsAddPermissionObserver(_onPermissionStateChanged);
90105
_notificationsSetForegroundWillDisplayCallback(_onForegroundWillDisplay);
91-
_notificationsSetClickCallback(_onClicked);
92106
}
93107

94108
[AOT.MonoPInvokeCallback(typeof(PermissionListenerDelegate))]
@@ -133,23 +147,10 @@ private static void _onClicked(string notification, string resultActionId, strin
133147
_fillNotifFromObj(ref notif, Json.Deserialize(notification));
134148

135149
var result = new NotificationClickResult(resultActionId, resultUrl);
136-
137150
NotificationClickEventArgs args = new NotificationClickEventArgs(notif, result);
138151

139-
EventHandler<NotificationClickEventArgs> handler = _instance.Clicked;
140-
if (handler != null)
141-
{
142-
if (OneSignalPlatform.DidInitialize)
143-
UnityMainThreadDispatch.Post(state => handler(_instance, args));
144-
else {
145-
void invokeOpened(string appId) {
146-
OneSignalPlatform.OnInitialize -= invokeOpened;
147-
UnityMainThreadDispatch.Post(state => handler(_instance, args));
148-
}
149-
150-
OneSignalPlatform.OnInitialize += invokeOpened;
151-
}
152-
}
152+
EventHandler<NotificationClickEventArgs> handler = _instance._clicked;
153+
UnityMainThreadDispatch.Post(state => handler(_instance, args));
153154
}
154155

155156
private static void _fillNotifFromObj(ref iOSDisplayableNotification notif, object notifObj) {

0 commit comments

Comments
 (0)