2015-10-19 23 views
13

Buduję komponent Native React Native, który będzie korzystać z zestawu SDK Map Google do iOS do renderowania map w aplikacji React. Jest on tworzony jako statyczna struktura dotykowa Cocoa Touch, dzięki czemu mogę go używać w różnych projektach.Użyj modułu CocoaPods w komponencie Natywny niestandardowy interfejs użytkownika

Póki co ta struktura nie robi wiele, po prostu próbuję ją skompilować, zanim spróbuję zrobić z nią coś użytecznego. Mam Podfile który ładuje w Google Maps SDK i mam uruchomić komendę 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 

mam GoogleMapView.h i GoogleMapView.m pliki, które zrobi podnoszenia ciężkich w tym module. Na razie nie naprawdę dużo:

@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 

Wtedy mam GoogleMapViewManager.h i GoogleMapViewManager.m pliki, które zapewniają most reagować rodzime. Ponownie, to nie rób dużo teraz !:

#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 

Dodałem tę bibliotekę do mojego React Native projektu XCode jak tak - istnieją pewne pliki wymienione (czerwone nie jestem zbyt pewien, co mają na myśli):

Xcode File Tree

Dodałem także produkt z mojego statycznej biblioteki do listy Link Binary With Libraries w Build Phases odcinek głównej React projektu:

Build Phases

Jednak gdy próbuję skompilować projekt, mam pewne błędy, które powodują kompilacji niepowodzenie tak:

Build Failure

Jestem pewien, że zrobiłem coś nie tak podczas importowania pakietu SDK Google Maps przy użyciu CocoaPods. Nie mogłem postępować zgodnie z dokumentami i używać pliku .xcworkspace podczas importowania mojej biblioteki statycznej do aplikacji React, która prawdopodobnie jest zła, ale nie mogę wymyślić, jak uruchomić ją!

Aktualizacja:

mogę uzyskać kod do kompilacji, jeśli to projekt mapie przy użyciu pliku .xcworkspace, ale nie jestem w stanie uzyskać dostęp do plików binarnych lub włączyć je we wszelkich fazach, które ISN kompilacji „t przydatne:

Use .xcworspace file instead

Czy ktoś wie w jaki sposób mogę korzystać z Map Google na iOS SDK jak to w React Native aplikację?

+0

Nie wiem, jak używać CocoaPods w projekcie bibliotecznym, ale możesz uwzględnić te zajęcia związane z Mapami Google bezpośrednio w oryginalnym projekcie React (jeśli nie planujesz udostępnić biblioteki). –

+0

To właśnie musiałem powrócić do działania - powoduje to duży problem, jeśli trzeba zaktualizować wersję React, ponieważ komenda '# react-native upgrade' powoduje bałagan w projekcie XCode. – edcs

+0

Myślę, że najczystszym sposobem na zrobienie tego byłoby zainstalowanie systemu reagowania natywnego za pośrednictwem CocoaPods i dodanie zależności jako kolejnej podpórki. – Adamski

Odpowiedz

2

W przypadku, gdy masz React Native App projekt, nazwijmy to MyApp.xcodeproj, a ty w tym projekt biblioteki, GoogleMapView.xcodeproj, nie będzie w stanie wykorzystać CocoaPods w GoogleMapView prostu przeciągając go do MyApp.xcodeproj jak ty zrobiłem w tym przykładzie.

Jeśli chcesz użyć CocoaPods do wyciągnięcia kapsuły GoogleMaps, musisz wziąć udział w projekcie GoogleMapView RÓWNIEŻ za pomocą CocoaPods.

tak:

# MyApp/Podfile 

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

Ale zanim to zrobisz, musisz się upewnić, że projekt GoogleMapView/private CocoaPod jest prawidłowo skonfigurowany.

pierwsze, Podfile:

# MyApp/Libraries/GoogleMapView/Podfile 

pod 'GoogleMaps' 

Następnie Podspec. Ten plik oznacza projekt jako bibliotekę CocoaPods.

Możesz to wygenerować za pomocą pod spec create GoogleMapView.

Oto co ciebie musi wyglądać następująco:

# 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 

Kiedy te trzy pliki są na miejscu, będzie mógł ponownie użyć GoogleMapView pomocą CocoaPods!

Możesz nawet przesłać go do centralnego repozytorium CocoaPods, aby udostępniać je innym.

Mam nadzieję, że to pomoże. Daj mi znać, jeśli potrzebujesz wyjaśnienia.

+0

To wygląda świetnie - dzięki za odpowiedź. Zrobię wszystko, żeby zaimplementować to wszystko, gdy mam wolną minutę lub dwie :) – edcs

+0

Powodzenia! Daj mi znać jak idzie. :) –

+0

Może być anwser nie jest odpowiedni. Ponieważ w GoogleMapView będziemy używać reagowania natywnego.Ale w ramach tworzenia podań nie ma reakcji na natywną wersję. – shawnXiao