2015-03-07 17 views
16

Tôi biết đã có một số câu hỏi về chủ đề này ở đây trên SO, nhưng rất ít người đã chấp nhận câu trả lời và tôi không nghĩ rằng tôi đã tìm thấy cùng một vấn đề như tôi.Xây dựng một Cocoapod với Swift và phụ thuộc vào khung Objective-C

Tôi đang tạo một nhóm Swift và trong mã của tôi, tôi dựa vào SDK iOS của Google Maps, được đóng gói dưới dạng tệp .framework. Dự án xây dựng OK trong Xcode, tuy nhiên tôi gặp khó khăn khi xuất bản lib lên Cocoapods.

Tôi đã quản lý tệp Podspec gần như xác thực bằng lệnh pod lib lint. Tuy nhiên, bây giờ mà tôi đã thêm Google-Maps-iOS-SDK pod như một sự phụ thuộc trong file Podspec, nó không thành công với thông báo sau:

$ pod lib lint

Mục tiêu 'Pods' có bắc cầu [!] phụ thuộc bao gồm tĩnh nhị phân: (/private/var/folders/n2/qyjfpk6n7zz_mngtwswlmsy00000gn/T/CocoaPods/Lint/Pods/Google-Maps-iOS-SDK/GoogleMaps.framework)

$

Điều này có được mong đợi không? Tại sao tôi không thể thêm SDK Google Maps iOS làm tài liệu tham khảo nhóm trong nhóm dựa trên Swift của riêng tôi?

Đây là Podspec:

Pod::Spec.new do |s| 
s.name     = '(name)' 
s.version    = '1.0.0' 
s.summary    = '(summary)' 
s.platforms    = { :ios => '8.0', :osx => '10.10' } 
s.ios.deployment_target = '8.0' 
s.osx.deployment_target = '10.10' 
s.license    = { :type => 'BSD', :file => 'LICENSE' } 
s.source_files   = 'Sources/*.{h,swift}', '*.framework' 
s.source    = { :git => "https://github.com/(Github repo).git", :tag => "1.0.0" } 
s.requires_arc   = true 
s.frameworks    = "Foundation", "CoreLocation" 
s.author    = { 'Romain L' => '(email)' } 
s.dependency 'Google-Maps-iOS-SDK' 
end 

Nếu tôi không bao gồm Google Maps iOS SDK như một sự phụ thuộc, sau đó pod lib lint thất bại trong Bridging Header, và than phiền nó không thể tìm thấy <GoogleMaps/GoogleMaps.h> (file không tìm thấy).

Tôi bị kẹt và tôi không biết đó có phải là lỗi từ Cocoapods 0.36 (vẫn đang trong giai đoạn Beta) hay không, nếu tôi đang làm gì đó sai.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

12

Cuối cùng tôi đã tìm thấy một chuỗi khác trên SO xử lý các sự cố tương tự: Linker errors in a Swift project with Google Maps for iOS added via CocoaPods.

Có vẻ như các lỗi này là do sự kết hợp của tệp Podspec không hợp lệ (trên bên iOS SDK của Google Maps) và các lỗi trong Cocoapods 0,36 Beta.

Có thể giải quyết sự cố bằng cách sử dụng tệp Podspec đã sửa đổi của @ fz. cho Google Maps: https://stackoverflow.com/a/28471830/145997. Một bài viết khác cũng rất quan tâm để hiểu cách thiết lập vendored_frameworks hoạt động trong Podspec là: http://codereaper.com/blog/2014/creating-a-pod-with-crashreporter/.

Vì vậy, để nhập khẩu một cách chính xác Google Maps iOS SDK trong một dự án Pod, lần đầu tiên sử dụng sau đây Podfile:

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '8.0' 
# altered version of Google's Podspec 
pod 'Google-Maps-iOS-SDK', :podspec => "https://raw.githubusercontent.com/Reflejo/GoogleMapsPodspec/master/Google-Maps-iOS-SDK.podspec.json" 
use_frameworks! # don't forget this! 

Tôi bây giờ có thể tham khảo lớp học trên Google Maps từ mã Swift của tôi chỉ đơn giản bằng cách làm import GoogleMaps .Và, để phân phối Pod, tôi thức Podspec nay tương tự như sau:

Pod::Spec.new do |s| 
    s.name     = 'MyPod' 
    s.version    = '1.0.0' 

    s.homepage    = "https://github.com/..." 
    s.summary    = '(pod summary)' 
    #s.screenshot   = "" 

    s.author    = { 'Romain L' => '(email)' } 
    s.license    = { :type => 'BSD', :file => 'LICENSE' } 
    s.social_media_url  = "https://twitter.com/_RomainL" 
    s.platforms    = { :ios => '8.0' } 
    s.ios.deployment_target = '8.0' 

    s.source_files   = 'MyCode/*.{h,swift}' 
    s.module_name   = 'MyPod' 
    s.source    = { :git => "https://github.com/....git", :tag => "1.0.0" } 
    s.requires_arc   = true 
    s.libraries    = "c++", "icucore", "z" # required for GoogleMaps.framework 
    s.frameworks   = "AVFoundation", "CoreData", "CoreLocation", "CoreText", "Foundation", "GLKit", "ImageIO", "OpenGLES", "QuartzCore", "SystemConfiguration", "GoogleMaps" # required for GoogleMaps.framework 
    s.vendored_frameworks = "Dependencies/GoogleMaps.framework" # Put the Google-provided framework in that subfolder of your Pod project 
    #s.dependency    'Google-Maps-iOS-SDK' # Careful! this will cause errors if enabled! 
end 

bây giờ tôi có thể bắt đầu một ứng dụng iOS mới trong Xcode và sử dụng như sau Podfile để liên kết chống lại pod của riêng tôi, bản thân tham khảo Google SDK iOS Maps:

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '8.0' 
pod 'MyPod' 
use_frameworks! # do not forget this! 

Không dễ dàng, nhưng khả thi sau tất cả! Tuy nhiên, hy vọng Google sẽ sớm cập nhật tệp Podspec của mình cho sự phát triển Swift.

+0

chúng tôi có thể thực hiện việc này với phân tích và sự phân tích của Google không? – Esqarrouth

+1

Điều này thật hoàn hảo. Nó đã giúp tôi có được Google-Mobile-Quảng cáo-SDK chạy trên 0.38.2 chỉ bằng cách tạo podspec kiểu tùy chỉnh đó. Cảm ơn, @Romain! – ArtSabintsev

+1

cảm ơn! đây là câu trả lời rất hữu ích. FYI: hiện tại, 'GoogleMaps 1.12.3' cần' Accelerate.framework'. –

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