如果app中有推送功能,那么一般app的设置中都会有一个UISwitch开关来控制是否接收通知,或者用户可以选择关闭接收通知。一般来说集成推送SDK后第一次安装时会询问用户是否接收推送,如果此时用户选择了不接收,那么即使app内设置里的开关是打开的,用户一样收不到通知,所以这个Switch初始时的状态应该是根据用户是否授权接收通知,当用户同意接收通知时开关打开,以后怎么处理看用户选择,但是当用户选择了不接收通知时,那么开关应该是关闭的,且用户打开开关时该开关是无法打开的,此时要提示用户去【设置】-【通知】中开启权限之后才能打开。所以在进入设置界面的要判断用户是否授权了。通过原生判断桥接到react native,每次在设置页面的ComponentDidMount方法里判断即可
#import
#import
#import
@interface PermissionModule : NSObject
@end
#import "PermissionModule.h"
#import
@implementation PermissionModule
RCT_EXPORT_MODULE(PermissionModule)
RCT_EXPORT_METHOD(isAllowReceiveNotifiction:(RCTResponseSenderBlock)callback)
{
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >=10.0) { //iOS10以上包含iOS10
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined){
//未选择;
callback([[NSArray alloc] initWithObjects:@(0), nil]);
}else if (settings.authorizationStatus == UNAuthorizationStatusDenied){
//未授权;
callback([[NSArray alloc] initWithObjects:@(0), nil]);
}else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){
//已授权;
callback([[NSArray alloc] initWithObjects:@(1), nil]);
}
}];
}else if([[[UIDevice currentDevice] systemVersion] doubleValue] >=8.0 && [[[UIDevice currentDevice] systemVersion] doubleValue] <10.0){ // ios8-ios10
if ([[UIApplication sharedApplication] currentUserNotificationSettings].types == UIRemoteNotificationTypeNone) {
callback([[NSArray alloc] initWithObjects:@(0), nil]);
}else{
callback([[NSArray alloc] initWithObjects:@(1), nil]);
}
}
}
@end
如果没有给权限接收通知,则应该让用户跳转到app的设置界面,开启接收通知开关
方法1,可以直接在RN端打开(未亲测)
Linking.openURL('app-settings:')
.catch(err => console.log('error', err))
方法2:桥接(亲测可用),使用原生UIApplication的canOpenURL方法,怎么桥接见我桥接支付宝
RCT_EXPORT_METHOD(pushToCurrentAppSetting:(RCTResponseSenderBlock)callback)
{
dispatch_async(dispatch_get_main_queue(), ^{
NSURL *targetURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >=10.0) {
if([[UIApplication sharedApplication] canOpenURL:targetURL]){
[[UIApplication sharedApplication] openURL:targetURL options:@{} completionHandler:^(BOOL success) {
callback([[NSArray alloc] initWithObjects:@(1), nil]);
}];
}else{
callback([[NSArray alloc] initWithObjects:@(0), nil]);
}
}else{
if([[UIApplication sharedApplication] canOpenURL:targetURL]){
[[UIApplication sharedApplication] openURL:targetURL];
callback([[NSArray alloc] initWithObjects:@(1), nil]);
}else{
callback([[NSArray alloc] initWithObjects:@(0), nil]);
}
}
});
}