Upgrade to Pro — share decks privately, control downloads, hide ads and more …

xcconfig pitfalls

toshi0383
September 17, 2017

xcconfig pitfalls

presented at iOSDC Japan 2017

toshi0383

September 17, 2017
Tweet

More Decks by toshi0383

Other Decks in Programming

Transcript

  1. whoami — ླ໦ ढ़༟ (@toshi0383) Toshihiro Suzuki — iOS/tvOS Dev

    at AbemaTV — Father (5 month) — F1, GT SPORT © Toshihiro Suzuki 2017 2
  2. Agenda — What's xcconfig and Why would you use it?

    — Common Pitfails © Toshihiro Suzuki 2017 4
  3. Why? — Easier to review in Pull requests — Refactor

    using #include — Reusable © Toshihiro Suzuki 2017 8
  4. Recommended way to extract — Extract using toshi0383/xcconfig-extractor — Validate

    using xcodebuild -showBuildSettings © Toshihiro Suzuki 2017 9
  5. Let's Do it ! CONFIGURATION =-configuration Debug WORKSPACE =-workspace iOSSingleViewApp.xcworkspace

    SCHEME =-scheme iOSSingleViewApp OPTIONS=$(CONFIGURATION) $(WORKSPACE) $(SCHEME) xcodebuild -showBuildSettings $(OPTIONS) > before xcconfig-extractor --no-trim-duplicates *.xcodeproj Config/xcconfigs xcodebuild -showBuildSettings $(OPTIONS) > after diff before after © Toshihiro Suzuki 2017 10
  6. $(inherited) is ignored ! — ./Config/xcconfigs/iOSSingleViewApp-Debug.xcconfig FRAMEWORK_SEARCH_PATHS = $(inherited) $

    (PROJECT_DIR)/Carthage/Build/iOS — ./Pods/Target Support Files/Pods-iOSSingleViewApp/ Pods-iOSSingleViewApp.debug.xcconfig FRAMEWORK_SEARCH_PATHS = $(inherited) "$ {PODS_ROOT}/TwitterCore/iOS" "${PODS_ROOT}/ TwitterKit/iOS" © Toshihiro Suzuki 2017 13
  7. Migration failed! — Unwanted FRAMEWORK_SEACH_PATHS diff ! — Failed to

    increment version using agvtool © Toshihiro Suzuki 2017 15
  8. How $(inherited) works? — Inherites from parent LEVEL's value in

    Build Settings — Does NOT work for #include © Toshihiro Suzuki 2017 16
  9. Why agvtool failed to update version? — Answer: agvtool is

    not clever enough — It does NOT search for INFOPLIST_FILE value in xcconfig. © Toshihiro Suzuki 2017 19
  10. Workaround #2 Use /usr/libexec/PlistBuddy instead of agvtool e.g. APP_VERSION=$(git describe

    --tags --abbrev=0) BUILD_VERSION=$BITRISE_BUILD_NUMBER /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${APP_VERSION}" AbemaTV/Info.plist /usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${BUILD_VERSION}" AbemaTV/Info.plist © Toshihiro Suzuki 2017 21
  11. $(inherited) — works btw LEVELs but not for #include INFOPLIST_FILE

    — agvtool compatibility © Toshihiro Suzuki 2017 23
  12. Toshihiro Suzuki Feel free to reach out! Twitter: @toshi0383 GitHub:

    @toshi0383 Qiita: @toshi0383 Email: [email protected] © Toshihiro Suzuki 2017 26