2015-10-19 13 views
13

Sto costruendo un componente dell'interfaccia utente React Native che utilizzerà l'SDK iOS di Google Maps per eseguire il rendering delle mappe in un'applicazione React. Si sta costruendo come un Cocoa Touch Framework statico per poterlo utilizzare in diversi progetti.Utilizza il modulo CocoaPods in Componente utente UI personalizzato React

Finora questo framework non fa molto, sto solo cercando di farlo compilare prima di provare a fare qualcosa di utile con esso. Ho un Podfile che carica in Google Maps SDK e ho eseguire il comando 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 

ho GoogleMapView.h e GoogleMapView.m file che fare il lavoro pesante in questo modulo. Per ora in realtà non fare molto:

@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 

allora ho GoogleMapViewManager.h e GoogleMapViewManager.m file che forniscono il ponte di reagire nativa. Ancora una volta, questi non fanno molto in questo momento !:

#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 

ho aggiunto questa libreria alla mia Reagire progetto XCode Native in questo modo - ci sono alcuni file rosse quotate (io non sono troppo sicuro che cosa significano):?

Xcode File Tree

ho anche aggiunto prodotto dalla mia libreria statica alla lista Link Binary With Libraries nel 01.235.049,382 milasezione del progetto principale React:

Build Phases

Tuttavia, quando provo a compilare il progetto, ottengo alcuni errori che stanno causando l'accumulo di fallire in questo modo:

Build Failure

Sono sicuro di aver sbagliato qualcosa durante l'importazione dell'SDK di Google Maps utilizzando CocoaPods. Non ero in grado di seguire i documenti e utilizzare il file .xcworkspace quando si importa la mia libreria statica nell'app React che è probabilmente ciò che è sbagliato, ma non riesco a capire come farlo funzionare!

Aggiornamento:

posso ottenere il codice per compilare se includo il progetto mappa utilizzando il file .xcworkspace, ma poi non sono in grado di accedere ai file binari o inserire in eventuali fasi di creazione che isn 't utile:

Use .xcworspace file instead

qualcuno sa come potrei fare uso della Google Maps per iOS SDK come questo in un Reagire app nativa?

+0

Non so come usare CocoaPods in un progetto di libreria, ma potresti includere le classi correlate a Google Maps direttamente nel tuo progetto React originale (se non hai intenzione di condividere la libreria) –

+0

Questo è quello che ho dovuto tornare a fare - questo causa un grosso problema se è necessario aggiornare la versione di React poiché il comando '# react-native upgrade' fa un casino del progetto XCode. – edcs

+0

Penso che il modo più semplice per farlo sarebbe installare react-native tramite CocoaPods e aggiungere la tua dipendenza come un altro Pod. – Adamski

risposta

2

Nel caso in cui si dispone di un Reagire nativa App progetto, chiamiamolo MyApp.xcodeproj, e siete tra cui un progetto di libreria, GoogleMapView.xcodeproj, non sarà in grado di utilizzare CocoaPods in GoogleMapView semplicemente trascinando in MyApp.xcodeproj come si ho fatto in questo esempio.

Se si desidera utilizzare CocoaPods per inserire il Pod GoogleMaps, è necessario inserire il progetto GoogleMapView ANCHE utilizzando CocoaPods.

Come così:

# MyApp/Podfile 

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

Ma prima di farlo, è necessario fare in modo che il progetto GoogleMapView/CocoaPod privato sia configurato correttamente.

In primo luogo, il Podfile:

# MyApp/Libraries/GoogleMapView/Podfile 

pod 'GoogleMaps' 

Poi, il Podspec. Questo file è ciò che contraddistingue il progetto come libreria CocoaPods.

È possibile generare questo con pod spec create GoogleMapView.

Ecco cosa vostri bisogni per assomigliare:

# 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 

Una volta che questi tre file sono a posto, si sarà in grado di riutilizzare i vostri GoogleMapView utilizzando CocoaPods!

È anche possibile caricarlo nel repository centrale CocoaPods per la condivisione con altri.

Spero che questo aiuti. Fammi sapere se hai bisogno di chiarimenti.

+0

Questo sembra fantastico - grazie per la risposta. Avrò un tentativo di implementarlo tutto quando avrò un minuto o due di riserva :) – edcs

+0

Buona fortuna! Fammi sapere come va. :) –

+0

Potrebbe essere che il responsabile non ha ragione. Perché in GoogleMapView useremo react-native. Ma nello sviluppo del pod, non esiste un nativo reattivo. – shawnXiao

Problemi correlati