I am trying to open specific view controller on widgets click , but can not able to open it , i am able to open app using url schema but i want to open specific view controller how can i do this, here is code for open app using url schema :
@IBAction func open_app(_ sender: Any)
{ extensionContext?.open(URL(string: "open://")! ,
completionHandler: nil)
}
on button click i am opeing app sucessfully using url schema. but now i want to open specific view controller on that click how can i do this?
Right-click the control or object in your current view controller. Drag the cursor to the view controller you want to present. Select the kind of segue you want from the list that Xcode provides.
The Widget Extension template provides a starting point for creating your widget. A single widget extension can contain multiple widgets. For example, a sports app might have one widget that displays team information, and another that displays game schedules. A single widget extension could contain both widgets.
According to your requirement, I have created a sample to get this working correctly.
1. First of all in TodayViewController
interface, create 3 different UIButtons
and give their tag
values to uniquely identify them.
Here I have given tags as: 1, 2, 3
to First, Second and Third
UIButton
.
2. Next you need to write the code to open your Containing App from Today Extension. In TodayViewController
create an @IBAction
for and connect it to all three UIButtons
.
@IBAction func openAppController(_ sender: UIButton)
{
if let url = URL(string: "open://\(sender.tag)")
{
self.extensionContext?.open(url, completionHandler: nil)
}
}
In the above code, tag will be added to the url scheme to identify which UIViewController
needs to be opened on UIButton
press. So the url will look something like: open://1
3. In the Containing App's URL Types
need to make an entry for URL Scheme
, i.e
As evident from the above screenshot, there is no need to make entry for each url that you want to open from your extensions. URLs
having same url scheme
have only a single entry.
4. When the containing app is opened from extension, you can get the handle in AppDelegate’s
application(_ : url: sourceApplication: annotation: )
method. Here, you can handle which controller to open i.e.
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
{
if url.scheme == "open"
{
switch url.host
{
case "1":
//Open First View Controller
case "2":
//Open Second View Controller
case "3":
//Open Third View Controller
default:
break
}
}
return true
}
url.scheme
identifies the scheme of URL
i.e. open
and url.host
identifies the host component in the URL
which is currently set to the UIButton's tag value
which you can use to uniquely identify which UIButton
is pressed and what to de next accordingly.
For more on Today Extensions, you can refer to: https://hackernoon.com/app-extensions-and-today-extensions-widget-in-ios-10-e2d9fd9957a8
Let me know if you still face any issues regarding this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With