2015-10-19 27 views
13

Tôi đang xây dựng thành phần Giao diện người dùng phản ứng gốc sẽ sử dụng SDK Google Maps iOS để hiển thị bản đồ trong ứng dụng React. Điều này đang được xây dựng như là một khung Cocoa Touch tĩnh để tôi có thể sử dụng nó trong các dự án khác nhau.Sử dụng Module CocoaPods trong Thành phần giao diện người dùng tùy chỉnh phản ứng gốc

Cho đến nay khung này không làm được gì nhiều, tôi chỉ đang cố gắng làm cho nó biên dịch trước khi tôi thử và làm bất cứ điều gì hữu ích với nó. Tôi có một Podfile mà tải trong Maps SDK của Google và tôi đã chạy lệnh 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 

Tôi có GoogleMapView.hGoogleMapView.m file mà sẽ làm việc nặng nhọc trong module này. Còn bây giờ họ không thực sự làm được gì nhiều:

@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 

Sau đó, tôi có GoogleMapViewManager.hGoogleMapViewManager.m file đó cung cấp các cây cầu để Phản ứng Native. Một lần nữa, những không làm được gì nhiều ngay bây giờ !:

#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 

Tôi đã thêm thư viện này vào dự án XCode Native Phản ứng của tôi như vậy - có một số file đỏ niêm yết (tôi không quá chắc chắn những gì họ có ý nghĩa):

Xcode File Tree

tôi cũng đã thêm các sản phẩm từ thư viện tĩnh của tôi vào danh sách Link Binary With Libraries trong Build Phases phần của dự án Phản ứng chính:

Build Phases

Tuy nhiên, khi tôi cố gắng để lập dự án, tôi nhận được một số lỗi mà đang gây ra xây dựng để thất bại như vậy:

Build Failure

Tôi chắc chắn rằng tôi đã làm điều gì đó sai khi nhập SDK Google Maps bằng cách sử dụng CocoaPods. Tôi không thể theo dõi tài liệu và sử dụng tệp .xcworkspace khi nhập thư viện tĩnh của tôi vào ứng dụng React, điều này có thể là sai, nhưng tôi không thể tìm ra cách để chạy nó!

Cập nhật:

Tôi có thể lấy mã để biên dịch nếu tôi bao gồm các dự án bản đồ bằng cách sử dụng tập tin .xcworkspace, nhưng sau đó tôi không thể truy cập vào mã nhị phân hoặc bao gồm chúng trong bất kỳ giai đoạn xây dựng mà isn 't hữu ích:

Use .xcworspace file instead

có ai biết làm thế nào tôi có thể tận dụng Google Maps iOS SDK như thế này trong một Phản ứng ứng dụng Native?

+0

Không chắc chắn cách sử dụng CocoaPod trong dự án thư viện, nhưng bạn có thể đưa các lớp liên quan đến Google Maps đó trực tiếp vào dự án React ban đầu của bạn (nếu bạn không có kế hoạch chia sẻ thư viện) –

+0

trở lại làm - điều này gây ra một vấn đề lớn nếu bạn cần cập nhật phiên bản React vì lệnh '# reac-native upgrade' tạo ra một mớ hỗn độn của dự án XCode. – edcs

+0

Tôi nghĩ rằng cách sạch nhất để làm điều đó sẽ là cài đặt phản ứng bản địa thông qua CocoaPods và thêm sự phụ thuộc của bạn như một Pod khác. – Adamski

Trả lời

2

Trong trường hợp bạn có một Phản ứng dự án ứng dụng Native, chúng ta hãy gọi nó MyApp.xcodeproj, và bạn đang trong đó có một dự án thư viện, GoogleMapView.xcodeproj, bạn sẽ không thể sử dụng CocoaPods trong GoogleMapView chỉ bằng cách kéo nó vào MyApp.xcodeproj như bạn đã làm trong ví dụ này.

Nếu bạn muốn sử dụng CocoaPods để kéo trong GoogleMaps Pod, bạn phải kéo trong dự án GoogleMapView C usingNG bằng cách sử dụng CocoaPods.

Giống như vậy:

# MyApp/Podfile 

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

Nhưng trước khi bạn làm điều đó, bạn sẽ cần phải chắc chắn rằng dự án GoogleMapView/tin CocoaPod được cấu hình đúng.

Thứ nhất, Podfile:

# MyApp/Libraries/GoogleMapView/Podfile 

pod 'GoogleMaps' 

Sau đó, Podspec. Tệp này là những gì đánh dấu dự án là thư viện CocoaPods.

Bạn có thể tạo điều này với pod spec create GoogleMapView.

Đây là những gì bạn cần để trông giống như:

# 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" => "[email protected]" } 

     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 

Khi ba file được đưa ra, bạn sẽ có thể tái sử dụng của bạn GoogleMapView sử dụng CocoaPods!

Bạn thậm chí có thể tải nó lên kho lưu trữ CocoaPods trung tâm để chia sẻ với người khác.

Hy vọng điều này sẽ hữu ích. Hãy cho tôi biết nếu bạn cần làm rõ.

+0

Điều này có vẻ tuyệt vời - cảm ơn câu trả lời. Tôi sẽ thực hiện tất cả khi tôi có một hoặc hai phút rảnh rỗi :) – edcs

+0

Chúc may mắn! Cho tôi biết làm thế nào nó đi. :) –

+0

Có thể anwser không đúng. Bởi vì trong GoogleMapView, chúng tôi sẽ sử dụng phản ứng-native.But trong phát triển pod, không có phản ứng bản địa. – shawnXiao

Các vấn đề liên quan