2015-07-28 16 views
7

Tôi đang cố tạo một khung tùy chỉnh có tên là CouchbaseKit (mục tiêu mới trong Xcode) trong Swift. Bên trong số CouchbaseKit, tôi cần truy cập CouchBaseLite Framework hoàn toàn được viết bằng Obj-C. Tôi đang sử dụng Cocoapods để quản lý CouchBaseLite và một vài khung công tác khác. Dưới đây là podfile của tôi.iOS8: Khung Swift tùy chỉnh truy cập khung bên ngoài được viết trong Objective-C

Podfile

# Uncomment this line to define a global platform for your project 
link_with ['CouchbaseKit'] 
# platform :ios, '8.0' 

use_frameworks! 
target 'CouchbaseDB' do 
link_with ['CouchbaseKit'] 

pod 'couchbase-lite-ios' 
pod 'SwiftyJSON', '~> 2.2.0' 
pod 'Alamofire', '~> 1.2' 
pod 'XCGLogger', '~> 2.0' 
end 

target 'CouchbaseDBTests' do 
end 

target 'CouchbaseKit' do 
end 

target 'CouchbaseKitTests' do 
end 

Pods bên trong dự án:

enter image description here

Đối MỤC TIÊU tôi tôi có các thiết lập sau đây trong giai đoạn xây dựng.

Xác định Mô-đun

Allow Non-đun Bao gồm trong khung Modules

Vấn đề: Khi tôi cố gắng truy cập vào các khuôn khổ CouchbaseLite bên CouchbaseKit tôi (khung tùy chỉnh của tôi), Tôi gặp lỗi "Không có mô-đun như vậy 'CouchbaseLite' không tồn tại.

enter image description here

Cố gắng:

  1. Kể từ khi dự án là trong Swift, tôi tạo ra một Objective-C File và Hit yes để "Bạn có muốn cấu hình một tiêu đề Objective-C bắc cầu? "

  2. Mặc dù Allow Non-đun Bao gồm trong khung module được thiết lập để YES trong tất cả các mục tiêu, tôi vẫn nhận được một lỗi khi tôi cố gắng #import <CouchbaseLite/CouchbaseLite.h> trong CouchbaseKit.h enter image description here

Đây là những gì tôi xây dựng giai đoạn trông giống như cho khung tùy chỉnh của tôi CouchbaseKit

enter image description here

Câu hỏi: Làm thế nào tôi có thể thấy một khung Objective-C bên ngoài (CouchasebaseLite) trong khung Swift tùy chỉnh của tôi?

+0

Hãy thử xem [repo này] (https://github.com/couchbaselabs/Grocery-Sync-iOS/tree/swift) để xem bạn có thể nhận được bất kỳ manh mối nào từ nó không. – borrrden

Trả lời

2

Thật không may Cocoapods 0,39 bị từ "Thư viện động nhà cung cấp chuyển tiếp không được hỗ trợ" Bạn sẽ thấy điều này với bản phát hành couchbase-lite-ios mới nhất bao gồm tệp nhị phân CouchbaseLite.framework. Điều này không may vấn đề bit tôi rất khó khăn tôi đã phải refactor tất cả mọi thứ để sử dụng Carthage, và tự quản lý các khuôn khổ của tôi trong các dự án cuối cùng của tôi.

Phát biểu việc phát hành nhị phân CouchbaseLite.framework đơn giản là thiếu bản đồ mô-đun.

Thêm một đến: CouchbaseLite.framework/Modules/module.modulemap

framework module CouchbaseLite { 
    umbrella header "CouchbaseLite.h" 

    export * 
    module * { export * } 
} 

Sau đó bạn sẽ có thể bao gồm khuôn khổ này trở thành một header bắc cầu, và có tổ khung động của bạn đúng cách. Nhưng bạn có thể cần phải chuyển sang xây dựng CouchbaseKit.framework của bạn để sử dụng Carthage như tôi đã làm.

+0

@ Jens-Alfke Tôi nhận thấy bạn đề cập đến nó có sẵn theo mặc định trong không gian tên toàn cầu nhanh trong các bình luận khác, tuy nhiên tôi thấy nó không xuất hiện ở đó, thay vào đó tôi phải thêm nó vào tiêu đề bắc cầu và do thiếu modulemap bạn nhận được Lỗi "Không có mô-đun như vậy". Đây là phiên bản Xcode 7.1 beta 4, vì vậy có thể trên các bản phát hành Xcode trước đó, bạn có thể chính xác. – otri

+0

@orti Carthage hoạt động như thế nào cho bạn? Có phải là "Tôi sẽ không bao giờ quay trở lại cocoapod một lần nữa" tốt? – Mazyod

+2

Carthage phục vụ một mục đích tốt, nhưng ngay bây giờ (ngày 7 tháng 11 năm 2015) có rất nhiều xung đột trong không gian phát triển xung quanh Xcode 7 và các khuôn khổ chuyển từ lib tĩnh sang tất cả năng động. Vì vậy, một nửa thời gian một phụ thuộc chỉ không hoạt động. Xcode 7 đang thiết lập một tiêu chuẩn mới và cuối cùng chúng ta sẽ áp dụng các khung động. Giá trị của Carthage là kết hợp chặt chẽ các phụ thuộc một cách nhanh chóng và giữ cho chúng được cập nhật. Cocoapods làm một công việc tổng thể tốt hơn cho PMNM nhưng tồi tệ hơn cho việc triển khai mã trong một dự án máy khách với các phụ thuộc mã riêng. – otri

4

CouchbaseLite trên iOS là một khung tĩnh, tức là nhị phân của nó là một thư viện tĩnh không phải là dylib. Điều này có nghĩa là nó được liên kết với ứng dụng của bạn như thể đó là một tệp nguồn. Vì lý do này, bạn không sử dụng import trong Swift để truy cập nó; các lớp đã có trong cùng một không gian tên như các lớp ứng dụng của bạn.

0

Nếu bạn vẫn muốn sử dụng Cocoapods bạn có thể làm theo this

bước:

  • Tạo một thư mục có tên là tên của khung của bạn, bạn muốn sử dụng trong trường hợp đó CouchbaseLite và bên trong nó tạo ra mô-đun bản đồ. Tên tập tin sẽ được module.map và nội dung của nó sẽ

mô-đun CouchbaseLite { tiêu đề "../Pods/couchbase-lite-ios/CouchbaseLite.framework/Headers/CouchbaseLite.h" xuất khẩu * }

Important Note: Don't add that folder to the project, I don't know why not when done it will not work.

  • Nhập đường dẫn trong trình biên dịch Swift - Đường dẫn tìm kiếm trong cài đặt dự án của bạn. Sử dụng $ {SRCROOT} trong đường dẫn mô-đun (ví dụ: $ {SRCROOT}/CouchbaseLite) .

  • Sau đó, bạn có thể nhập nó giống như bất kỳ mô-đun nhanh nào.

Cập nhật: Nó sẽ làm việc độc đáo trong Xcode, nhưng khi tôi đã cố gắng để xác nhận các pod với pod lint nó vẫn cung cấp cho lỗi và tôi vẫn không biết tại sao.

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