簡體   English   中英

iOS - watchOS App 發布問題 CFBundleIdentifier 沖突

[英]iOS - watchOS App publishing issue CFBundleIdentifier collision

應用程序上傳后,我收到以下電子郵件

我們在您的應用 XXX 的最近交付中發現了一個或多個問題。 請更正以下問題,然后重新上傳。

ITMS-90806:CFBundleIdentifier 沖突 - 每個包必須有一個唯一的包標識符。 捆綁包標識符“org.cocoapods.CocoaLumberjack”用於捆綁包“[CocoaLumberjack.framework, CocoaLumberjack.framework]”

CocoaLumberjack 是一個第三方庫,我過去已經使用過很多次了,沒有任何問題,我很困惑。

它與框架的 .plist 關鍵字 CFBundlePackageType 無關,因為它在此問題/答案Framework CFBundleIdentifier Collision 中指定 CocoaLumberjack 捆綁包類型是“框架”(CFBundlePackageType = FMWK)。 CocoaLumberjack 是一個廣泛使用的第三方庫,使用 cocoapods 添加到我的項目中。

該問題可能與我的應用程序包中的 watchOS 目標有關。 CocoaLumberjack 庫在 iOS 應用程序和 watchOS 應用程序中都使用,它導致了有關捆綁標識符重復的問題。

如果在 iOS 目標和 Watch 擴展之間共享框架,Apple Connect 服務器會檢測到 CFBundleIdentifier 沖突。

target 'App' do
 platform :ios, '9.0'
 # Pods for App
 ...
 pod 'CocoaLumberjack/Swift', '~> 3.5.3'
 ...
end

target 'AppWatch Extension' do
 platform :watchos, '5.0'
 # Pods for Watch Extension
 ...
 pod 'CocoaLumberjack/Swift', '~> 3.5.3'
 ...
end

iOS 應用程序正在使用該庫,而 watchOS 擴展正在使用相同的庫。 他們使用不同的庫,但 CocoaLumberjack 是兩者中唯一存在的庫。

過去我已經發布了很多次我的應用程序,使用相同的庫配置沒有任何問題。 我猜蘋果在最近幾天改變了一些關於捆綁標識符的限制。

使用 Carthage 也存在同樣的問題。

顯然Apple改變了驗證過程。 看起來他們不允許應用程序中的平台特定框架具有相同的標識符。

論壇上還有一篇關於此的帖子: https//forums.developer.apple.com/thread/122048

如果您因為使用Cocoapods而遇到此問題,則可以修補Podfile以將平台名稱附加到包標識符,以便它們始終是唯一的( ):

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}-$(PLATFORM_NAME)'
    end
  end
end

如果您的應用中有多個目標,則可以在XCode中更改方案中的watchOS目標,並將.watchos附加到標識符。

作為臨時解決方法,我在watchOS擴展中手動重命名了bundle標識符,然后app發布工作正常,但它看起來不是一個好的解決方案,特別是如果你在CI系統上運行構建。

更好的選擇是在pod文件中添加特定的安裝后操作:

post_install do |installer|
 installer.pods_project.targets.each do |target|
  if target.name == 'CocoaLumberjack-watchOS'
   target.build_configurations.each do |config|       
    config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}-$(PLATFORM_NAME)'
   end
  end
 end
end

或者如果你必須處理多個庫:

post_install do |installer|
 watchosLibs = ['Lib1-watchOS', 'Lib2-watchOS', 'Lib3-watchOS']
 installer.pods_project.targets.each do |target|
  if watchosLibs.include? target.name
   target.build_configurations.each do |config|
    config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}.${PLATFORM_NAME}"
   end
  end
 end
end

請注意重命名pods bundle標識符,因為否則某些庫的行為不正確。

我建議只重命名Apple拒絕的庫,以盡量減少可能出現的問題。

目前關於此問題有一些不同的開放主題:

使用Carthage代替Cocoapods也存在類似的問題

如果Apple不會更改關於捆綁標識符的新政策,那么更干凈的解決方案可能來自cocoapods團隊。

你不需要改變每個目標,它更清晰,寫這樣的東西:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.platform_name == :watchos
      target.build_configurations.each do |config|
        config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}-$(PLATFORM_NAME)'
      end
    end
  end
end

以下是我為迦太基解決問題的方法。

1)創建一個Carthage構建腳本,分離出不同的Carthage構建階段

2)當你做實際的框架構建時; 首先構建iOS的問題框架(我只有一個),然后修改項目文件以更改bundle標識符,然后為watchOS構建那些框架,然后構建其余的框架

carthage bootstrap --no-checkout
carthage checkout
#undo previous CFBundleIdentifier changes
sed -i '' 's/com.someco.MyFramework.watchOS;/com.someco.MyFramework;/g' Carthage/Checkouts/MyFramework/MyFramework.xcodeproj/project.pbxproj
carthage build --cache-builds --platform iOS
#set a unique CFBundleIdentifier
sed -i '' 's/com.someco.MyFramework;/com.someco.MyFramework.watchOS;/g' Carthage/Checkouts/MyFramework/MyFramework.xcodeproj/project.pbxproj
carthage build --no-use-binaries --platform watchOS --configuration $CONF $VERBOSE MyFramework

一種選擇是 - 您可以手動將“ .watchos(abc.asd.alomofire.watchos )添加到手表包標識符中。

只需從您的擴展中刪除嵌入框架構建階段即可。

單擊目標部分中的擴展 - >構建階段 - >刪除嵌入窗格框架

見附圖: 在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM