Programmatically calling siri shortcut from app - ios

I'm currently planning an iOS app that makes use of NFC tags and iOS shortcuts. Idea is that once a NFC tag has been scanned, a shortcut is triggered that executes certain commands and then opens the app. That part shouldn't be an issue, since as far as I understand, one can write the shortcut name into the NFC tag and iOS will then run the shortcut (at least with the newest iPhones).
Once I remove the phone from then NFC tag another shortcut should be executed (iPhone would rest on the sticker for a while and wont enter sleeping mode). Now this is where I'm not sure if that possible. I can detect when the NFC tag is out of reach/cant be read with my app (which is still open when the phone is removed from the NFC tag), but am I able to then call a shortcut once I register the NFC tag is out of reach?
So to sum up the question: can I programmatically call an iOS shortcut from my own app without the user pressing any button on the phone? If not, is it possible when the user presses a button in the app (without leaving the app or launching siri)

From what I have been able to figure out, the only way to programmatically trigger a Siri shortcut is using deeplinks. I followed this article to create an open a URL that runs a certain Siri shortcut. The 2 caveats are that the app opening the URL, your app, must be in the foreground, and the shortcuts app is opened.

Related

iOS App Intents: Dynamically open the app and bring it to the foreground

I'm using the App Intents API to provide an automation through the iOS Shortcuts app. When my intent runs, I'd like to be able to decide if I want to open the app (bring it to the foreground) or not. I know openAppWhenRun can be used to open the app, but its value cannot be modified.
I tried using openAppWhenRun, but it does not have a setter. Therefore, I cannot dynamically update this variable to determine if the app should be opened in the foreground or not.

Is there a way to check universal link registration from Safari?

iOS has a universal link capability (https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html).
However, it looks like there are couple of ways to "disassociate" a link from the application:
Press and hold on a link and choose "Open in Safari"
There was a tiny link in the top right corner of the app, which was shown right after opening universal link (it looks like it's gone in iOS 11).
As soon as you did one of these actions then universal link will be opened in Safari (until you reassociate it back to the app).
The issue is that if a user end up in this state, it's not clear what he/she should do. I want to provide an explanation on the web page which will be opened in Safari.
However, I want to distinguish two cases:
A link is clicked on a device without the app: Tell a user to download the app
A link is clicked on a device where the app is installed and it's disassociated. Tell a user how to associate it back.
Is there a way to check whether universal link is registered from a page opened in Safari?
Yes, you are correct that iOS 11 took away the upper-right hand corner button to re-enable universal links. They have kept the banner that shows up when you scroll the page up slightly.
This banner acts will also re-enable Universal Links for the user.
Unfortunately, there is no perfect solution to determining if a user has the app installed, but there are a few ways to attempt to deduce whether the user has the app installed already. Branch has ways of deducing whether the user has the app installed and attempting to open it with a URI scheme. You can read about the $uri_redirect_mode in the docs.
It would be very difficult to build this deducing method on your own and I'm not entirely sure how it's done, so I recommend using Branch's solution.

Switching between apps with URL Schemes (iOS)

I'm developing an iPhone app with Swift which acts on certain file types (.xml &.zip). I've added these filetypes to the project file as a UTI (Uniform Type Identifiers). When accessing these sorts of files, usually from my email, I press and hold the file and a menu pops up from below. I choose my app icon that says "Open in MyApp". Is there a way that I can return to the email which triggered this event from within the app?
I've done some research on this and found that URL Schemes are the best way for inter - app communication, but you cannot arbitrarily open an app just to open it.
https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/UTIRef/Introduction/Introduction.html
The vision I have in mind is sort of how Google apps communicate with each other. For example, when opening a link from gmail, it switches apps to chrome. When chrome loads, the page back navigator is in Chrome displays the text similar to "back to gmail"
In iOS 9 the system implements this automatically, as seen in this screenshot here.

Open Siri using private API's in iOS 8

I want to make an app that won't be released on the App Store. I want this app to open siri through private API's, basically inject a home button press and hold into the events queue. I have tried using GSEvent(GSSendEvent - Inject Touch Event iOS), but it no longer works(it silently fails) after iOS 7. I believe it is possible through SBUIController but I can't figure how to use SBUIController in iOS 8. To be clear, I want to do this on a non-jailbroken phone.
How can I go about doing this in iOS 8?
Thanks
You should check out the runtime headers of all the private/public apis here.
I found a method hidden in accessibility, which could possibly work in your case. Have a look at it here: http://git.io/frK6Sw . The method is named -(void)openSiri, which suggest that it might open Siri, I haven't tried though.

How iOS handle URL scheme duplication?

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

Resources