在React Native Custom UI Component

时间:2015-10-19 13:07:48

标签: objective-c xcode google-maps cocoapods react-native

我正在构建一个React Native UI组件,该组件将使用Google Maps iOS SDK在React应用中呈现地图。这是作为静态Cocoa Touch Framework构建的,因此我可以在不同的项目中使用它。

到目前为止,这个框架并没有做太多,我只是想在我尝试做任何有用的事情之前让它进行编译。我有一个Podfile加载到Google Maps SDK中,我运行pod install命令:

# Uncomment this line to define a global platform for your project
platform :ios, '8.1'
# Uncomment this line if you're using Swift
# use_frameworks!

target 'GoogleMapView' do
    source 'https://github.com/CocoaPods/Specs.git'
    pod 'GoogleMaps'
end

我有GoogleMapView.hGoogleMapView.m个文件,这些文件将在此模块中完成。现在他们并没有做太多的事情:

@import GoogleMaps;

@interface GoogleMapView: GMSMapView

@end

-

#import "GoogleMapView.h"

@implementation GoogleMapView {
    GMSMapView *mapView_;
}

- (void)viewDidLoad {
    // Create a GMSCameraPosition that tells the map to display the
    // coordinate -33.86,151.20 at zoom level 6.
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86
                                                            longitude:151.20
                                                                 zoom:6];
    mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
    mapView_.myLocationEnabled = YES;
    self.view = mapView_;

    // Creates a marker in the center of the map.
    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(-33.86, 151.20);
    marker.title = @"Sydney";
    marker.snippet = @"Australia";
    marker.map = mapView_;
}

@end

然后我有GoogleMapViewManager.hGoogleMapViewManager.m个文件,这些文件为React Native提供了桥梁。同样,这些现在做不了多少!:

#import "RCTViewManager.h"

@interface GoogleMapViewManager : RCTViewManager

@end

-

#import "GoogleMapView.h"
#import "GoogleMapViewManager.h"

@implementation GoogleMapViewManager

RCT_EXPORT_MODULE()

- (UIView *)view
{
    GoogleMapView *map = [[GoogleMapView alloc] init];

    return map;
}

@end

我已经将这个库添加到我的React Native XCode项目中了 - 列出了一些红色文件(我不太清楚它们是什么意思?):

Xcode File Tree

我还将静态库中的产品添加到主要React项目的Link Binary With Libraries部分的Build Phases列表中:

Build Phases

然而,当我尝试编译项目时,我得到一些错误导致构建失败,如下所示:

Build Failure

我确信在使用CocoaPods导入Google Maps SDK时我做错了。在将我的静态库导入React应用程序时,我无法关注文档并使用.xcworkspace文件,这可能是错误的,但我无法弄清楚如何让它运行!

更新

如果我使用.xcworkspace文件包含map项目,我可以获得编译代码,但是我无法访问二进制文件或将它们包含在任何无用的构建阶段:< / p>

Use .xcworspace file instead

有人知道如何在React Native应用中使用这样的Google Maps iOS SDK吗?

1 个答案:

答案 0 :(得分:2)

如果您有React Native App项目,请将其称为MyApp.xcodeproj,并且您要包含一个图书馆项目GoogleMapView.xcodeproj,您将无法使用在GoogleMapView中使用CocoaPods,只需将其拖放到MyApp.xcodeproj中,就像在此示例中所做的那样。

如果你想使用CocoaPods引入GoogleMaps Pod,你必须使用CocoaPods拉入你的GoogleMapView项目。

像这样:

# MyApp/Podfile

pod 'GoogleMapView', :path => 'Libraries/GoogleMapView'

但在此之前,您需要确保正确配置GoogleMapView项目/私有CocoaPod。

首先,Podfile:

# MyApp/Libraries/GoogleMapView/Podfile

pod 'GoogleMaps'

然后,Podspec。此文件将项目标记为CocoaPods库。

您可以使用pod spec create GoogleMapView生成此内容。

以下是您的需求:

# MyApp/Libraries/GoogleMapView/GoogleMapView.podspec

    Pod::Spec.new do |s|

      s.name         = "GoogleMapView"
      s.version      = "0.0.1"
      s.summary      = "A short description of GoogleMapView."

      s.description  = <<-DESC
                       DESC

      s.homepage     = "http://EXAMPLE/GoogleMapView"
      s.license      = "MIT (example)"


      s.author             = { "David Young-Chan Kay" => "davidykay@gmail.com" }

      s.source       = { :git => "http://EXAMPLE/GoogleMapView.git", :tag => "0.0.1" }

      s.source_files  = "Classes", "Classes/**/*.{h,m}"
      s.exclude_files = "Classes/Exclude"

      # This is the key line. You must add it by hand.
      s.dependency 'GoogleMaps'

    end

一旦这三个文件到位,您就可以使用CocoaPods重新使用GoogleMapView了。

您甚至可以将其上传到中央CocoaPods存储库以与他人共享。

希望这会有所帮助。如果您需要澄清,请告诉我。