-
Notifications
You must be signed in to change notification settings - Fork 20
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
fix: universal links when touch a push notification open host app #265
Conversation
Pull request title looks good 👍! If this pull request gets merged, it will cause a new release of the software. Example: If this project's latest release version is All merged pull requests will eventually get deployed. But some types of pull requests will trigger a deployment (such as features and bug fixes) while some pull requests will wait to get deployed until a later time. To merge this pull request, add the label This project uses a special format for pull requests titles. Expand this section to learn more (expand by clicking the ᐅ symbol on the left side of this sentence)...This project uses a special format for pull requests titles. Don't worry, it's easy! This pull request title should be in this format:
If your pull request introduces breaking changes to the code, use this format:
where
Examples:
Need more examples? Want to learn more about this format? Check out the official docs. Note: If your pull request does multiple things such as adding a feature and makes changes to the CI server and fixes some bugs then you might want to consider splitting this pull request up into multiple smaller pull requests. |
Codecov Report
@@ Coverage Diff @@
## main #265 +/- ##
==========================================
- Coverage 52.98% 52.60% -0.39%
==========================================
Files 101 102 +1
Lines 1121 1131 +10
==========================================
+ Hits 594 595 +1
- Misses 527 536 +9
Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here. |
// sourcery: InjectRegister = "DeepLinkUtil" | ||
class DeepLinkUtilImpl: DeepLinkUtil { | ||
// When using `NSUserActivity.webpageURL`, only certain URL schemes are allowed. An exception will be thrown otherwise which is why we have this function. | ||
func isLinkValidNSUserActivityLink(_ url: URL) -> Bool { |
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.
maybe I don't understand the problem statement correctly, here for which i apologize.
But from what I understand,
// to ger a URL from string, the method that gets used is
URL(string: stringUrl)
and this already validates if it's a valid URL, that is it has the allowedSchemes
if let url = URL(string: stringUrl) {
print(url)
} else {
print("Invalid URL")
}
and the method, isLinkValidNSUserActivityLink
is expecting an URL as well, so wouldn't this be already vetted? otherwise, the URL would always be nil
?
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.
I wonder if a class or function rename would help better understand the problem.
This function's job is not to test if a URL is valid. The function's job is to verify that a URL is using only http
or https
for the scheme part of the URL string.
This is needed because MessagingPush+AppDelegate
file's code changes are using NSUserActivity.webpageURL
and an exception is thrown if a URL is using the wrong scheme.
Do the tests for this class help explain the use of this function?
Would a better comment help? Renaming of this function?
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.
Thanks, for the explanation, the fixed test removed the confusion.
A class renaming might help here because from my understanding there are two types of links, deeplink
and universal link
. And I was unsure where NSUserActivity
lies in all of this.
But i can't think of any other name either, so I am okay if you go with this or if you are able to think of another one.
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.
Deep links is an umbrella term. A deep link could be a universal link or an app scheme link.
So, it's not deep link or universal link as universal links are deep links. I did add more details to deep links docs in this pr might be helpful for you to read those changes.
### [2.0.5](2.0.4...2.0.5) (2023-02-10) ### Bug Fixes * universal links when touch a push notification open host app ([#265](#265)) ([7dcaf73](7dcaf73))
Would you mind elaborating on why this change might not work for SwiftUI apps? Also, I'm surprised to learn you don't officially support them. Is this mentioned anywhere in the docs? I can't find anything about this there. |
let openLinkInHostAppActivity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb) | ||
openLinkInHostAppActivity.webpageURL = deepLinkurl | ||
|
||
let didHostAppHandleLink = UIApplication.shared.delegate?.application?(UIApplication.shared, continue: openLinkInHostAppActivity, restorationHandler: { _ in }) ?? false |
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.
Do we really want to redefine didHostAppHandleLink
here? This means we're never changing the original didHostAppHandleLink
from line 74, so it'll always be false
when we check below on line 84. I believe we want to remove the let
here.
Universal links are still not working for us, and based on our tests this is the culprit.
To reply to your message, @tfcporciuncula. I can see how my original comment regarding this pull request and SwiftUI could trigger some questions. My original comment was poorly stated and was not accurate in regards to our SDK and it's features. We do not expect issues to be encountered when using a SwiftUI app with our SDK. If issues do arise, we are open to resolving them. If you or someone you know use SwiftUI with our SDK and have problems, please submit issues to us and we will help get those resolved! |
Cool, thanks for the clarification! So far we've had no other issues in our SwiftUI app. |
## [2.0.0](1.2.4...2.0.0) (2023-02-23) ### ⚠ BREAKING CHANGES * make delivered push metric more reliable * remove FCM dependency from cocoapods (customerio#210) * singleton API only way to use SDK now (customerio#209) ### Features * add in-app event listener ([customerio#211](https://github.com/nagyist/customerio-ios/issues/211)) ([737d43b](737d43b)) * in-app feature no longer requires orgId ([customerio#252](https://github.com/nagyist/customerio-ios/issues/252)) ([acd12da](acd12da)) ### Bug Fixes * access modifier for metric ([customerio#263](https://github.com/nagyist/customerio-ios/issues/263)) ([e641982](e641982)) * add sdkwrapperconfig to rich push SDK config ([customerio#226](https://github.com/nagyist/customerio-ios/issues/226)) ([e43b4cf](e43b4cf)) * added reusable code for wrapper SDKs ([customerio#247](https://github.com/nagyist/customerio-ios/issues/247)) ([36adf15](36adf15)) * async running BQ operations in loop ([customerio#250](https://github.com/nagyist/customerio-ios/issues/250)) ([f0a3d9c](f0a3d9c)) * device attributes shows sdk version instead of wrapper version ([e2462b9](e2462b9)) * do not modify custom attributes casing ([customerio#234](https://github.com/nagyist/customerio-ios/issues/234)) ([8160fdf](8160fdf)) * download rich push images from CDN ([customerio#237](https://github.com/nagyist/customerio-ios/issues/237)) ([b30cf02](b30cf02)) * fix compile time errors notification service extensions ([customerio#214](https://github.com/nagyist/customerio-ios/issues/214)) ([bd5911b](bd5911b)) * fix compile time errors notification service extensions ([customerio#216](https://github.com/nagyist/customerio-ios/issues/216)) ([6e8484a](6e8484a)) * in-app missing event ([customerio#259](https://github.com/nagyist/customerio-ios/issues/259)) ([43b3e97](43b3e97)) * make delivered push metric more reliable ([0478e52](0478e52)) * modify in-app event listener action parameters to new name ([customerio#255](https://github.com/nagyist/customerio-ios/issues/255)) ([b46528a](b46528a)) * prevent stackoverflow while executing background queue with lots of tasks in it ([customerio#245](https://github.com/nagyist/customerio-ios/issues/245)) ([ef0c428](ef0c428)) * push images and processing simple push ([customerio#230](https://github.com/nagyist/customerio-ios/issues/230)) ([f109f04](f109f04)) * region visibility modifier to be used by wrappers ([customerio#260](https://github.com/nagyist/customerio-ios/issues/260)) ([f0edfbc](f0edfbc)) * revert 2.0.2 as it was found unstable ([customerio#249](https://github.com/nagyist/customerio-ios/issues/249)) ([51b5831](51b5831)) * sdk not able to compile in ios app ([customerio#225](https://github.com/nagyist/customerio-ios/issues/225)) ([e4d1b3f](e4d1b3f)) * universal links deep links open host app ([customerio#268](https://github.com/nagyist/customerio-ios/issues/268)) ([29c95b5](29c95b5)) * universal links when touch a push notification open host app ([customerio#265](https://github.com/nagyist/customerio-ios/issues/265)) ([7dcaf73](7dcaf73)) * update the gist version in podspec ([customerio#256](https://github.com/nagyist/customerio-ios/issues/256)) ([5451488](5451488)) ### Code Refactoring * remove FCM dependency from cocoapods ([customerio#210](https://github.com/nagyist/customerio-ios/issues/210)) ([3547076](3547076)) * singleton API only way to use SDK now ([customerio#209](https://github.com/nagyist/customerio-ios/issues/209)) ([72b7477](72b7477))
Closes: #262
Before merging
Docs change helping customers setup universal links deep linking. Including the need to implement the function- docs pr madefunc application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
.This PR fixes this bug by:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
in their app to handle deep links (and they return the correct value from the function), we will attempt to call that function first.false
from the function, we fallback to opening the URL system-wide as the SDK does already today.This solution should keep backwards compatibility with the SDK customers today - as long as customers are using
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
correctly (returning an accurate value), this SDK should not be introducing a breaking change for anyone.QA tests:
remote-habits://switch_workspace?site_id=app&api_key=scheme
. Expect switch workspace screen shows with "app" and "scheme" filled into the text fields on the screen.This tests backwards compatibility of our SDK.
https://remotehabits.page.link/switch_workspace?site_id=universal&api_key=link
. Expect switch workspace screen shows with "universal" and "link" filled into the text fields on the screen.