mirror of
https://github.com/status-im/react-native.git
synced 2025-02-04 21:53:30 +00:00
c9a1956c4f
Summary:
public
In 9baff8f437 (diff-8d9841e5b53fd6c9cf3a7f431827e319R331)
, I incorrectly assumed that iOS was wrapping promises in an extra Array. What was really happening is that all the callers were doing this. I removed the wrapping in the callers and the special case handling MessageQueue.
Now one can pass whatever object one wants to resolve and it will show properly in the resolve call on the js side. This fixes issue https://github.com/facebook/react-native/issues/5851
Reviewed By: nicklockwood
Differential Revision: D2921565
fb-gh-sync-id: 9f81e2a87f6a48e9197413b843e452db345a7ff9
shipit-source-id: 9f81e2a87f6a48e9197413b843e452db345a7ff9
103 lines
3.3 KiB
Objective-C
103 lines
3.3 KiB
Objective-C
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
#import "RCTLinkingManager.h"
|
|
|
|
#import "RCTBridge.h"
|
|
#import "RCTEventDispatcher.h"
|
|
#import "RCTUtils.h"
|
|
|
|
NSString *const RCTOpenURLNotification = @"RCTOpenURLNotification";
|
|
|
|
@implementation RCTLinkingManager
|
|
|
|
@synthesize bridge = _bridge;
|
|
|
|
RCT_EXPORT_MODULE()
|
|
|
|
- (void)setBridge:(RCTBridge *)bridge
|
|
{
|
|
_bridge = bridge;
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
selector:@selector(handleOpenURLNotification:)
|
|
name:RCTOpenURLNotification
|
|
object:nil];
|
|
}
|
|
|
|
- (NSDictionary<NSString *, id> *)constantsToExport
|
|
{
|
|
NSURL *initialURL = _bridge.launchOptions[UIApplicationLaunchOptionsURLKey];
|
|
return @{@"initialURL": RCTNullIfNil(initialURL.absoluteString)};
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
}
|
|
|
|
+ (BOOL)application:(UIApplication *)application
|
|
openURL:(NSURL *)URL
|
|
sourceApplication:(NSString *)sourceApplication
|
|
annotation:(id)annotation
|
|
{
|
|
NSDictionary<NSString *, id> *payload = @{@"url": URL.absoluteString};
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:RCTOpenURLNotification
|
|
object:self
|
|
userInfo:payload];
|
|
return YES;
|
|
}
|
|
|
|
+ (BOOL)application:(UIApplication *)application
|
|
continueUserActivity:(NSUserActivity *)userActivity
|
|
restorationHandler:(void (^)(NSArray *))restorationHandler
|
|
{
|
|
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
|
|
NSDictionary *payload = @{@"url": userActivity.webpageURL.absoluteString};
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:RCTOpenURLNotification
|
|
object:self
|
|
userInfo:payload];
|
|
}
|
|
return YES;
|
|
}
|
|
|
|
- (void)handleOpenURLNotification:(NSNotification *)notification
|
|
{
|
|
[_bridge.eventDispatcher sendDeviceEventWithName:@"openURL"
|
|
body:notification.userInfo];
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(openURL:(NSURL *)URL
|
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
reject:(__unused RCTPromiseRejectBlock)reject)
|
|
{
|
|
// TODO: we should really report success/failure via the promise here
|
|
// Doesn't really matter what thread we call this on since it exits the app
|
|
[RCTSharedApplication() openURL:URL];
|
|
resolve(@YES);
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(canOpenURL:(NSURL *)URL
|
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
reject:(__unused RCTPromiseRejectBlock)reject)
|
|
{
|
|
if (RCTRunningInAppExtension()) {
|
|
// Technically Today widgets can open urls, but supporting that would require
|
|
// a reference to the NSExtensionContext
|
|
resolve(@NO);
|
|
return;
|
|
}
|
|
|
|
// This can be expensive, so we deliberately don't call on main thread
|
|
BOOL canOpen = [RCTSharedApplication() canOpenURL:URL];
|
|
resolve(@(canOpen));
|
|
}
|
|
|
|
@end
|