OneSignal / OneSignal-iOS-SDK

OneSignal is a free push notification service for mobile apps. This plugin makes it easy to integrate your native iOS app with OneSignal. https://onesignal.com
Other
493 stars 262 forks source link

[JWT] App startup #1473

Open nan-li opened 1 month ago

nan-li commented 1 month ago

Description

One Line Summary

Handles basic-level app startup for Identity Verification - on new install and minor migrations on upgrades.

Details

Internal JWT Config management and listeners

Request objects updated to consider JWT

What has been tested in this PR

What is not included in this PR

Motivation

Support Identity Verification

Testing

Unit testing

🚧 WIP

Manual Testing

How to Test:

  1. The Dev App is already pointing at staging with the bundle ID of com.onesignal.example.staging. Update the app ID to either 168... to test Identity Verification off, and 013... to test Identity Verification on. This is documented somewhere and please reach out for the keys and IDs.
  2. Use the "Get Tags" button on the Dev App to print information for testing
  3. Fill in an EID and token and use the Login button or Update button to login or update token.
New install - Identity Verification is off - no login is called 1. New install, see that no requests go through 2. Remote params returns and mock a response of "off" 3. Internal listeners fire and the anonymous user is created with the push subscription 4. Send tags works, update push sub works 5. Next cold start, Identity Verification is uncached, "off" is the starting state and things proceed as normal. No listeners fire.
New install - Identity Verification is ON - then login is called 1. New install, see that no requests go through 2. Remote params returns and mock a response of "on" 3. Internal listeners fire, no requests go through 4. Call login with a valid token 5. Create User is sent with the push subscription, and succeeds 6. Response is received and hydrated, send tags works 7. Fetch IAM and update push subscription **does not** work, it returns 401 8. Next cold start, Identity Verification is uncached, "on" is the starting state and things proceed as normal. No listeners fire. Fetch user by EID to hydrate works, session count is sent.
Upgrade from main - Identity Verification is ON 1. On `main`, turn off connection, do a new install and call: ```objc [OneSignal login:@"nanaug23a"]; [OneSignal.User addTagWithKey:@"from" value:@"main"]; [OneSignal.User addEmail:@"test@domain.com"]; ``` 2. See that no requests go through due to connection 3. Update app to this branch and open app 4. The operations are uncached but not requests go through due to unknown auth 5. Remote params returns and mock a response of "on" 6. Internal listeners fire, no requests go through due to missing JWT token 7. Call `[OneSignal updateUserJwt:@"nanaug23a" withToken:@"validToken"]` for the external ID that was logged into. 8. Create User is sent with the push subscription, the tags is sent and the create email is sent. They are successful.
Upgrade from player model - Identity Verification is ON This is the test process I did: 1. On `player-model-main`, do a new install and I did not set external ID. 2. The player is created. Check the player ID and push token in the dashboard. Kill app. 3. Update app to this branch and open app 4. The cached data is read but no user requests are made. Get IAM is automatically sent. 5. Remote params returns and mock a response of "on". The `OSRequestFetchIdentityBySubscription` that was previously generated is dropped. 6. Nothing happens. 7. Then login with a JWT but forget to include the push subscription ID 8. Create User is sent with the local push subscription read from cache (this was the player) and includes the player ID and push token, but receive a 401 due to missing push subscription ID in claims. 9. Update the jwt token with the subscription ID 10. Create User is re-sent successfully. Fetch user happens.

Affected code checklist

Checklist

Overview

Testing

Final pass


This change is Reviewable

nan-li commented 1 month ago

Updated: tested player model migration and seems to work as well.

nan-li commented 1 month ago

Badge tests still flaky: OneSignalNotificationsTests.testDontclearBadgesWhenAppBecomesActive()