mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-03-26 07:04:05 +08:00
App Extension support
Summary: This adds workarounds for the code that was preventing React from compiling when linked against an iOS App Extension target. Some iOS APIs are unavailable to App Extensions, and Xcode's static analysis will catch attempts to use methods that have been flagged as unavailable. React currently uses two APIs that are off limits to extensions: `[UIApplication sharedApplication]` and `[UIAlertView initWith ...]`. This commit adds a helper function to `RCTUtils.[hm]` called `RCTRunningInAppExtension()`, which returns `YES` if, at runtime, it can be determined that we're running in an app extension (by checking whether the path to `[NSBundle mainBundle]` has the `"appex"` path extension). It also adds a `RCTSharedApplication()` function, which will return `nil` if running in an App Extension. If running in an App, `RCTSharedApplication()` calls `sharedApplication` by calling `performSelector:` on the `UIApplication` class. This passes the static analysis check, and, in my opinion, obeys the "spirit of th Closes https://github.com/facebook/react-native/pull/1895 Reviewed By: @svcscm Differential Revision: D2224128 Pulled By: @nicklockwood
This commit is contained in:
committed by
facebook-github-bot-5
parent
3f220f6b59
commit
2f9bd1f62f
@@ -122,7 +122,7 @@ RCT_EXPORT_MODULE()
|
||||
*/
|
||||
RCT_EXPORT_METHOD(setApplicationIconBadgeNumber:(NSInteger)number)
|
||||
{
|
||||
[UIApplication sharedApplication].applicationIconBadgeNumber = number;
|
||||
RCTSharedApplication().applicationIconBadgeNumber = number;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -131,12 +131,16 @@ RCT_EXPORT_METHOD(setApplicationIconBadgeNumber:(NSInteger)number)
|
||||
RCT_EXPORT_METHOD(getApplicationIconBadgeNumber:(RCTResponseSenderBlock)callback)
|
||||
{
|
||||
callback(@[
|
||||
@([UIApplication sharedApplication].applicationIconBadgeNumber)
|
||||
@(RCTSharedApplication().applicationIconBadgeNumber)
|
||||
]);
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(requestPermissions:(NSDictionary *)permissions)
|
||||
{
|
||||
if (RCTRunningInAppExtension()) {
|
||||
return;
|
||||
}
|
||||
|
||||
UIUserNotificationType types = UIUserNotificationTypeNone;
|
||||
if (permissions) {
|
||||
if ([permissions[@"alert"] boolValue]) {
|
||||
@@ -152,35 +156,37 @@ RCT_EXPORT_METHOD(requestPermissions:(NSDictionary *)permissions)
|
||||
types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
|
||||
}
|
||||
|
||||
UIApplication *app = RCTSharedApplication();
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
|
||||
|
||||
id notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
|
||||
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
|
||||
[[UIApplication sharedApplication] registerForRemoteNotifications];
|
||||
|
||||
[app registerUserNotificationSettings:notificationSettings];
|
||||
[app registerForRemoteNotifications];
|
||||
#else
|
||||
|
||||
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
|
||||
|
||||
[app registerForRemoteNotificationTypes:types];
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(abandonPermissions)
|
||||
{
|
||||
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
|
||||
[RCTSharedApplication() unregisterForRemoteNotifications];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(checkPermissions:(RCTResponseSenderBlock)callback)
|
||||
{
|
||||
if (RCTRunningInAppExtension()) {
|
||||
NSDictionary *permissions = @{@"alert": @(NO), @"badge": @(NO), @"sound": @(NO)};
|
||||
callback(@[permissions]);
|
||||
return;
|
||||
}
|
||||
|
||||
NSUInteger types = 0;
|
||||
if ([UIApplication instancesRespondToSelector:@selector(currentUserNotificationSettings)]) {
|
||||
types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
|
||||
types = [RCTSharedApplication() currentUserNotificationSettings].types;
|
||||
} else {
|
||||
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0
|
||||
|
||||
types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
|
||||
types = [RCTSharedApplication() enabledRemoteNotificationTypes];
|
||||
|
||||
#endif
|
||||
|
||||
@@ -203,13 +209,13 @@ RCT_EXPORT_METHOD(checkPermissions:(RCTResponseSenderBlock)callback)
|
||||
|
||||
RCT_EXPORT_METHOD(presentLocalNotification:(UILocalNotification *)notification)
|
||||
{
|
||||
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
|
||||
[RCTSharedApplication() presentLocalNotificationNow:notification];
|
||||
}
|
||||
|
||||
|
||||
RCT_EXPORT_METHOD(scheduleLocalNotification:(UILocalNotification *)notification)
|
||||
{
|
||||
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
|
||||
[RCTSharedApplication() scheduleLocalNotification:notification];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
Reference in New Issue
Block a user