I have a couple of custom apps (masterapp and app2), both belonging to the same custom URL scheme. When I click a button on the masterapp, I want it to open app2.
I've noticed a weird pattern where by the master app only opens app2 if app2 was installed before the master app.
If I install the masterapp, then install app2 then click the button to open app2 it just doesn't do anything.
Can anyone explain this behaviour and what is going on? I've played around with URL schemes for days now but can't get this to work properly.
You can't do this.
The URI scheme need to be unique to each app. There have actually been a few instances where third-party apps attempt to hijack the private URI schemes of popular apps, and this is part of the reason Apple introduced Universal Links in iOS 9.
If you think it through logically, the behavior you are experiencing makes perfect sense: if two apps with the same URI scheme are installed, then the app you installed first is the one that will respond when that URI scheme is triggered.
Related
I have got a problem. There are two instances of app with different bundleID for dev and for prod. This apps can handle universal links. Problem is that where one apps trying to open link in safari, second (if they are both installed on the phone) app handles this link and open it by itself. So when one app wants to open safari another handles it and open itself. For example:
www.dev-domain.maindomain.com/id980 - dev link
www.prod-domain.maindomain.com/id980 - prod link
in project capabilities it's looks like applinks:*.maindomain.com
I was trying to applinks:dev-domain.maindomain.com or prod-domain.maindomain.com for different bundles but in this case handling universal links didn't works at all. AASA file located on www.maindomain.com/apple-app-site-association
How can I handle this situation, so prod app will handle only prod domain links and dev only dev?
Deeplinks working perfectly when using chrome iOS app. But in safari it stopped working and it always redirect to the appstore page even the app is installed or sometimes pop a alert saying "safari cannot open the page because the address is invalid". Everything works perfect few days back. so my guess is this happens after the ios 9.2 update. Any solution for this?
UPDATE
I have tried using a new phone(Which app not installed before) and installed the app.
Deep links works for both browsers (Safari and Chrome).
If you push the bnc.lt forward button it opens App Store for both Safari and Chrome.
Next time you open a link deep link:
Safari: It asks if you want to open the link in app store
Chrome: It asks if you want to open app and at the same time redirects to app store. If you click open in app next time you click a deep link it will open in app.
So in other words you can still open the app from Chrome after clicking the bnc.lt forward link in staus bar. This is because Chrome asks for opening the app and not app store.
For Safari i end up in an irreversible state where the deep link always open app store and not the app.
Alex from Branch here: this is the expected behavior. Unfortunately our fallback options are rather limited at the moment, due to the changes to Universal Links in iOS 9.2.
TL;DR: it's a bit of an edge case that most users wouldn't encounter, but you can easily work around it by making use of our Deepviews functionality.
Basically, here's the logic behind what you're seeing:
When you open the link on a device without the app installed, you end up on our bnc.lt server, and we redirect you to the App Store so you can get the app. This is good.
When you open the link on a device with the app installed for the first time, your device detects the Universal Link and opens the app immediately. All this happens locally on your device, and you never even get to our bnc.lt server. This is also good.
When you push the bnc.lt forward button, you're telling your device 'I don't want you to immediately open the app...show me the web content for this link instead'. In the case of a Branch link, this 'web content' is simply a redirect to the App Store. At this point, Branch has no way to know whether you the app is installed or not, so we have to assume it isn't and you get the same treatment as 1. above. This is not so good, but right now we don't have any better options due to the way Apple has designed the system.
The next time you open a link, your device remembers that you pushed the bnc.lt button in the past and just takes you straight to the web content. I'm not sure why Safari does it this way, because I can't imagine many situations where this would be desirable and it is leading to a lot of confusion for users.
The real problem here is that when you press bnc.lt to bypass the app, your device remembers this preference and executes it every time it sees a bnc.lt link in future. Chrome still 'works' because it is proactively confirming the preference each time in 4., whereas Safari just plows forward. There are a few options for what happens next:
In Apple's ideal world, you'd end up on a normal webpage where you could simply scroll up and use the Open in app button to reverse this preference. But since Branch is immediately redirecting you to the App Store, this isn't an option. You could consider using our Deepviews feature, since this does provide some real web content in place of the immediate App Store redirect you're seeing right now.
In most situations, you can still long-press on the link and select Open in app, but this doesn't help users who don't know the option is there.
In the worst-case scenario, you end up on the App Store page and just press the Open button (instead of Install). Thanks to Branch's magic, you'll still end up in the right place!
Now from iOS 9.2, Apple no longer supports URI schemes for deep
linking, developers must implement Universal Links in order to deep
link properly on iOS.
Universal links let you replace custom URL schemes with standard HTTP or HTTPS links. Universal links work for all users: If users have your app installed, the link takes them directly into your app; if they don’t have your app installed, the link opens your website in Safari.
To learn all about universal links, see
How to support Universal Links in iOS App and setup server for it?
Example
https://github.com/vineetchoudhary/iOS-Universal-Links
UPDATE [1]
How Branch links work (Branch.io)
If you take a lock at fundamentals of Branch's contextual deep links. You found Branch.io also using traditional deep-linking
1. Creating links
When you’ve integrated the Mobile SDK, you can create a Branch link every time a user clicks to share or invite another user from within your app. Your app makes a call to Branch.io, and Branch.io return a Branch link.
2. Tying data to links
3. Clicking links
4. Using data
Check the Clicking links step, Branch.io just map your website URL with your app URI scheme but URI schemeno longer supported by Safari. So, move to Universal Links is only the option in order to deep linking in iOS 9.2 or you can wait for some solution by Branch.io. Thanks.
Shouldn't we be able to use Universal Links into Amazon on iOS? They are hosting this file: https://www.amazon.com/apple-app-site-association and this blog post seem to be certain of it. However, if I make a link that follows one of their site-association rules, such as
http://www.amazon.com/gp/product/0062273205,
I keep getting directed to Safari instead of the app. I have never clicked Back to X from the Amazon app, so it can't be that cache that is messing with me.
Universal Links do work with the Amazon app on iOS. I tested the example (http://www.amazon.com/gp/product/0062273205) on iOS 9.2.1, and it opened the app as expected.
Have you have scrolled all the way to the top of the Amazon page? There should be a banner like this that will forward you to the app. If not, I suppose it's conceivable that your copy of the Amazon app didn't correctly register for Universal Links when first installed. You could try deleting it and reinstalling.
I know this is an old question, however I did post an answer that seems to work currently which might help someone:
I too had mixed results with universal links, it worked on some devices and not on others even though the Amazon app is installed.
In summary, what I did was:
Using https://www.appsight.io/app/amazon I was able to get the URL Scheme for the amazon app
I whitelisted that URL scheme in my info.Plist
I added some code to check if I can open the amazon app using the scheme otherwise I should fallback to using Universal links
Exact code I used is available on my answer here.
I am trying to detect if my ipad app is installed on a device when visiting my website, in order to suggest different action to the visitor.
Thanks to this post :
https://stackoverflow.com/a/8310348/1128754
I found that the "store" application on iphone seems to have achieve to detect if the app is installed on the device. When you click on store links, it launch the app instead of going to the mobile web version.
For example, if you go to :
http://store.apple.com/xc/anythinghere
with an iphone on which apple store app is installed ( http://itunes.apple.com/app/id375380948 )
it automatically start the store app, instead of the web page.
I tried to follow the stack call with mitmproxy but safari doesn't seems to ask query before launching the app.
So, I guess they did custom url scheme recognition, with http:// links.
Do you think it is possible?
This is done with URL protocol handlers:
http://www.iphonedevfaq.com/index.php?title=URL_schemes#URL_Protocol_Handlers
You cannot detect if an app is installed from HTML, but you can launch an app. For example, the popular game "Doodle Jump" can be launched by going to doodlejump://, but if you don't have it installed, the link won't work. As mentioned, this is done with a custom URL scheme and needs to be coded into your app.
If 2 other app register same url scheme, how iOS handle this?
The iOS Documentation reads:
Note: If more than one third-party app registers to handle the same URL scheme, there is currently no process for determining which app will be given that scheme.
The OSs behaviour is undefined if there are two apps registered for an URL scheme, therefore you should try to define a handler that is specific for your app to avoid this situation (e.g. awesomeMapsApp:// instead of maps://).
Actually it can be really problematic. For example, til' March 2016, an app called Grabb handles PayPal schemes so that if your app tries to open PayPal (with all the security nonce etc. within the call) it launches Grabb instead, and you can do nothing about it. Even with the openURL alertView added in iOS 9, it can still be a big security issue.
Here is what I have tested:
iOS 5: the first installed app will be chosen. If you delete first installed app, then the others will not launch unless you install again.
iOS 6: the lastest installed app will be chosen. If you delete the lastest installed app, then the previous installed app will be chosen.
It will present an UIActionSheet view allowing the user to choose which app to launch (good example are apps that handle .doc files). That's where the icon you specify is used - on the action sheet buttons when it's shown to the user