1
1
use crate :: { Browser , BrowserOptions , Error , ErrorKind , Result , TargetType } ;
2
- use block2:: Block ;
3
- use objc2:: rc:: Id ;
4
- use objc2:: runtime:: Bool ;
5
- use objc2:: { class, msg_send, msg_send_id} ;
6
- use objc2_foundation:: { NSDictionary , NSObject , NSString , NSURL } ;
7
-
8
- fn app ( ) -> Option < Id < NSObject > > {
9
- unsafe { msg_send_id ! [ class!( UIApplication ) , sharedApplication] }
10
- }
11
-
12
- fn open_url (
13
- app : & NSObject ,
14
- url : & NSURL ,
15
- options : & NSDictionary ,
16
- handler : Option < & Block < dyn Fn ( Bool ) > > ,
17
- ) {
18
- unsafe { msg_send ! [ app, openURL: url, options: options, completionHandler: handler] }
19
- }
2
+ use objc2:: MainThreadMarker ;
3
+ use objc2_foundation:: { NSDictionary , NSString , NSURL } ;
4
+ use objc2_ui_kit:: UIApplication ;
20
5
21
6
/// Deal with opening of browsers on iOS/tvOS/visionOS.
22
7
///
@@ -34,10 +19,11 @@ pub(super) fn open_browser_internal(
34
19
return Ok ( ( ) ) ;
35
20
}
36
21
37
- let app = app ( ) . ok_or ( Error :: new (
22
+ let mtm = MainThreadMarker :: new ( ) . ok_or ( Error :: new (
38
23
ErrorKind :: Other ,
39
- "UIApplication is null, can't open url " ,
24
+ "UIApplication must be retrieved on main thread " ,
40
25
) ) ?;
26
+ let app = UIApplication :: sharedApplication ( mtm) ;
41
27
42
28
// Create ns string class from our string
43
29
let url_string = NSString :: from_str ( url) ;
@@ -50,6 +36,6 @@ pub(super) fn open_browser_internal(
50
36
let options = NSDictionary :: new ( ) ;
51
37
52
38
// Open url
53
- open_url ( & app , & url_object, & options, None ) ;
39
+ unsafe { app . openURL_options_completionHandler ( & url_object, & options, None ) } ;
54
40
Ok ( ( ) )
55
41
}
0 commit comments