Security News
Bun 1.2 Released with 90% Node.js Compatibility and Built-in S3 Object Support
Bun 1.2 enhances its JavaScript runtime with 90% Node.js compatibility, built-in S3 and Postgres support, HTML Imports, and faster, cloud-first performance.
cordova-plugin-popup-bridge
Advanced tools
Cordova Plugin to integrate Braintree Popup Bridge (e.g. for PayPal popup)
PopupBridge is an iOS library that allows WKWebViews to open popup windows in an SFSafariViewController browser and send data back to the parent page in the WKWebView.
PopupBridge is also available for Android.
See the Frequently Asked Questions to learn more about PopupBridge. See Using PayPal in a WebView to use PopupBridge with PayPal.
PopupBridge is available through CocoaPods. To install it, add the following line to your Podfile:
pod 'PopupBridge'
To integrate using Carthage, add github "braintree/popup-bridge-ios"
to your Cartfile
, and add the frameworks to your project.
To run the example app, clone the repo, open PopupBridge.xcworkspace
and run the PopupBridge-Example
app target.
Register a URL type for your app:
com.my-app.popupbridge
In your application delegate, set up PopupBridge with the URL scheme:
#import "POPPopupBridge.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[POPPopupBridge setReturnURLScheme:@"com.my-app.popupbridge"];
return YES;
}
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if ([url.scheme localizedCaseInsensitiveCompare:@"com.my-app.popupbridge"] == NSOrderedSame) {
return [POPPopupBridge openURL:url options:options];
}
return NO;
}
Integrate PopupBridge with the WKWebView:
#import "POPPopupBridge.h"
@interface MyViewController () <POPPopupBridgeDelegate>
@property (nonatomic, strong) WKWebView *webView;
@property (nonatomic, strong) POPPopupBridge *popupBridge;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:self.webView];
self.popupBridge = [[POPPopupBridge alloc] initWithWebView:self.webView delegate:self];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:3099/"]]];
}
- (void)popupBridge:(POPPopupBridge *)bridge requestsPresentationOfViewController:(UIViewController *)viewController {
[self presentViewController:viewController animated:YES completion:nil];
}
- (void)popupBridge:(POPPopupBridge *)bridge requestsDismissalOfViewController:(UIViewController *)viewController {
[viewController dismissViewControllerAnimated:YES completion:nil];
}
Use PopupBridge from the web page by writing some JavaScript:
var url = 'http://localhost:3099/';
if (window.popupBridge) {
// Open the popup in a browser, and give it the deep link back to the app
popupBridge.open(url + '?popupBridgeReturnUrlPrefix=' + popupBridge.getReturnUrlPrefix());
// Optional: define a callback to process results of interaction with the popup
popupBridge.onComplete = function (err, payload) {
if (err) {
console.error('PopupBridge onComplete Error:', err);
} else if (!err && !payload) {
console.log('User closed popup.');
} else {
alert('Your favorite color is ' + payload.queryItems.color);
}
};
} else {
var popup = window.open(url);
window.addEventListener('message', function (event) {
var color = JSON.parse(event.data).color;
if (color) {
popup.close();
alert('Your favorite color is ' + color);
}
});
}
Redirect back to the app inside of the popup:
<h1>What is your favorite color?</h1>
<a href="#red" data-color="red">Red</a>
<a href="#green" data-color="green">Green</a>
<a href="#blue" data-color="blue">Blue</a>
<script src="jquery.js"></script>
<script>
$('a').on('click', function (event) {
var color = $(this).data('color');
if (location.search.indexOf('popupBridgeReturnUrlPrefix') !== -1) {
var prefix = location.search.split('popupBridgeReturnUrlPrefix=')[1];
// Open the deep link back to the app, and send some data
location.href = prefix + '?color=' + color;
} else {
window.opener.postMessage(JSON.stringify({ color: color }), '*');
}
});
</script>
WKWebView can open popups through its WKUIDelegate
, which can be implemented to present the popup in a new WKWebView.
However, WKWebViews do not display an address bar or an HTTPS lock icon. If the popup receives sensitive user information (e.g. login credentials), users must implicitly trust that the web page is not redirecting them to a malicious spoofed page that may steal their information. PopupBridge solves this by using an SFSafariViewController.
window.popupBridge
) for the web page to interact with the iOS codewindow.popupBridge
; if so, it uses popupBridge.open
to open the popup URL
popupBridge.open
creates a SFSafariViewController to open the popup URL and has its delegate present the view controllerpopupBridge.onComplete
as a callbackThe deep link URL should match a deep link URL type in Xcode
The app delegate handles the deep link URL and forwards it to PopupBridge
One way to avoid hard-coding the deep link is by adding it as a query parameter to the popup URL:
popupBridge.open(url + '?popupBridgeReturnUrlPrefix=' + popupBridge.getReturnUrlPrefix());
popupBridge.onComplete
popupBridge.onComplete
gets called with the error and payload as null
and the delegate dismisses the view controllerWe are engineers who work on the Developer Experience team at Braintree.
Short answer: to accept PayPal as a payment option when mobile apps are using a WebView to power the checkout process.
PayPal authentication occurs in a popup window. However, this causes issues with Braintree merchants who use a web page to power payments within their apps: they can't accept PayPal because WebViews cannot open popups and return the PayPal payment authorization data to the parent checkout page.
PopupBridge solves this problem by allowing braintree-web
to open the PayPal popup from a secure mini-browser.
WebView-based checkout flows can accept PayPal with PopupBridge and the Braintree JS SDK.
WKWebView
pod 'Braintree/PayPalDataCollector'
Braintree, code@getbraintree.com
PopupBridge is available under the MIT license. See the LICENSE file for more info.
FAQs
Cordova Plugin to integrate Braintree Popup Bridge (e.g. for PayPal popup)
The npm package cordova-plugin-popup-bridge receives a total of 8 weekly downloads. As such, cordova-plugin-popup-bridge popularity was classified as not popular.
We found that cordova-plugin-popup-bridge demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Bun 1.2 enhances its JavaScript runtime with 90% Node.js compatibility, built-in S3 and Postgres support, HTML Imports, and faster, cloud-first performance.
Security News
Biden's executive order pushes for AI-driven cybersecurity, software supply chain transparency, and stronger protections for federal and open source systems.
Security News
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.