美文网首页
React-Native 跳转iOS UIViewControl

React-Native 跳转iOS UIViewControl

作者: 米亚流年 | 来源:发表于2019-04-26 14:14 被阅读0次

OC

//
//  OpenNativeModule.m
//  OC桥文件
//
//  Created by 逗逗飞 on 2019/4/25.
//  Copyright © 2019 Facebook. All rights reserved.
//

#import "AppDelegate.h"
#import "AwesomeProject-Swift.h" // 如果是swift的viewController 则需要引入这个
#import <React/RCTBridgeModule.h>
#import <React/RCTLog.h>
@interface OpenNativeModule : NSObject<RCTBridgeModule>

@end


@implementation OpenNativeModule
RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(openNativeVC:(NSString *)name location:(NSString *)location date:(NSDate *)date) {
  
  RCTLogInfo(@"Pretending to create an event %@ at %@", name, location);
  
  dispatch_async(dispatch_get_main_queue(), ^{
    AppDelegate *delegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
    UIViewController *rootVC = delegate.window.rootViewController;
    UINavigationController *nav = [[UIStoryboard storyboardWithName:@"NativeStoryboard" bundle:nil] instantiateInitialViewController];
//    NativeViewController *nativeVC = [[NativeViewController alloc] init];
//    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:nativeVC];
    [rootVC presentViewController:nav animated:YES completion:nil];
  });
}
@end

Swift

React-native 调用

 import {NativeModules} from 'react-native';
 var nativeModule = NativeModules.OpenNativeModule;
 export default class ProfileScreen extends Component {
    nativeModule.openNativeVC('Birthday Party', '4 Privet Drive, Surrey');
}

Native-RN-Native

  • 1.修改Appledelegate.m
/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#import "AppDelegate.h"

#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>

#import <UserNotifications/UserNotifications.h>
//友盟推送
#import <UMCommon/UMCommon.h>
#import <UMPush/UMessage.h>
//RN事件监听
#import "EventEmitterManager.h"
//存储deviceToken
#import "AwesomeProject-Swift.h"
#import <React/RCTLinkingManager.h>

// 原生跳转RN


@interface AppDelegate () <UNUserNotificationCenterDelegate>
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  
  //rn 项目创建,默认的的
  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"AwesomeProject"
                                            initialProperties:nil];

  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];

  // 如果需要原生跳转rn的话 则需要改成这样
  
//  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//  OrgOneViewController *rootViewController =  [[OrgOneViewController alloc] init];
//  UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootViewController];
//  self.window.rootViewController = nav;
//  [self.window makeKeyWindow];
  
  
  //友盟推送设置
  [UMConfigure setEncryptEnabled:YES];
  [UMConfigure setLogEnabled:YES];
  [UMConfigure initWithAppkey:[NSString stringWithUTF8String:"5bebdb52b465f59b1500024a"] channel:@"App Store"];
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UMessageRegisterEntity * entity = [[UMessageRegisterEntity alloc] init];
  entity.types = UMessageAuthorizationOptionBadge |  UMessageAuthorizationOptionAlert | UMessageAuthorizationOptionSound;
  [UMessage registerForRemoteNotificationsWithLaunchOptions:launchOptions Entity:entity completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
      //用户选择了接受Push消息
    } else {
      //用户拒绝Push消息
    }
    
  }];
  [[UIApplication sharedApplication] registerForRemoteNotifications];
  return YES;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}




#pragma mark - 获取token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
  [UMessage registerDeviceToken:deviceToken];
  NSString *str = [[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""];
  str = [str stringByReplacingOccurrencesOfString:@">" withString:@""];
  str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
  //拿到DeviceToken,存储到用户偏好设置
  DeviceTokenManager *deviceTokenManager = [[DeviceTokenManager alloc] init];
  [deviceTokenManager saveDeviceTokenWithDevice_token:str];
}

//iOS10以下使用这两个方法接收通知
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
  [UMessage setAutoAlert:NO];
  if([[[UIDevice currentDevice] systemVersion]intValue] < 10){
    [UMessage didReceiveRemoteNotification:userInfo];
  }
  completionHandler(UIBackgroundFetchResultNewData);
}

#pragma mark - iOS10新增:处理前台收到通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
  NSDictionary * userInfo = notification.request.content.userInfo;
  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [UMessage setAutoAlert:NO];
    //应用处于前台时的远程推送接受
    EventEmitterManager * emitterManager = [[EventEmitterManager alloc] init];
    [emitterManager sendNoticeWithEventName:@"RemoteNotiUserInfo" Dict:userInfo];
    //必须加这句代码
    [UMessage didReceiveRemoteNotification:userInfo];
  }else{
    //应用处于前台时的本地推送接受
  }
  completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);
}

#pragma mark - iOS10新增:
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
  NSDictionary * userInfo = response.notification.request.content.userInfo;
  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    //应用处于后台时的远程推送接受
    EventEmitterManager * emitterManager = [[EventEmitterManager alloc] init];
    [emitterManager sendNoticeWithEventName:@"RemoteNotiUserInfo" Dict:userInfo];
    //必须加这句代码
    [UMessage didReceiveRemoteNotification:userInfo];
  }else{
    //应用处于后台时的本地推送接受
  }
}

#pragma mark - 微信支付、分享
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url  options:(NSDictionary<NSString*, id> *)options
{
  return [RCTLinkingManager application:application openURL:url options:options];
}
@end
//
//  OrgViewController.swift
//  AwesomeProject
//
//  Created by 逗逗飞 on 2019/4/25.
//  Copyright © 2019 Facebook. All rights reserved.
//

import UIKit

class OrgOneViewController: UIViewController {
  
  // ui Obj
  var btn : UIButton!
  
  
  override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = UIColor.yellow
    navigationItem.title = "原生控制器"
    btn = UIButton(frame: CGRect(x: 100, y: 100, width: 200, height: 80))
    btn.setTitle("跳到RN", for: UIControl.State.normal)
    btn.setTitleColor(UIColor.black, for: UIControl.State.normal)
    btn.backgroundColor = UIColor.white
    self.view.addSubview(btn)
    btn.addTarget(self, action:#selector(btn_click), for: .touchUpInside)
  }
  
  
  @objc func btn_click()  {
    let rnViewController = RNOneViewController()
    self.navigationController!.pushViewController(rnViewController, animated: true)
  }
  
}

  • rn的视图控制器
 //
 //  RNOneViewController.swift
 //  RN控制器
 //
 //  Created by 逗逗飞 on 2019/4/25.
 //  Copyright © 2019 Facebook. All rights reserved.
 //

 import UIKit

 class RNOneViewController: UIViewController,RCTBridgeDelegate {
   
   
   override func viewDidLoad() {
     super.viewDidLoad()
     view.backgroundColor = UIColor.red
     let bridge = RCTBridge.init(delegate: self, launchOptions: nil)
     let rootView = RCTRootView(bridge: bridge, moduleName: "AwesomeProject", initialProperties: nil)!
     rootView.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
     self.view = rootView
   }
   
  // rNBridge
   func sourceURL(for bridge: RCTBridge!) -> URL! {
     #if DEBUG
        return RCTBundleURLProvider.sharedSettings()!.jsBundleURL(forBundleRoot: "index", fallbackResource: nil)
     #else
       return Bundle.main.url(forResource: "main", withExtension: "jsbundle")
     #endif
     
   }
   override func viewWillAppear(_ animated: Bool) {
     super.viewWillAppear(animated)
   }
   override func viewDidDisappear(_ animated: Bool) {
     super.viewDidDisappear(animated)
   }
 }

相关文章

网友评论

      本文标题:React-Native 跳转iOS UIViewControl

      本文链接:https://www.haomeiwen.com/subject/ififnqtx.html