Дублирующее определение категории в приложении при использовании модульных заголовков, Objective-C и Swift в частном модуле - PullRequest
0 голосов
/ 16 октября 2018

С появлением Cocoapods v1.5, позволяющего статические библиотеки Swift, я пытался преобразовать свои личные модули (изначально только Objective-C) в Swift.Мне удалось это сделать, но у меня осталось предупреждение «Дублирующее определение категории» для всех категорий в модуле.Возможно, я делаю что-то довольно глупое, так как модульные заголовки являются новыми для меня.

У меня есть два частных модуля, один - общая библиотека для разработки, а другой - общая библиотека для тестов.Для краткости я удалил некоторые цели и ссылки на pod в подфайле ниже.

Я заметил, что количество предупреждений может увеличиваться или уменьшаться в зависимости от того, как я импортирую код из частного модуля в приложении.Традиционно я только что использовал: #import "Class.h".Теперь, когда я попытался использовать @import;, предупреждения увеличились.Однажды, когда я использовал #import, они пошли вниз.Но не каждый раз.

Если я использую #import вместо #import "SomeClass.h", появится еще 76 предупреждений.

Что я делаю не так?

ЧтоЯ обнаружил, что, если заголовочный файл категории упоминается только через файл .m, предупреждение исчезает.

source 'https://privatepod.url.com/git/my_podspec'
source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '9.0'

use_modular_headers!
inhibit_all_warnings!

def test_pods
  pod 'M13ProgressSuite', '~> 1.2',  :inhibit_warnings => true
  pod 'AimpTestKit', :path => '../aimptestkit',  :inhibit_warnings => false
  pod 'Quick', :inhibit_warnings => true
  pod 'Nimble',  :inhibit_warnings => true
end

def common_pods
    pod 'M13ProgressSuite', '~> 1.2',  :inhibit_warnings => true
    pod 'HockeySDK', :subspecs => ['AllFeaturesLib'],  :inhibit_warnings => true
    pod 'AimpKit', :path => '../aimpkit',  :inhibit_warnings => false
end


target ‘free_app’ do
    common_pods
    target 'free_app Tests' do
        inherit! :search_paths
        test_pods
    end

end

target ‘paid_app’ do
    common_pods
    target 'PaidAppTests' do
        inherit! :search_paths
        test_pods
    end
end


target 'LogicTests' do
    #no host app
    inherit! :search_paths
    common_pods
    test_pods
end

Это podspec для общей библиотеки (опять же, я удалил некоторые лишниедля краткости):

{
    "name": "AimpKit",
    "version": "3.0.1",
    "summary": "AimpKit library",
    "static_framework": true,
    "platforms": {
        "ios": "9.0"
    },
    "source": {
    "git": "https://privatepod.url.com/git/my_podspec",
    "branch": "master"
  },
    "source_files": "aimpkit/**/*.{h,m,swift}",
    "resources": "resources/**/*.{xib,xcassets,storyboard,bundle,png,mp4}",
    "requires_arc": [
       "aimpkit/arc/**/*.{h,m,swift}"
  ],
     "frameworks": [
        "CFNetwork", 
        "Foundation", 

    ],
    "dependencies": {

    "HockeySDK/AllFeaturesLib": [

    ],


  }


}

1 Ответ

0 голосов
/ 19 октября 2018

Ключ к исправлению этого состоял в том, чтобы в заголовках классов не было ссылки на заголовок категории.Таким образом, класс в своем файле .h не импортировал заголовок категории.Перемещение всех импортированных файлов заголовков категорий (большая работа) в .m каждого файла класса решило эту проблему.

Также возникла проблема с тем, что именованные категории, объявленные внутри заголовка класса, также были объявлены дублирующимися.Предположительно, потому что заголовок класса вызывался другими заголовками, а определение категории в классе просматривалось несколько раз.Решение здесь состояло в том, чтобы удалить имя из определения категории.

Все заголовочные файлы категорий указаны в заголовке фреймворка (например, в окружении условных операторов, поэтому анализируются только один раз (например, #ifndef AimpKit_h #define AimpKit_h #endif).

...