-
Notifications
You must be signed in to change notification settings - Fork 24.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
iOS: Clear Linking.getInitialURL
during bridge reload
#22659
Conversation
Generated by 🚫 dangerJS |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@cpojer has imported this pull request. If you are a Facebook employee, you can view this diff on Phabricator.
This makes sense to me. Thank you for submitting a pull request with a fix and providing an extensive test plan :) |
Ah, it seems like at FB we are using a warning about retaining references in blocks:
Do you mind fixing up your PR to remove this warning? Thank you! |
I will fix and resubmit soon. Thanks |
@cpojer I fixed the PR and tested locally against POC application. It doesn't show the warning now. Thanks in advance. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@cpojer has imported this pull request. If you are a Facebook employee, you can view this diff on Phabricator.
Alexander Nikiforov merged commit 19d04a3 into |
Summary: On iOS platform, RN retains launchOptions dictionary after bridge reload which can lead to unexpected consequences to a developer. The app will receive the same value for `Linking.getInitialURL` during initial launch and during bridge reload. Here's an example from our application. We use deeplinks via custom URL scheme so a user can open the app via link. Also, we reload the bridge when a user signs out. So if a user opens the app via URL, logs out, and a second user logs into the app, the app will behave as though the second user launched the app via the same deeplink. Because reload destroys the JS engine, there's nowhere for our app to remember that it already handled the deeplink activation. On iOS Linking.getInitialURL() gets URL from the _launchOptions dictionary, so by setting it to nil we prevent retention of initialURL after reload. This change makes iOS's behavior consistent with Android's. On Android, the launch URL is stored on the `Intent` and reloading the app involves creating a new `Intent`. Consequently, the launch URL is dropped as desired during the reload process. Pull Request resolved: facebook#22659 Differential Revision: D13564251 Pulled By: cpojer fbshipit-source-id: 4c6d81f1775eb3c41b100582436f1c0f1ee6dc36
On iOS platform, RN retains launchOptions dictionary after bridge reload which can lead to unexpected consequences to a developer. The app will receive the same value for
Linking.getInitialURL
during initial launch and during bridge reload. Here's an example from our application. We use deeplinks via custom URL scheme so a user can open the app via link. Also, we reload the bridge when a user signs out. So if a user opens the app via URL, logs out, and a second user logs into the app, the app will behave as though the second user launched the app via the same deeplink. Because reload destroys the JS engine, there's nowhere for our app to remember that it already handled the deeplink activation.On iOS Linking.getInitialURL() gets URL from the _launchOptions dictionary, so by setting it to nil we prevent retention of initialURL after reload.
This change makes iOS's behavior consistent with Android's. On Android, the launch URL is stored on the
Intent
and reloading the app involves creating a newIntent
. Consequently, the launch URL is dropped as desired during the reload process.Test plan:
I wrote a toy application to show the problem
https://github.com/venik/launchUrlExample/blob/fa8542b57b4331ee6be226db24048efe0d957b3e/App.js
Repro Steps
Unexpected result (i.e. before this fix): Alert dialog shows "url: mypoc://some_text"
Expected result (i.e. after this fix): Alert dialog shows "url: null"
Here's the code from my toy application which repros the bug:
Changelog:
[iOS] [Fixed] [RCTBridge] - Set _launchOptions to nil when app reloads and treat reload as a fresh start. Do not respect previous launchOptions, so Linking.getInitialURL() will return null after reload.