├── .swift-version ├── WhatsNew ├── Resources │ ├── .gitkeep │ ├── WhatsNewItemTextView.xib │ ├── WhatsNewItemImageView.xib │ └── WhatsNew.xib ├── Items │ ├── WhatsNewItem.swift │ ├── PresentationOption.swift │ ├── WhatsNewItemTextView.swift │ ├── WhatsNewItemImageView.swift │ └── WhatsNew.swift ├── Utils │ └── NibLoadable.swift └── WhatsNewViewController.swift ├── .gitattributes ├── _Pods.xcodeproj ├── example.png ├── Example ├── WhatsNew │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── love.imageset │ │ │ ├── heart.pdf │ │ │ └── Contents.json │ │ ├── threed.imageset │ │ │ ├── threed.pdf │ │ │ └── Contents.json │ │ ├── night.imageset │ │ │ ├── darkmode.pdf │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ ├── ViewController.swift │ ├── AppDelegate.swift │ └── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.xib ├── Pods │ ├── Target Support Files │ │ ├── WhatsNew │ │ │ ├── WhatsNew.modulemap │ │ │ ├── WhatsNew-dummy.m │ │ │ ├── WhatsNew-prefix.pch │ │ │ ├── WhatsNew-umbrella.h │ │ │ ├── WhatsNew.xcconfig │ │ │ └── Info.plist │ │ ├── Pods-WhatsNew_Tests │ │ │ ├── Pods-WhatsNew_Tests.modulemap │ │ │ ├── Pods-WhatsNew_Tests-dummy.m │ │ │ ├── Pods-WhatsNew_Tests-acknowledgements.markdown │ │ │ ├── Pods-WhatsNew_Tests-umbrella.h │ │ │ ├── Pods-WhatsNew_Tests.debug.xcconfig │ │ │ ├── Pods-WhatsNew_Tests.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-WhatsNew_Tests-acknowledgements.plist │ │ │ ├── Pods-WhatsNew_Tests-frameworks.sh │ │ │ └── Pods-WhatsNew_Tests-resources.sh │ │ └── Pods-WhatsNew_Example │ │ │ ├── Pods-WhatsNew_Example.modulemap │ │ │ ├── Pods-WhatsNew_Example-dummy.m │ │ │ ├── Pods-WhatsNew_Example-umbrella.h │ │ │ ├── Pods-WhatsNew_Example.debug.xcconfig │ │ │ ├── Pods-WhatsNew_Example.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-WhatsNew_Example-acknowledgements.markdown │ │ │ ├── Pods-WhatsNew_Example-acknowledgements.plist │ │ │ ├── Pods-WhatsNew_Example-frameworks.sh │ │ │ └── Pods-WhatsNew_Example-resources.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── WhatsNew.podspec.json │ └── Pods.xcodeproj │ │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── WhatsNew.xcscheme │ │ └── project.pbxproj ├── Podfile ├── WhatsNew.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── WhatsNew-Example.xcscheme │ └── project.pbxproj ├── WhatsNew.xcworkspace │ └── contents.xcworkspacedata ├── Podfile.lock └── Tests │ ├── Info.plist │ └── WhatsNewTests.swift ├── circle.yml ├── LICENSE ├── WhatsNew.podspec ├── .gitignore └── README.md /.swift-version: -------------------------------------------------------------------------------- 1 | 4.2 2 | -------------------------------------------------------------------------------- /WhatsNew/Resources/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.sh linguist-language=Swift -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/WhatsNew/HEAD/example.png -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/love.imageset/heart.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/WhatsNew/HEAD/Example/WhatsNew/Images.xcassets/love.imageset/heart.pdf -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/threed.imageset/threed.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/WhatsNew/HEAD/Example/WhatsNew/Images.xcassets/threed.imageset/threed.pdf -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/night.imageset/darkmode.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/WhatsNew/HEAD/Example/WhatsNew/Images.xcassets/night.imageset/darkmode.pdf -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WhatsNew/WhatsNew.modulemap: -------------------------------------------------------------------------------- 1 | framework module WhatsNew { 2 | umbrella header "WhatsNew-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WhatsNew/WhatsNew-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_WhatsNew : NSObject 3 | @end 4 | @implementation PodsDummy_WhatsNew 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'WhatsNew_Example' do 4 | pod 'WhatsNew', :path => '../' 5 | 6 | target 'WhatsNew_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_WhatsNew_Tests { 2 | umbrella header "Pods-WhatsNew_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_WhatsNew_Example { 2 | umbrella header "Pods-WhatsNew_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_WhatsNew_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_WhatsNew_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_WhatsNew_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_WhatsNew_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/WhatsNew.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/love.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "heart.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/threed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "threed.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/night.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "darkmode.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WhatsNew/WhatsNew-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/WhatsNew.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - WhatsNew (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - WhatsNew (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | WhatsNew: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | WhatsNew: 84f89c9a2aef83d118c931f631184b12f2c4cf06 13 | 14 | PODFILE CHECKSUM: f7e23ca212f99a208ef47c6d7ab74bbe03bb82de 15 | 16 | COCOAPODS: 1.2.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - WhatsNew (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - WhatsNew (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | WhatsNew: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | WhatsNew: 84f89c9a2aef83d118c931f631184b12f2c4cf06 13 | 14 | PODFILE CHECKSUM: f7e23ca212f99a208ef47c6d7ab74bbe03bb82de 15 | 16 | COCOAPODS: 1.2.1 17 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | jobs: 4 | build: 5 | macos: 6 | xcode: 10.0.0 7 | steps: 8 | - checkout 9 | - run: 10 | working_directory: Example 11 | name: Run tests 12 | command: fastlane scan 13 | environment: 14 | SCAN_DEVICE: iPhone 8 15 | SCAN_SCHEME: WhatsNew-Example 16 | -------------------------------------------------------------------------------- /WhatsNew/Items/WhatsNewItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhatsNewItem.swift 3 | // WhatsNew 4 | // 5 | // Created by Patrick Balestra on 10/30/17. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum WhatsNewItem { 11 | case text(title: String, subtitle: String) 12 | case image(title: String, subtitle: String, image: UIImage) 13 | } 14 | 15 | protocol WhatsNewItemView: AnyObject { 16 | } 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WhatsNew/WhatsNew-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double WhatsNewVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char WhatsNewVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_WhatsNew_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_WhatsNew_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_WhatsNew_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_WhatsNew_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /WhatsNew/Items/PresentationOption.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PresentationOption.swift 3 | // WhatsNew 4 | // 5 | // Created by Patrick Balestra on 10/30/17. 6 | // 7 | 8 | import Foundation 9 | 10 | /// Defines when the "What's New" view controller is presented. 11 | public enum PresentationOption { 12 | /// present if the main bundle version changes. 13 | case always 14 | /// Only present if the main bundle changes major version. 15 | case majorVersion 16 | /// Never present. 17 | case never 18 | /// present always 19 | case debug 20 | } 21 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew/WhatsNew.framework/Headers" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew/WhatsNew.framework/Headers" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WhatsNew/WhatsNew.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/WhatsNew 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/WhatsNew.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "WhatsNew", 3 | "version": "0.1.0", 4 | "summary": "A short description of WhatsNew.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/BalestraPatrick/WhatsNew", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "BalestraPatrick": "me@patrickbalestra.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/BalestraPatrick/WhatsNew.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "8.0" 20 | }, 21 | "source_files": "WhatsNew/**/*.swift", 22 | "resources": "WhatsNew/Resources/*.*" 23 | } 24 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew/WhatsNew.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "WhatsNew" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/WhatsNew/WhatsNew.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "WhatsNew" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = $BUILD_DIR 9 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /WhatsNew/Items/WhatsNewItemTextView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhatsNewItemTextView.swift 3 | // WhatsNew 4 | // 5 | // Created by Patrick Balestra on 10/19/17. 6 | // 7 | 8 | import UIKit 9 | 10 | class WhatsNewItemTextView: UIView, NibLoadable, WhatsNewItemView { 11 | 12 | @IBOutlet weak var titleLabel: UILabel! 13 | @IBOutlet weak var subtitleLabel: UILabel! 14 | 15 | func set(title: String, subtitle: String, titleColor: UIColor, subtitleColor: UIColor, titleFont: UIFont, subtitleFont: UIFont) { 16 | titleLabel.text = title 17 | titleLabel.textColor = titleColor 18 | titleLabel.font = titleFont 19 | subtitleLabel.text = subtitle 20 | subtitleLabel.textColor = subtitleColor 21 | subtitleLabel.font = subtitleFont 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /WhatsNew/Items/WhatsNewItemImageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhatsNewItemImageView.swift 3 | // WhatsNew 4 | // 5 | // Created by Patrick Balestra on 10/19/17. 6 | // 7 | 8 | import UIKit 9 | 10 | class WhatsNewItemImageView: UIView, NibLoadable, WhatsNewItemView { 11 | 12 | @IBOutlet weak var imageView: UIImageView! 13 | @IBOutlet weak var titleLabel: UILabel! 14 | @IBOutlet weak var subtitleLabel: UILabel! 15 | 16 | func set(image: UIImage, title: String, subtitle: String, titleColor: UIColor, subtitleColor: UIColor, titleFont: UIFont, subtitleFont: UIFont) { 17 | imageView.image = image 18 | titleLabel.text = title 19 | titleLabel.textColor = titleColor 20 | titleLabel.font = titleFont 21 | subtitleLabel.text = subtitle 22 | subtitleLabel.textColor = subtitleColor 23 | subtitleLabel.font = subtitleFont 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/WhatsNew/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /WhatsNew/Utils/NibLoadable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NibLoadable.swift 3 | // WhatsNew 4 | // 5 | // Created by Patrick Balestra on 10/21/17. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol NibLoadable: class { } 11 | 12 | extension NibLoadable where Self: UIView { 13 | 14 | static func loadFromNib(owner: Self = Self()) -> Self { 15 | let layoutAttributes: [NSLayoutConstraint.Attribute] = [.top, .leading, .bottom, .trailing] 16 | for view in UINib(nibName: String(describing: self), bundle: Bundle(for: self)).instantiate(withOwner: owner, options: nil) { 17 | if let view = view as? UIView { 18 | view.translatesAutoresizingMaskIntoConstraints = false 19 | owner.addSubview(view) 20 | layoutAttributes.forEach { 21 | owner.addConstraint(NSLayoutConstraint(item: view, attribute: $0, relatedBy: .equal, toItem: owner, attribute: $0, multiplier: 1, constant: 0.0)) 22 | } 23 | } 24 | } 25 | return owner 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Example/WhatsNew/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Patrick Balestra 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Example/WhatsNew/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 1.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## WhatsNew 5 | 6 | Copyright (c) 2017 BalestraPatrick 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /WhatsNew.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'WhatsNew' 3 | s.version = '0.4.6' 4 | s.summary = 'Showcase new features after an app update similar to Pages, Numbers and Keynote.' 5 | 6 | # This description is used to generate tags and improve search results. 7 | # * Think: What does it do? Why did you write it? What is the focus? 8 | # * Try to keep it short, snappy and to the point. 9 | # * Write the description between the DESC delimiters below. 10 | # * Finally, don't worry about the indent, CocoaPods strips it! 11 | 12 | s.description = <<-DESC 13 | WhatsNew automatically displays a short description of the new features when users update your app. This is similar to what happens in Apple's apps like Pages, Numbers, Keynote, iMovie and TestFlight. 14 | Simply list your new features (with optional icons), customize the appeareance and when to show it (only on major updates for example). 15 | DESC 16 | 17 | s.homepage = 'https://github.com/BalestraPatrick/WhatsNew' 18 | s.license = { :type => 'MIT', :file => 'LICENSE' } 19 | s.author = { 'Patrick Balestra' => 'me@patrickbalestra.com' } 20 | s.source = { :git => 'https://github.com/BalestraPatrick/WhatsNew.git', :tag => s.version.to_s } 21 | s.social_media_url = 'https://twitter.com/BalestraPatrick' 22 | 23 | s.ios.deployment_target = '9.0' 24 | 25 | s.source_files = 'WhatsNew/**/*.swift' 26 | s.resources = 'WhatsNew/Resources/*.*' 27 | 28 | end 29 | -------------------------------------------------------------------------------- /Example/WhatsNew/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // WhatsNew 4 | // 5 | // Created by BalestraPatrick on 10/16/2017. 6 | // Copyright (c) 2017 BalestraPatrick. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import WhatsNew 11 | 12 | class ViewController: UIViewController { 13 | 14 | override func viewDidAppear(_ animated: Bool) { 15 | super.viewDidAppear(animated) 16 | 17 | if WhatsNew.shouldPresent() { 18 | let whatsNew = WhatsNewViewController(items: [ 19 | WhatsNewItem.image(title: "Nice Icons", subtitle: "Completely customize colors, texts and icons.", image: #imageLiteral(resourceName: "love")), 20 | WhatsNewItem.image(title: "Such Easy", subtitle: "Setting this up only takes 2 lines of code, impressive you say?", image: #imageLiteral(resourceName: "threed")), 21 | WhatsNewItem.image(title: "Very Sleep", subtitle: "It helps you get more sleep by writing less code.", image: #imageLiteral(resourceName: "night")), 22 | WhatsNewItem.text(title: "Text Only", subtitle: "No icons? Just go with plain text."), 23 | ]) 24 | whatsNew.titleText = "What's New" 25 | whatsNew.itemSubtitleColor = .darkGray 26 | whatsNew.buttonText = "Continue" 27 | present(whatsNew, animated: true, completion: nil) 28 | } 29 | } 30 | 31 | @IBAction func clear(_ sender: Any) { 32 | UserDefaults.standard.removeObject(forKey: "LatestAppVersionPresented") 33 | UserDefaults.standard.synchronize() 34 | DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 35 | exit(0) 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | .build/ 41 | 42 | # CocoaPods 43 | # 44 | # We recommend against adding the Pods directory to your .gitignore. However 45 | # you should judge for yourself, the pros and cons are mentioned at: 46 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 47 | # 48 | # Pods/ 49 | 50 | # Carthage 51 | # 52 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 53 | # Carthage/Checkouts 54 | 55 | Carthage/Build 56 | 57 | # fastlane 58 | # 59 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 60 | # screenshots whenever they are needed. 61 | # For more information about the recommended setup visit: 62 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 63 | 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots 67 | fastlane/test_output 68 | /Example/WhatsNew.xcworkspace/xcshareddata 69 | -------------------------------------------------------------------------------- /WhatsNew/Items/WhatsNew.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // WhatsNew 4 | // 5 | // Created by Patrick Balestra on 10/30/17. 6 | // 7 | 8 | import Foundation 9 | 10 | public struct WhatsNew { 11 | public static let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String 12 | static let bundle = Bundle(for: WhatsNewViewController.self) 13 | static let userDefaultsKeyLatestAppVersionPresented = "LatestAppVersionPresented" 14 | 15 | public static func markCurrentVersionAsPresented() { 16 | UserDefaults.standard.set(appVersion, forKey: userDefaultsKeyLatestAppVersionPresented) 17 | } 18 | 19 | public static func shouldPresent(with option: PresentationOption = .always, currentVersion: String? = appVersion) -> Bool { 20 | guard let currentAppVersion = currentVersion else { return false } 21 | let previousAppVersion = UserDefaults.standard.string(forKey: userDefaultsKeyLatestAppVersionPresented) 22 | let didUpdate = previousAppVersion != currentAppVersion 23 | switch option { 24 | case .debug: return true 25 | case .never: return false 26 | case .majorVersion: return didUpdate && didChangeMajorVersion(previous: previousAppVersion, current: currentAppVersion) 27 | case .always: return didUpdate 28 | } 29 | } 30 | 31 | private static func didChangeMajorVersion(previous: String?, current: String?) -> Bool { 32 | // If there is no previous installation, return true. 33 | guard let previous = previous else { return true } 34 | guard let previousMajor = previous.split(separator: ".").first, let previousMajorInt = Int(previousMajor) else { return false } 35 | guard let currentMajor = current?.split(separator: ".").first, let currentMajorInt = Int(currentMajor) else { return false } 36 | return currentMajorInt > previousMajorInt 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/WhatsNew/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // WhatsNew 4 | // 5 | // Created by BalestraPatrick on 10/16/2017. 6 | // Copyright (c) 2017 BalestraPatrick. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2017 BalestraPatrick <me@patrickbalestra.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | WhatsNew 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/WhatsNew.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Example/Tests/WhatsNewTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhatsNewTests.swift 3 | // Tests 4 | // 5 | // Created by BalestraPatrick on 10/16/2017. 6 | // Copyright (c) 2017 BalestraPatrick. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import WhatsNew 11 | 12 | class WhatsNewTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Clear user defaults. 17 | UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) 18 | } 19 | 20 | func testShouldNotPresent_WhenCurrentVersionIsUndefined() { 21 | XCTAssertFalse(WhatsNew.shouldPresent(with: .always, currentVersion: nil)) 22 | } 23 | 24 | func testShouldPresentAlways_WhenFirstVersionInstalled() { 25 | XCTAssertTrue(WhatsNew.shouldPresent(with: .always, currentVersion: "1.0")) 26 | } 27 | 28 | func testShouldPresentAlways_WhenUpdatingVersion() { 29 | UserDefaults.standard.set("1.0", forKey: WhatsNew.userDefaultsKeyLatestAppVersionPresented) 30 | XCTAssertTrue(WhatsNew.shouldPresent(with: .always, currentVersion: "1.1")) 31 | XCTAssertTrue(WhatsNew.shouldPresent(with: .always, currentVersion: "1.0.1")) 32 | } 33 | 34 | func testShouldPresentMajorVersion_WhenUpdatingVersionMajor() { 35 | UserDefaults.standard.set("1.9", forKey: WhatsNew.userDefaultsKeyLatestAppVersionPresented) 36 | XCTAssertTrue(WhatsNew.shouldPresent(with: .majorVersion, currentVersion: "2.0")) 37 | XCTAssertTrue(WhatsNew.shouldPresent(with: .majorVersion, currentVersion: "2.0.0")) 38 | } 39 | 40 | func testShouldPresentMajorVersion_WhenUpdatingVersionMajorAndSkippingVersion() { 41 | UserDefaults.standard.set("1.9", forKey: WhatsNew.userDefaultsKeyLatestAppVersionPresented) 42 | XCTAssertTrue(WhatsNew.shouldPresent(with: .majorVersion, currentVersion: "2.1")) 43 | XCTAssertTrue(WhatsNew.shouldPresent(with: .majorVersion, currentVersion: "2.1.1")) 44 | } 45 | 46 | func testShouldNotPresentMajorVersion_WhenUpdatingVersionMinor() { 47 | UserDefaults.standard.set("1.0", forKey: WhatsNew.userDefaultsKeyLatestAppVersionPresented) 48 | XCTAssertFalse(WhatsNew.shouldPresent(with: .majorVersion, currentVersion: "1.1")) 49 | XCTAssertFalse(WhatsNew.shouldPresent(with: .majorVersion, currentVersion: "1.0.1")) 50 | } 51 | 52 | func testShouldNotPresentNever_WhenUpdatingVersion() { 53 | UserDefaults.standard.set("1.0", forKey: WhatsNew.userDefaultsKeyLatestAppVersionPresented) 54 | XCTAssertFalse(WhatsNew.shouldPresent(with: .never, currentVersion: "1.0")) 55 | XCTAssertFalse(WhatsNew.shouldPresent(with: .never, currentVersion: nil)) 56 | XCTAssertFalse(WhatsNew.shouldPresent(with: .never, currentVersion: "2.0")) 57 | } 58 | 59 | func testShouldPresent_WhenDebugPresentationOption() { 60 | XCTAssertTrue(WhatsNew.shouldPresent(with: .debug, currentVersion: "2.4")) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Example/WhatsNew/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" 63 | 64 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 65 | code_sign_cmd="$code_sign_cmd &" 66 | fi 67 | echo "$code_sign_cmd" 68 | eval "$code_sign_cmd" 69 | fi 70 | } 71 | 72 | # Strip invalid architectures 73 | strip_invalid_archs() { 74 | binary="$1" 75 | # Get architectures for current file 76 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 77 | stripped="" 78 | for arch in $archs; do 79 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 80 | # Strip non-valid architectures in-place 81 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 82 | stripped="$stripped $arch" 83 | fi 84 | done 85 | if [[ "$stripped" ]]; then 86 | echo "Stripped $binary of architectures:$stripped" 87 | fi 88 | } 89 | 90 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 91 | wait 92 | fi 93 | -------------------------------------------------------------------------------- /Example/WhatsNew/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" 63 | 64 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 65 | code_sign_cmd="$code_sign_cmd &" 66 | fi 67 | echo "$code_sign_cmd" 68 | eval "$code_sign_cmd" 69 | fi 70 | } 71 | 72 | # Strip invalid architectures 73 | strip_invalid_archs() { 74 | binary="$1" 75 | # Get architectures for current file 76 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 77 | stripped="" 78 | for arch in $archs; do 79 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 80 | # Strip non-valid architectures in-place 81 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 82 | stripped="$stripped $arch" 83 | fi 84 | done 85 | if [[ "$stripped" ]]; then 86 | echo "Stripped $binary of architectures:$stripped" 87 | fi 88 | } 89 | 90 | 91 | if [[ "$CONFIGURATION" == "Debug" ]]; then 92 | install_framework "$BUILT_PRODUCTS_DIR/WhatsNew/WhatsNew.framework" 93 | fi 94 | if [[ "$CONFIGURATION" == "Release" ]]; then 95 | install_framework "$BUILT_PRODUCTS_DIR/WhatsNew/WhatsNew.framework" 96 | fi 97 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 98 | wait 99 | fi 100 | -------------------------------------------------------------------------------- /WhatsNew/Resources/WhatsNewItemTextView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Example/WhatsNew.xcodeproj/xcshareddata/xcschemes/WhatsNew-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WhatsNew 2 | 3 | [![CircleCI](https://circleci.com/gh/BalestraPatrick/WhatsNew.svg?style=svg)](https://circleci.com/gh/BalestraPatrick/WhatsNew) 4 | [![Version](https://img.shields.io/cocoapods/v/WhatsNew.svg?style=flat)](http://cocoapods.org/pods/WhatsNew) 5 | [![License](https://img.shields.io/cocoapods/l/WhatsNew.svg?style=flat)](http://cocoapods.org/pods/WhatsNew) 6 | [![Platform](https://img.shields.io/cocoapods/p/WhatsNew.svg?style=flat)](http://cocoapods.org/pods/WhatsNew) 7 | 8 |

9 | 10 | ## Description 11 | `WhatsNew` automatically displays a short description of the new features when users update your app. This is similar to what happens in Apple's apps like Pages, Numbers, Keynote, iMovie and TestFlight. 12 | 13 | Simply list your new features (with optional icons), customize the appeareance and when to show it (only on major updates for example). 14 | 15 | ## Usage 16 | Run the example project from the `Example` directory and check out `ViewController.swift`. 17 | 18 | ```swift 19 | import WhatsNew 20 | 21 | let whatsNew = WhatsNewViewController(items: [ 22 | WhatsNewItem.image(title: "Nice Icons", subtitle: "Completely customize colors, texts and icons.", image: #imageLiteral(resourceName: "love")), 23 | WhatsNewItem.image(title: "Such Easy", subtitle: "Setting this up only takes 2 lines of code, impressive you say?", image: #imageLiteral(resourceName: "threed")), 24 | WhatsNewItem.image(title: "Very Sleep", subtitle: "It helps you get more sleep by writing less code.", image: #imageLiteral(resourceName: "night")), 25 | WhatsNewItem.text(title: "Text Only", subtitle: "No icons? Just go with plain text."), 26 | ]) 27 | whatsNew.presentIfNeeded(on: self) 28 | ``` 29 | 30 | Some of the apps using `WhatsNew` in production are: 31 | - [Blocknow](https://itunes.apple.com/app/blocknow/id1350568499) 32 | - [Bittracker](http://appstore.com/BittrackerCryptoCoinTracker) 33 | - [Views • News Redesigned](https://itunes.apple.com/us/app/views-news-redesigned/id1322754821?mt=8) 34 | - [Pisth - SSH Client](https://itunes.apple.com/us/app/pisth/id1331070425?ls=1&mt=8) 35 | - [TimeFinder - Hourly Planner](https://itunes.apple.com/us/app/timefinder-hourly-planner/id1347447233?mt=8) 36 | 37 | If you're using `WhatsNew` in your app, please let me know and I will make sure to add it to the list of apps that use this library! 38 | 39 | ## Customizations 40 | There are a bunch of customizable properties with corresponding documentation. 41 | 42 | ```swift 43 | /// This method allows marking the current version as presented. This is useful in case you want to avoid showing WhatsNew to first-time users for example. 44 | public static func markCurrentVersionAsPresented() 45 | 46 | /// Defines when to present the What's New view controller. Check the `PresentationOption` enum for more details. 47 | public var presentationOption: PresentationOption = .always 48 | 49 | /// Closure invoked when the user dismisses the view controller. 50 | public var onDismissal: (() -> Void)? 51 | 52 | /// Text of the top title. 53 | public var titleText: String = "What’s New" 54 | 55 | /// Color of the top title. 56 | public var titleColor: UIColor = .black 57 | 58 | /// Font of the top title. 59 | public var titleFont: UIFont = UIFont.systemFont(ofSize: 26, weight: .bold) 60 | 61 | /// Title color of the feature items. 62 | public var itemTitleColor: UIColor = .black 63 | 64 | /// Subtitle color of the feature items. 65 | public var itemSubtitleColor: UIColor = .black 66 | 67 | /// Title font of the feature items 68 | public var itemTitleFont: UIFont = UIFont.systemFont(ofSize: 20, weight: .bold) 69 | 70 | /// Subtitle font of the feature items 71 | public var itemSubtitleFont: UIFont = UIFont.systemFont(ofSize: 16, weight: .regular) 72 | 73 | /// Text of the bottom button that dismisses the view controller. 74 | public var buttonText: String = "Continue" 75 | 76 | /// Text color of the bottom button that dismisses the view controller. 77 | public var buttonTextColor: UIColor = .yellow 78 | 79 | /// Text font of the bottom button that dismisses the view controller. 80 | public var buttonFont: UIFont = UIFont.systemFont(ofSize: 16, weight: .regular) 81 | 82 | /// Background color of the bottom button that dismisses the view controller. 83 | public var buttonBackgroundColor: UIColor = .black 84 | ``` 85 | 86 | ## Installation 87 | 88 | `WhatsNew` is available through [CocoaPods](http://cocoapods.org). To install 89 | it, simply add the following line to your `Podfile`: 90 | 91 | ```ruby 92 | pod 'WhatsNew' 93 | ``` 94 | 95 | You can also use [Carthage](https://github.com/Carthage/Carthage) if you prefer. Add this line to your `Cartfile`. 96 | 97 | ```ruby 98 | github "BalestraPatrick/WhatsNew" 99 | ``` 100 | 101 | Android version available [here](https://github.com/TonnyL/WhatsNew). 102 | ## Requirements 103 | iOS 9.0 and Swift 4.0 are required. 104 | 105 | ## Author 106 | 107 | I'm [Patrick Balestra](http://www.patrickbalestra.com). 108 | Email: [me@patrickbalestra.com](mailto:me@patrickbalestra.com) 109 | Twitter: [@BalestraPatrick](http://twitter.com/BalestraPatrick). 110 | 111 | ## License 112 | 113 | `WhatsNew` is available under the MIT license. See the [LICENSE](LICENSE) file for more info. 114 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | 3) 22 | TARGET_DEVICE_ARGS="--target-device tv" 23 | ;; 24 | 4) 25 | TARGET_DEVICE_ARGS="--target-device watch" 26 | ;; 27 | *) 28 | TARGET_DEVICE_ARGS="--target-device mac" 29 | ;; 30 | esac 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 48 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 49 | ;; 50 | *.xib) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "${PODS_ROOT}*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 102 | fi 103 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | case "${TARGETED_DEVICE_FAMILY}" in 12 | 1,2) 13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 14 | ;; 15 | 1) 16 | TARGET_DEVICE_ARGS="--target-device iphone" 17 | ;; 18 | 2) 19 | TARGET_DEVICE_ARGS="--target-device ipad" 20 | ;; 21 | 3) 22 | TARGET_DEVICE_ARGS="--target-device tv" 23 | ;; 24 | 4) 25 | TARGET_DEVICE_ARGS="--target-device watch" 26 | ;; 27 | *) 28 | TARGET_DEVICE_ARGS="--target-device mac" 29 | ;; 30 | esac 31 | 32 | install_resource() 33 | { 34 | if [[ "$1" = /* ]] ; then 35 | RESOURCE_PATH="$1" 36 | else 37 | RESOURCE_PATH="${PODS_ROOT}/$1" 38 | fi 39 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 40 | cat << EOM 41 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 42 | EOM 43 | exit 1 44 | fi 45 | case $RESOURCE_PATH in 46 | *.storyboard) 47 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 48 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 49 | ;; 50 | *.xib) 51 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" 52 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 53 | ;; 54 | *.framework) 55 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 56 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 57 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 58 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 59 | ;; 60 | *.xcdatamodel) 61 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" 62 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 63 | ;; 64 | *.xcdatamodeld) 65 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" 66 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 67 | ;; 68 | *.xcmappingmodel) 69 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" 70 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 71 | ;; 72 | *.xcassets) 73 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 74 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 75 | ;; 76 | *) 77 | echo "$RESOURCE_PATH" 78 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 79 | ;; 80 | esac 81 | } 82 | 83 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 84 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 85 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 86 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 87 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 88 | fi 89 | rm -f "$RESOURCES_TO_COPY" 90 | 91 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 92 | then 93 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 94 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 95 | while read line; do 96 | if [[ $line != "${PODS_ROOT}*" ]]; then 97 | XCASSET_FILES+=("$line") 98 | fi 99 | done <<<"$OTHER_XCASSETS" 100 | 101 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 102 | fi 103 | -------------------------------------------------------------------------------- /WhatsNew/Resources/WhatsNewItemImageView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 39 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /WhatsNew/WhatsNewViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhatsNewViewController.swift 3 | // WhatsNew 4 | // 5 | // Created by Patrick Balestra on 10/15/17. 6 | // Copyright © 2017 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// Shows new features added in this app update. 12 | public class WhatsNewViewController: UIViewController { 13 | 14 | /// Defines when to present the What's New view controller. Check the `PresentationOption` enum for more details. 15 | public var presentationOption: PresentationOption = .always 16 | /// Closure invoked when the user dismisses the view controller. 17 | public var onDismissal: (() -> Void)? 18 | /// Text of the top title. 19 | public var titleText: String = "What’s New" { 20 | didSet { 21 | titleLabel?.text = titleText 22 | } 23 | } 24 | /// Color of the top title. 25 | public var titleColor: UIColor = .black { 26 | didSet { 27 | titleLabel?.textColor = titleColor 28 | } 29 | } 30 | /// Font of the top title. 31 | public var titleFont: UIFont = UIFont.systemFont(ofSize: 26, weight: .bold) { 32 | didSet { 33 | titleLabel?.font = titleFont 34 | } 35 | } 36 | /// Tint color of the feature item image, if one exists. 37 | public var itemImageTintColor: UIColor? = nil { 38 | didSet { 39 | setUp(with: items) 40 | } 41 | } 42 | /// Title color of the feature items. 43 | public var itemTitleColor: UIColor = .black { 44 | didSet { 45 | setUp(with: items) 46 | } 47 | } 48 | /// Subtitle color of the feature items. 49 | public var itemSubtitleColor: UIColor = .black { 50 | didSet { 51 | setUp(with: items) 52 | } 53 | } 54 | /// Title font of the feature items 55 | public var itemTitleFont: UIFont = UIFont.systemFont(ofSize: 20, weight: .bold) { 56 | didSet { 57 | setUp(with: items) 58 | } 59 | } 60 | /// Subtitle font of the feature items 61 | public var itemSubtitleFont: UIFont = UIFont.systemFont(ofSize: 16, weight: .regular) { 62 | didSet { 63 | setUp(with: items) 64 | } 65 | } 66 | /// Text of the bottom button that dismisses the view controller. 67 | public var buttonText: String = "Continue" { 68 | didSet { 69 | continueButton?.setTitle(buttonText, for: .normal) 70 | } 71 | } 72 | /// Text color of the bottom button that dismisses the view controller. 73 | public var buttonTextColor: UIColor = .yellow { 74 | didSet { 75 | continueButton?.setTitleColor(buttonTextColor, for: .normal) 76 | } 77 | } 78 | /// Text font of the bottom button that dismisses the view controller. 79 | public var buttonFont: UIFont = UIFont.systemFont(ofSize: 16, weight: .regular) { 80 | didSet { 81 | continueButton?.titleLabel?.font = buttonFont 82 | } 83 | } 84 | /// Background color of the bottom button that dismisses the view controller. 85 | public var buttonBackgroundColor: UIColor = .black { 86 | didSet { 87 | continueButton?.backgroundColor = buttonBackgroundColor 88 | } 89 | } 90 | 91 | private let items: [WhatsNewItem] 92 | @IBOutlet private weak var titleLabel: UILabel! 93 | @IBOutlet private weak var stackView: UIStackView! 94 | @IBOutlet private weak var continueButton: UIButton! 95 | 96 | public init(items: [WhatsNewItem]) { 97 | self.items = items 98 | super.init(nibName: "WhatsNew", bundle: WhatsNew.bundle) 99 | } 100 | 101 | required public init?(coder aDecoder: NSCoder) { 102 | fatalError("Unsupported initializer, please use init(items:)") 103 | } 104 | 105 | public override func viewDidLoad() { 106 | super.viewDidLoad() 107 | configureUI() 108 | } 109 | 110 | public func presentIfNeeded(on parentViewController: UIViewController) { 111 | guard WhatsNew.shouldPresent(with: presentationOption) else { return } 112 | parentViewController.present(self, animated: true, completion: nil) 113 | } 114 | 115 | private func configureUI() { 116 | // Use dynamic font size if available 117 | if #available(iOS 10, *) { 118 | if let titleFontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .title2).withSymbolicTraits(.traitBold) { 119 | titleFont = UIFont(descriptor: titleFontDescriptor, size: 0) 120 | } 121 | itemSubtitleFont = UIFont.preferredFont(forTextStyle: .body) 122 | } 123 | titleLabel?.text = titleText 124 | titleLabel?.textColor = titleColor 125 | titleLabel?.font = titleFont 126 | continueButton?.setTitle(buttonText, for: .normal) 127 | continueButton?.setTitleColor(buttonTextColor, for: .normal) 128 | continueButton?.titleLabel?.font = buttonFont 129 | continueButton?.backgroundColor = buttonBackgroundColor 130 | 131 | setUp(with: items) 132 | 133 | NotificationCenter.default.addObserver(self, selector: #selector(refreshFonts), name: UIContentSizeCategory.didChangeNotification, object: nil) 134 | } 135 | 136 | private func setUp(with items: [WhatsNewItem]) { 137 | stackView?.arrangedSubviews.forEach { 138 | if $0 is WhatsNewItemView { 139 | stackView?.removeArrangedSubview($0) 140 | $0.removeFromSuperview() 141 | } 142 | } 143 | items.forEach { item in 144 | let view: UIView 145 | switch item { 146 | case .image(let title, let subtitle, let image): 147 | let itemView = WhatsNewItemImageView.loadFromNib() 148 | if let imageTintColor = itemImageTintColor { 149 | itemView.imageView.tintColor = imageTintColor 150 | } 151 | itemView.set(image: image, title: title, subtitle: subtitle, titleColor: itemTitleColor, subtitleColor: itemSubtitleColor, titleFont: itemTitleFont, subtitleFont: itemSubtitleFont) 152 | view = itemView 153 | case .text(let title, let subtitle): 154 | let itemView = WhatsNewItemTextView.loadFromNib() 155 | itemView.set(title: title, subtitle: subtitle, titleColor: itemTitleColor, subtitleColor: itemSubtitleColor, titleFont: itemTitleFont, subtitleFont: itemSubtitleFont) 156 | view = itemView 157 | } 158 | stackView?.addArrangedSubview(view) 159 | } 160 | } 161 | 162 | @objc private func refreshFonts() { 163 | if #available(iOS 10, *) { 164 | titleLabel.font = UIFont.preferredFont(forTextStyle: .title1) 165 | continueButton.titleLabel?.font = UIFont.preferredFont(forTextStyle: .callout) 166 | let fontDescriptor = UIFont.preferredFont(forTextStyle: .headline).fontDescriptor 167 | itemTitleFont = UIFont(descriptor: fontDescriptor, size: fontDescriptor.pointSize + 5) 168 | itemSubtitleFont = UIFont.preferredFont(forTextStyle: .body) 169 | } 170 | } 171 | 172 | @IBAction func `continue`() { 173 | WhatsNew.markCurrentVersionAsPresented() 174 | dismiss(animated: true, completion: onDismissal) 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /WhatsNew/Resources/WhatsNew.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /Example/WhatsNew.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1FADA4220CA1ACE8B4E2C1AC /* Pods_WhatsNew_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2F71234FC605F13D6858D4D /* Pods_WhatsNew_Example.framework */; }; 11 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 12 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 13 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 14 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 15 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 16 | 607FACEC1AFB9204008FA782 /* WhatsNewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* WhatsNewTests.swift */; }; 17 | E88DE52FDBF6E492F28B1BA2 /* Pods_WhatsNew_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30B8AE31017254FE1744E999 /* Pods_WhatsNew_Tests.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 26 | remoteInfo = WhatsNew; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 07764618130D3205FA79451C /* Pods-WhatsNew_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WhatsNew_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example.release.xcconfig"; sourceTree = ""; }; 32 | 24934DEAAFFF4DBEE55AA3B1 /* WhatsNew.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = WhatsNew.podspec; path = ../WhatsNew.podspec; sourceTree = ""; }; 33 | 30B8AE31017254FE1744E999 /* Pods_WhatsNew_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WhatsNew_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 34 | 4D534311749EA40E5B0F583B /* Pods-WhatsNew_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WhatsNew_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests.release.xcconfig"; sourceTree = ""; }; 35 | 54557CED95D7D3C6167713C7 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 36 | 607FACD01AFB9204008FA782 /* WhatsNew_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WhatsNew_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 38 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 39 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 40 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 41 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 42 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 43 | 607FACE51AFB9204008FA782 /* WhatsNew_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WhatsNew_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | 607FACEB1AFB9204008FA782 /* WhatsNewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewTests.swift; sourceTree = ""; }; 46 | 669AB9EAD59978E937498CBD /* Pods-WhatsNew_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WhatsNew_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example.debug.xcconfig"; sourceTree = ""; }; 47 | B2C5D20E2D3C479AE2BB3870 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 48 | C2F71234FC605F13D6858D4D /* Pods_WhatsNew_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WhatsNew_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | F4F03A69224BA466E1CE2417 /* Pods-WhatsNew_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WhatsNew_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests.debug.xcconfig"; sourceTree = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 1FADA4220CA1ACE8B4E2C1AC /* Pods_WhatsNew_Example.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | E88DE52FDBF6E492F28B1BA2 /* Pods_WhatsNew_Tests.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 4112762FE4F76980EE081FBB /* Frameworks */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | C2F71234FC605F13D6858D4D /* Pods_WhatsNew_Example.framework */, 76 | 30B8AE31017254FE1744E999 /* Pods_WhatsNew_Tests.framework */, 77 | ); 78 | name = Frameworks; 79 | sourceTree = ""; 80 | }; 81 | 607FACC71AFB9204008FA782 = { 82 | isa = PBXGroup; 83 | children = ( 84 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 85 | 607FACD21AFB9204008FA782 /* Example for WhatsNew */, 86 | 607FACE81AFB9204008FA782 /* Tests */, 87 | 607FACD11AFB9204008FA782 /* Products */, 88 | F78E24B3D4974F99251C6DBE /* Pods */, 89 | 4112762FE4F76980EE081FBB /* Frameworks */, 90 | ); 91 | sourceTree = ""; 92 | }; 93 | 607FACD11AFB9204008FA782 /* Products */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 607FACD01AFB9204008FA782 /* WhatsNew_Example.app */, 97 | 607FACE51AFB9204008FA782 /* WhatsNew_Tests.xctest */, 98 | ); 99 | name = Products; 100 | sourceTree = ""; 101 | }; 102 | 607FACD21AFB9204008FA782 /* Example for WhatsNew */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 106 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 107 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 108 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 109 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 110 | 607FACD31AFB9204008FA782 /* Supporting Files */, 111 | ); 112 | name = "Example for WhatsNew"; 113 | path = WhatsNew; 114 | sourceTree = ""; 115 | }; 116 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 607FACD41AFB9204008FA782 /* Info.plist */, 120 | ); 121 | name = "Supporting Files"; 122 | sourceTree = ""; 123 | }; 124 | 607FACE81AFB9204008FA782 /* Tests */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 607FACEB1AFB9204008FA782 /* WhatsNewTests.swift */, 128 | 607FACE91AFB9204008FA782 /* Supporting Files */, 129 | ); 130 | path = Tests; 131 | sourceTree = ""; 132 | }; 133 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 607FACEA1AFB9204008FA782 /* Info.plist */, 137 | ); 138 | name = "Supporting Files"; 139 | sourceTree = ""; 140 | }; 141 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 24934DEAAFFF4DBEE55AA3B1 /* WhatsNew.podspec */, 145 | B2C5D20E2D3C479AE2BB3870 /* README.md */, 146 | 54557CED95D7D3C6167713C7 /* LICENSE */, 147 | ); 148 | name = "Podspec Metadata"; 149 | sourceTree = ""; 150 | }; 151 | F78E24B3D4974F99251C6DBE /* Pods */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 669AB9EAD59978E937498CBD /* Pods-WhatsNew_Example.debug.xcconfig */, 155 | 07764618130D3205FA79451C /* Pods-WhatsNew_Example.release.xcconfig */, 156 | F4F03A69224BA466E1CE2417 /* Pods-WhatsNew_Tests.debug.xcconfig */, 157 | 4D534311749EA40E5B0F583B /* Pods-WhatsNew_Tests.release.xcconfig */, 158 | ); 159 | name = Pods; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXGroup section */ 163 | 164 | /* Begin PBXNativeTarget section */ 165 | 607FACCF1AFB9204008FA782 /* WhatsNew_Example */ = { 166 | isa = PBXNativeTarget; 167 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WhatsNew_Example" */; 168 | buildPhases = ( 169 | 3AB58B40A1511976757773BF /* [CP] Check Pods Manifest.lock */, 170 | 607FACCC1AFB9204008FA782 /* Sources */, 171 | 607FACCD1AFB9204008FA782 /* Frameworks */, 172 | 607FACCE1AFB9204008FA782 /* Resources */, 173 | E527D711CF84B1E7DDE47906 /* [CP] Embed Pods Frameworks */, 174 | A051319E9E212592770D1514 /* [CP] Copy Pods Resources */, 175 | ); 176 | buildRules = ( 177 | ); 178 | dependencies = ( 179 | ); 180 | name = WhatsNew_Example; 181 | productName = WhatsNew; 182 | productReference = 607FACD01AFB9204008FA782 /* WhatsNew_Example.app */; 183 | productType = "com.apple.product-type.application"; 184 | }; 185 | 607FACE41AFB9204008FA782 /* WhatsNew_Tests */ = { 186 | isa = PBXNativeTarget; 187 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WhatsNew_Tests" */; 188 | buildPhases = ( 189 | 5CAAEF77B425D642FD247E51 /* [CP] Check Pods Manifest.lock */, 190 | 607FACE11AFB9204008FA782 /* Sources */, 191 | 607FACE21AFB9204008FA782 /* Frameworks */, 192 | 607FACE31AFB9204008FA782 /* Resources */, 193 | F39B583624CF1CFCD27ED2CF /* [CP] Embed Pods Frameworks */, 194 | 73F53D5D55EB06E2CF336056 /* [CP] Copy Pods Resources */, 195 | ); 196 | buildRules = ( 197 | ); 198 | dependencies = ( 199 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 200 | ); 201 | name = WhatsNew_Tests; 202 | productName = Tests; 203 | productReference = 607FACE51AFB9204008FA782 /* WhatsNew_Tests.xctest */; 204 | productType = "com.apple.product-type.bundle.unit-test"; 205 | }; 206 | /* End PBXNativeTarget section */ 207 | 208 | /* Begin PBXProject section */ 209 | 607FACC81AFB9204008FA782 /* Project object */ = { 210 | isa = PBXProject; 211 | attributes = { 212 | LastSwiftUpdateCheck = 0830; 213 | LastUpgradeCheck = 0930; 214 | ORGANIZATIONNAME = CocoaPods; 215 | TargetAttributes = { 216 | 607FACCF1AFB9204008FA782 = { 217 | CreatedOnToolsVersion = 6.3.1; 218 | LastSwiftMigration = 1000; 219 | }; 220 | 607FACE41AFB9204008FA782 = { 221 | CreatedOnToolsVersion = 6.3.1; 222 | LastSwiftMigration = 1000; 223 | TestTargetID = 607FACCF1AFB9204008FA782; 224 | }; 225 | }; 226 | }; 227 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "WhatsNew" */; 228 | compatibilityVersion = "Xcode 3.2"; 229 | developmentRegion = English; 230 | hasScannedForEncodings = 0; 231 | knownRegions = ( 232 | en, 233 | Base, 234 | ); 235 | mainGroup = 607FACC71AFB9204008FA782; 236 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 237 | projectDirPath = ""; 238 | projectRoot = ""; 239 | targets = ( 240 | 607FACCF1AFB9204008FA782 /* WhatsNew_Example */, 241 | 607FACE41AFB9204008FA782 /* WhatsNew_Tests */, 242 | ); 243 | }; 244 | /* End PBXProject section */ 245 | 246 | /* Begin PBXResourcesBuildPhase section */ 247 | 607FACCE1AFB9204008FA782 /* Resources */ = { 248 | isa = PBXResourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 252 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 253 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | 607FACE31AFB9204008FA782 /* Resources */ = { 258 | isa = PBXResourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXResourcesBuildPhase section */ 265 | 266 | /* Begin PBXShellScriptBuildPhase section */ 267 | 3AB58B40A1511976757773BF /* [CP] Check Pods Manifest.lock */ = { 268 | isa = PBXShellScriptBuildPhase; 269 | buildActionMask = 2147483647; 270 | files = ( 271 | ); 272 | inputPaths = ( 273 | ); 274 | name = "[CP] Check Pods Manifest.lock"; 275 | outputPaths = ( 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | shellPath = /bin/sh; 279 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; 280 | showEnvVarsInLog = 0; 281 | }; 282 | 5CAAEF77B425D642FD247E51 /* [CP] Check Pods Manifest.lock */ = { 283 | isa = PBXShellScriptBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | ); 287 | inputPaths = ( 288 | ); 289 | name = "[CP] Check Pods Manifest.lock"; 290 | outputPaths = ( 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | shellPath = /bin/sh; 294 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; 295 | showEnvVarsInLog = 0; 296 | }; 297 | 73F53D5D55EB06E2CF336056 /* [CP] Copy Pods Resources */ = { 298 | isa = PBXShellScriptBuildPhase; 299 | buildActionMask = 2147483647; 300 | files = ( 301 | ); 302 | inputPaths = ( 303 | ); 304 | name = "[CP] Copy Pods Resources"; 305 | outputPaths = ( 306 | ); 307 | runOnlyForDeploymentPostprocessing = 0; 308 | shellPath = /bin/sh; 309 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-resources.sh\"\n"; 310 | showEnvVarsInLog = 0; 311 | }; 312 | A051319E9E212592770D1514 /* [CP] Copy Pods Resources */ = { 313 | isa = PBXShellScriptBuildPhase; 314 | buildActionMask = 2147483647; 315 | files = ( 316 | ); 317 | inputPaths = ( 318 | ); 319 | name = "[CP] Copy Pods Resources"; 320 | outputPaths = ( 321 | ); 322 | runOnlyForDeploymentPostprocessing = 0; 323 | shellPath = /bin/sh; 324 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-resources.sh\"\n"; 325 | showEnvVarsInLog = 0; 326 | }; 327 | E527D711CF84B1E7DDE47906 /* [CP] Embed Pods Frameworks */ = { 328 | isa = PBXShellScriptBuildPhase; 329 | buildActionMask = 2147483647; 330 | files = ( 331 | ); 332 | inputPaths = ( 333 | ); 334 | name = "[CP] Embed Pods Frameworks"; 335 | outputPaths = ( 336 | ); 337 | runOnlyForDeploymentPostprocessing = 0; 338 | shellPath = /bin/sh; 339 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example-frameworks.sh\"\n"; 340 | showEnvVarsInLog = 0; 341 | }; 342 | F39B583624CF1CFCD27ED2CF /* [CP] Embed Pods Frameworks */ = { 343 | isa = PBXShellScriptBuildPhase; 344 | buildActionMask = 2147483647; 345 | files = ( 346 | ); 347 | inputPaths = ( 348 | ); 349 | name = "[CP] Embed Pods Frameworks"; 350 | outputPaths = ( 351 | ); 352 | runOnlyForDeploymentPostprocessing = 0; 353 | shellPath = /bin/sh; 354 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests-frameworks.sh\"\n"; 355 | showEnvVarsInLog = 0; 356 | }; 357 | /* End PBXShellScriptBuildPhase section */ 358 | 359 | /* Begin PBXSourcesBuildPhase section */ 360 | 607FACCC1AFB9204008FA782 /* Sources */ = { 361 | isa = PBXSourcesBuildPhase; 362 | buildActionMask = 2147483647; 363 | files = ( 364 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 365 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | }; 369 | 607FACE11AFB9204008FA782 /* Sources */ = { 370 | isa = PBXSourcesBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | 607FACEC1AFB9204008FA782 /* WhatsNewTests.swift in Sources */, 374 | ); 375 | runOnlyForDeploymentPostprocessing = 0; 376 | }; 377 | /* End PBXSourcesBuildPhase section */ 378 | 379 | /* Begin PBXTargetDependency section */ 380 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 381 | isa = PBXTargetDependency; 382 | target = 607FACCF1AFB9204008FA782 /* WhatsNew_Example */; 383 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 384 | }; 385 | /* End PBXTargetDependency section */ 386 | 387 | /* Begin PBXVariantGroup section */ 388 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 389 | isa = PBXVariantGroup; 390 | children = ( 391 | 607FACDA1AFB9204008FA782 /* Base */, 392 | ); 393 | name = Main.storyboard; 394 | sourceTree = ""; 395 | }; 396 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 397 | isa = PBXVariantGroup; 398 | children = ( 399 | 607FACDF1AFB9204008FA782 /* Base */, 400 | ); 401 | name = LaunchScreen.xib; 402 | sourceTree = ""; 403 | }; 404 | /* End PBXVariantGroup section */ 405 | 406 | /* Begin XCBuildConfiguration section */ 407 | 607FACED1AFB9204008FA782 /* Debug */ = { 408 | isa = XCBuildConfiguration; 409 | buildSettings = { 410 | ALWAYS_SEARCH_USER_PATHS = NO; 411 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 412 | CLANG_CXX_LIBRARY = "libc++"; 413 | CLANG_ENABLE_MODULES = YES; 414 | CLANG_ENABLE_OBJC_ARC = YES; 415 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 416 | CLANG_WARN_BOOL_CONVERSION = YES; 417 | CLANG_WARN_COMMA = YES; 418 | CLANG_WARN_CONSTANT_CONVERSION = YES; 419 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 420 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 421 | CLANG_WARN_EMPTY_BODY = YES; 422 | CLANG_WARN_ENUM_CONVERSION = YES; 423 | CLANG_WARN_INFINITE_RECURSION = YES; 424 | CLANG_WARN_INT_CONVERSION = YES; 425 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 426 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 427 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 428 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 429 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 430 | CLANG_WARN_STRICT_PROTOTYPES = YES; 431 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 432 | CLANG_WARN_UNREACHABLE_CODE = YES; 433 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 434 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 435 | COPY_PHASE_STRIP = NO; 436 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 437 | ENABLE_STRICT_OBJC_MSGSEND = YES; 438 | ENABLE_TESTABILITY = YES; 439 | GCC_C_LANGUAGE_STANDARD = gnu99; 440 | GCC_DYNAMIC_NO_PIC = NO; 441 | GCC_NO_COMMON_BLOCKS = YES; 442 | GCC_OPTIMIZATION_LEVEL = 0; 443 | GCC_PREPROCESSOR_DEFINITIONS = ( 444 | "DEBUG=1", 445 | "$(inherited)", 446 | ); 447 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 448 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 449 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 450 | GCC_WARN_UNDECLARED_SELECTOR = YES; 451 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 452 | GCC_WARN_UNUSED_FUNCTION = YES; 453 | GCC_WARN_UNUSED_VARIABLE = YES; 454 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 455 | MTL_ENABLE_DEBUG_INFO = YES; 456 | ONLY_ACTIVE_ARCH = YES; 457 | SDKROOT = iphoneos; 458 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 459 | }; 460 | name = Debug; 461 | }; 462 | 607FACEE1AFB9204008FA782 /* Release */ = { 463 | isa = XCBuildConfiguration; 464 | buildSettings = { 465 | ALWAYS_SEARCH_USER_PATHS = NO; 466 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 467 | CLANG_CXX_LIBRARY = "libc++"; 468 | CLANG_ENABLE_MODULES = YES; 469 | CLANG_ENABLE_OBJC_ARC = YES; 470 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 471 | CLANG_WARN_BOOL_CONVERSION = YES; 472 | CLANG_WARN_COMMA = YES; 473 | CLANG_WARN_CONSTANT_CONVERSION = YES; 474 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 475 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 476 | CLANG_WARN_EMPTY_BODY = YES; 477 | CLANG_WARN_ENUM_CONVERSION = YES; 478 | CLANG_WARN_INFINITE_RECURSION = YES; 479 | CLANG_WARN_INT_CONVERSION = YES; 480 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 481 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 482 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 483 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 484 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 485 | CLANG_WARN_STRICT_PROTOTYPES = YES; 486 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 487 | CLANG_WARN_UNREACHABLE_CODE = YES; 488 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 489 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 490 | COPY_PHASE_STRIP = NO; 491 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 492 | ENABLE_NS_ASSERTIONS = NO; 493 | ENABLE_STRICT_OBJC_MSGSEND = YES; 494 | GCC_C_LANGUAGE_STANDARD = gnu99; 495 | GCC_NO_COMMON_BLOCKS = YES; 496 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 497 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 498 | GCC_WARN_UNDECLARED_SELECTOR = YES; 499 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 500 | GCC_WARN_UNUSED_FUNCTION = YES; 501 | GCC_WARN_UNUSED_VARIABLE = YES; 502 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 503 | MTL_ENABLE_DEBUG_INFO = NO; 504 | SDKROOT = iphoneos; 505 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 506 | VALIDATE_PRODUCT = YES; 507 | }; 508 | name = Release; 509 | }; 510 | 607FACF01AFB9204008FA782 /* Debug */ = { 511 | isa = XCBuildConfiguration; 512 | baseConfigurationReference = 669AB9EAD59978E937498CBD /* Pods-WhatsNew_Example.debug.xcconfig */; 513 | buildSettings = { 514 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 515 | INFOPLIST_FILE = WhatsNew/Info.plist; 516 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 517 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 518 | MODULE_NAME = ExampleApp; 519 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 520 | PRODUCT_NAME = "$(TARGET_NAME)"; 521 | SWIFT_VERSION = 4.2; 522 | TARGETED_DEVICE_FAMILY = "1,2"; 523 | }; 524 | name = Debug; 525 | }; 526 | 607FACF11AFB9204008FA782 /* Release */ = { 527 | isa = XCBuildConfiguration; 528 | baseConfigurationReference = 07764618130D3205FA79451C /* Pods-WhatsNew_Example.release.xcconfig */; 529 | buildSettings = { 530 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 531 | INFOPLIST_FILE = WhatsNew/Info.plist; 532 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 533 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 534 | MODULE_NAME = ExampleApp; 535 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 536 | PRODUCT_NAME = "$(TARGET_NAME)"; 537 | SWIFT_VERSION = 4.2; 538 | TARGETED_DEVICE_FAMILY = "1,2"; 539 | }; 540 | name = Release; 541 | }; 542 | 607FACF31AFB9204008FA782 /* Debug */ = { 543 | isa = XCBuildConfiguration; 544 | baseConfigurationReference = F4F03A69224BA466E1CE2417 /* Pods-WhatsNew_Tests.debug.xcconfig */; 545 | buildSettings = { 546 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 547 | GCC_PREPROCESSOR_DEFINITIONS = ( 548 | "DEBUG=1", 549 | "$(inherited)", 550 | ); 551 | INFOPLIST_FILE = Tests/Info.plist; 552 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 553 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 554 | PRODUCT_NAME = "$(TARGET_NAME)"; 555 | SWIFT_VERSION = 4.2; 556 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WhatsNew_Example.app/WhatsNew_Example"; 557 | }; 558 | name = Debug; 559 | }; 560 | 607FACF41AFB9204008FA782 /* Release */ = { 561 | isa = XCBuildConfiguration; 562 | baseConfigurationReference = 4D534311749EA40E5B0F583B /* Pods-WhatsNew_Tests.release.xcconfig */; 563 | buildSettings = { 564 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 565 | INFOPLIST_FILE = Tests/Info.plist; 566 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 567 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 568 | PRODUCT_NAME = "$(TARGET_NAME)"; 569 | SWIFT_VERSION = 4.2; 570 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WhatsNew_Example.app/WhatsNew_Example"; 571 | }; 572 | name = Release; 573 | }; 574 | /* End XCBuildConfiguration section */ 575 | 576 | /* Begin XCConfigurationList section */ 577 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "WhatsNew" */ = { 578 | isa = XCConfigurationList; 579 | buildConfigurations = ( 580 | 607FACED1AFB9204008FA782 /* Debug */, 581 | 607FACEE1AFB9204008FA782 /* Release */, 582 | ); 583 | defaultConfigurationIsVisible = 0; 584 | defaultConfigurationName = Release; 585 | }; 586 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WhatsNew_Example" */ = { 587 | isa = XCConfigurationList; 588 | buildConfigurations = ( 589 | 607FACF01AFB9204008FA782 /* Debug */, 590 | 607FACF11AFB9204008FA782 /* Release */, 591 | ); 592 | defaultConfigurationIsVisible = 0; 593 | defaultConfigurationName = Release; 594 | }; 595 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "WhatsNew_Tests" */ = { 596 | isa = XCConfigurationList; 597 | buildConfigurations = ( 598 | 607FACF31AFB9204008FA782 /* Debug */, 599 | 607FACF41AFB9204008FA782 /* Release */, 600 | ); 601 | defaultConfigurationIsVisible = 0; 602 | defaultConfigurationName = Release; 603 | }; 604 | /* End XCConfigurationList section */ 605 | }; 606 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 607 | } 608 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 0307878F5C4B25DDE79C587BD4383F86 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 11 | 4D9998F0CFE858D65D284884FF9A4DB3 /* Pods-WhatsNew_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E478294EF37EA4AEB233B4C5F4CE35C /* Pods-WhatsNew_Tests-dummy.m */; }; 12 | 515672955E44765D557C9733A00CBA2E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 13 | 646113EE73660F5B4AF4E6B2ABF21369 /* WhatsNewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7A84CDC6D0732F461A7DE8B24B58879 /* WhatsNewViewController.swift */; }; 14 | 7EC1CA6ABF0742DAB7E5B4A25F28DEC3 /* WhatsNew-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F6D20331185AC38D6F96ABE34563A7B9 /* WhatsNew-dummy.m */; }; 15 | 8B8520A1545AECB69AD2BD14C31E84AA /* WhatsNew-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BEB6F444263DE354F76D1B64634FB43A /* WhatsNew-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | AE0A06BC1FA7575600BB565D /* WhatsNewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE0A06BB1FA7575600BB565D /* WhatsNewItem.swift */; }; 17 | AEDF764D1F9BF7F800B4DA1E /* NibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDF764C1F9BF7F800B4DA1E /* NibLoadable.swift */; }; 18 | AEEFC7521FA7B07200B74463 /* WhatsNew.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEEFC7511FA7B07100B74463 /* WhatsNew.swift */; }; 19 | AEEFC7541FA7B5C200B74463 /* PresentationOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEEFC7531FA7B5C200B74463 /* PresentationOption.swift */; }; 20 | AEF432941F991F9E0084D8AD /* WhatsNewItemTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEF432931F991F9E0084D8AD /* WhatsNewItemTextView.swift */; }; 21 | AEF432961F991FAB0084D8AD /* WhatsNewItemTextView.xib in Resources */ = {isa = PBXBuildFile; fileRef = AEF432951F991FAB0084D8AD /* WhatsNewItemTextView.xib */; }; 22 | AEF432981F991FB30084D8AD /* WhatsNewItemImageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = AEF432971F991FB30084D8AD /* WhatsNewItemImageView.xib */; }; 23 | AEF4329A1F991FBD0084D8AD /* WhatsNewItemImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEF432991F991FBD0084D8AD /* WhatsNewItemImageView.swift */; }; 24 | B42DDBB405B841CD84A7BCD3413EC9C7 /* WhatsNew.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5614B6E512636522BFE74654093B540E /* WhatsNew.xib */; }; 25 | D3A3E0DA65E965859A6EFB0AD020C0A3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 26 | F3F4CCC88A0C872F5FEC8C9C5F5D2414 /* Pods-WhatsNew_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 435663F887F471CB7870C8357D6AFD5E /* Pods-WhatsNew_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27 | F72B94266495557D1C01DEBF53BA5B68 /* Pods-WhatsNew_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27CA8504470B5F18EB5D2381A8521481 /* Pods-WhatsNew_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 28 | FE9C4FDB3287EA2334E319908B1637B8 /* Pods-WhatsNew_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D7BF6557A34D75DEA2A8D267400AED4 /* Pods-WhatsNew_Example-dummy.m */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | BFDA70ED04FD335B9BE086F61CC4BF52 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = D627907C4EF6F525762FD647843BA24E; 37 | remoteInfo = WhatsNew; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 1116B9DD2B5D65F9E82998BE5D922B31 /* WhatsNew.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WhatsNew.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 169E315DC2B32D72F4A1C1C66A73C766 /* Pods-WhatsNew_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WhatsNew_Tests-acknowledgements.plist"; sourceTree = ""; }; 44 | 27CA8504470B5F18EB5D2381A8521481 /* Pods-WhatsNew_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WhatsNew_Tests-umbrella.h"; sourceTree = ""; }; 45 | 2E478294EF37EA4AEB233B4C5F4CE35C /* Pods-WhatsNew_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WhatsNew_Tests-dummy.m"; sourceTree = ""; }; 46 | 3864D969D7F832A1DF34D03FDD6B6FF8 /* Pods-WhatsNew_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WhatsNew_Example-acknowledgements.plist"; sourceTree = ""; }; 47 | 3C084CCD8C4FF9BA651A6FA482EBDD03 /* Pods_WhatsNew_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WhatsNew_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | 435663F887F471CB7870C8357D6AFD5E /* Pods-WhatsNew_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WhatsNew_Example-umbrella.h"; sourceTree = ""; }; 49 | 5614B6E512636522BFE74654093B540E /* WhatsNew.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; path = WhatsNew.xib; sourceTree = ""; }; 50 | 5D6ED143E57D36714739817D90FD8740 /* Pods-WhatsNew_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-WhatsNew_Tests.modulemap"; sourceTree = ""; }; 51 | 5D7BF6557A34D75DEA2A8D267400AED4 /* Pods-WhatsNew_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WhatsNew_Example-dummy.m"; sourceTree = ""; }; 52 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 53 | 7426B28509D8938AE159DED67ED3EC8D /* Pods_WhatsNew_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WhatsNew_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 7CCF56FDDF4675C1C1C1F1598B1B7E72 /* Pods-WhatsNew_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WhatsNew_Example-frameworks.sh"; sourceTree = ""; }; 55 | 8043DFD07C694C7BD63BA6DBCBC8AB8B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | 82464D2ABB9199F3E3A749F7D761CC1F /* Pods-WhatsNew_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WhatsNew_Example-resources.sh"; sourceTree = ""; }; 57 | 8C7150187C90654A214B4D71C5770A0B /* Pods-WhatsNew_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WhatsNew_Tests-frameworks.sh"; sourceTree = ""; }; 58 | 8EDF93AA95E80AC37595C348A12C6207 /* WhatsNew-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WhatsNew-prefix.pch"; sourceTree = ""; }; 59 | 90184468AEA1323CF7D8CFFF87D6F0DB /* Pods-WhatsNew_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WhatsNew_Example.release.xcconfig"; sourceTree = ""; }; 60 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 61 | 97D7E03997430872AFB5E5D9C0BE1597 /* Pods-WhatsNew_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-WhatsNew_Example.modulemap"; sourceTree = ""; }; 62 | 9C2555FD2C6EF079B15FDAA971317E07 /* WhatsNew.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = WhatsNew.modulemap; sourceTree = ""; }; 63 | AE0A06BB1FA7575600BB565D /* WhatsNewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewItem.swift; sourceTree = ""; }; 64 | AEDF764C1F9BF7F800B4DA1E /* NibLoadable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NibLoadable.swift; sourceTree = ""; }; 65 | AEEFC7511FA7B07100B74463 /* WhatsNew.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNew.swift; sourceTree = ""; }; 66 | AEEFC7531FA7B5C200B74463 /* PresentationOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationOption.swift; sourceTree = ""; }; 67 | AEF432931F991F9E0084D8AD /* WhatsNewItemTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewItemTextView.swift; sourceTree = ""; }; 68 | AEF432951F991FAB0084D8AD /* WhatsNewItemTextView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WhatsNewItemTextView.xib; sourceTree = ""; }; 69 | AEF432971F991FB30084D8AD /* WhatsNewItemImageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WhatsNewItemImageView.xib; sourceTree = ""; }; 70 | AEF432991F991FBD0084D8AD /* WhatsNewItemImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewItemImageView.swift; sourceTree = ""; }; 71 | B281056ED9A1A17E568C9D211E32AD02 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 72 | B583031B96F6FD8D9B7534E2555F4589 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 73 | B58F457791C9C232882EC7524020D47E /* Pods-WhatsNew_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WhatsNew_Tests.release.xcconfig"; sourceTree = ""; }; 74 | BD6FC406DFEF595A49D1D1F84E2BA50D /* Pods-WhatsNew_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WhatsNew_Tests-acknowledgements.markdown"; sourceTree = ""; }; 75 | BEB6F444263DE354F76D1B64634FB43A /* WhatsNew-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WhatsNew-umbrella.h"; sourceTree = ""; }; 76 | C1915EA79F0C79338E671ECC522CA61E /* Pods-WhatsNew_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WhatsNew_Tests.debug.xcconfig"; sourceTree = ""; }; 77 | C75694724194F6EA1DC761D35F2D7A1F /* Pods-WhatsNew_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WhatsNew_Tests-resources.sh"; sourceTree = ""; }; 78 | D7A84CDC6D0732F461A7DE8B24B58879 /* WhatsNewViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = WhatsNewViewController.swift; sourceTree = ""; }; 79 | D88FC174652AA499BBE56BB376899EAF /* Pods-WhatsNew_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WhatsNew_Example-acknowledgements.markdown"; sourceTree = ""; }; 80 | EB2F7D56EA354D2800864AD448BD5EBB /* WhatsNew.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WhatsNew.xcconfig; sourceTree = ""; }; 81 | EF6B52DFF12BEDED919B8798A178FE9C /* Pods-WhatsNew_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WhatsNew_Example.debug.xcconfig"; sourceTree = ""; }; 82 | F6D20331185AC38D6F96ABE34563A7B9 /* WhatsNew-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WhatsNew-dummy.m"; sourceTree = ""; }; 83 | /* End PBXFileReference section */ 84 | 85 | /* Begin PBXFrameworksBuildPhase section */ 86 | 295627EFCEE765E1AB41AE11F85C3E87 /* Frameworks */ = { 87 | isa = PBXFrameworksBuildPhase; 88 | buildActionMask = 2147483647; 89 | files = ( 90 | 0307878F5C4B25DDE79C587BD4383F86 /* Foundation.framework in Frameworks */, 91 | ); 92 | runOnlyForDeploymentPostprocessing = 0; 93 | }; 94 | 80409A08E68742907328B205C4E94A83 /* Frameworks */ = { 95 | isa = PBXFrameworksBuildPhase; 96 | buildActionMask = 2147483647; 97 | files = ( 98 | 515672955E44765D557C9733A00CBA2E /* Foundation.framework in Frameworks */, 99 | ); 100 | runOnlyForDeploymentPostprocessing = 0; 101 | }; 102 | A95C6759AA3AE795499564A00F6C305B /* Frameworks */ = { 103 | isa = PBXFrameworksBuildPhase; 104 | buildActionMask = 2147483647; 105 | files = ( 106 | D3A3E0DA65E965859A6EFB0AD020C0A3 /* Foundation.framework in Frameworks */, 107 | ); 108 | runOnlyForDeploymentPostprocessing = 0; 109 | }; 110 | /* End PBXFrameworksBuildPhase section */ 111 | 112 | /* Begin PBXGroup section */ 113 | 03E5BA4EB92D6EEC226CD3A2E4D8D38B /* Resources */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 67FFF076015A9FAB7423B017B7F41A88 /* WhatsNew */, 117 | ); 118 | name = Resources; 119 | sourceTree = ""; 120 | }; 121 | 0F0FB531AD8DDAFD0AA722A3A102DCED /* Products */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 7426B28509D8938AE159DED67ED3EC8D /* Pods_WhatsNew_Example.framework */, 125 | 3C084CCD8C4FF9BA651A6FA482EBDD03 /* Pods_WhatsNew_Tests.framework */, 126 | 1116B9DD2B5D65F9E82998BE5D922B31 /* WhatsNew.framework */, 127 | ); 128 | name = Products; 129 | sourceTree = ""; 130 | }; 131 | 18EEA926EBF72AFA67DAD6CBA38CFB58 /* Pods-WhatsNew_Example */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | B583031B96F6FD8D9B7534E2555F4589 /* Info.plist */, 135 | 97D7E03997430872AFB5E5D9C0BE1597 /* Pods-WhatsNew_Example.modulemap */, 136 | D88FC174652AA499BBE56BB376899EAF /* Pods-WhatsNew_Example-acknowledgements.markdown */, 137 | 3864D969D7F832A1DF34D03FDD6B6FF8 /* Pods-WhatsNew_Example-acknowledgements.plist */, 138 | 5D7BF6557A34D75DEA2A8D267400AED4 /* Pods-WhatsNew_Example-dummy.m */, 139 | 7CCF56FDDF4675C1C1C1F1598B1B7E72 /* Pods-WhatsNew_Example-frameworks.sh */, 140 | 82464D2ABB9199F3E3A749F7D761CC1F /* Pods-WhatsNew_Example-resources.sh */, 141 | 435663F887F471CB7870C8357D6AFD5E /* Pods-WhatsNew_Example-umbrella.h */, 142 | EF6B52DFF12BEDED919B8798A178FE9C /* Pods-WhatsNew_Example.debug.xcconfig */, 143 | 90184468AEA1323CF7D8CFFF87D6F0DB /* Pods-WhatsNew_Example.release.xcconfig */, 144 | ); 145 | name = "Pods-WhatsNew_Example"; 146 | path = "Target Support Files/Pods-WhatsNew_Example"; 147 | sourceTree = ""; 148 | }; 149 | 59656C5D0267926F6A73583A93652C41 /* Resources */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 5614B6E512636522BFE74654093B540E /* WhatsNew.xib */, 153 | AEF432951F991FAB0084D8AD /* WhatsNewItemTextView.xib */, 154 | AEF432971F991FB30084D8AD /* WhatsNewItemImageView.xib */, 155 | ); 156 | path = Resources; 157 | sourceTree = ""; 158 | }; 159 | 67FFF076015A9FAB7423B017B7F41A88 /* WhatsNew */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 59656C5D0267926F6A73583A93652C41 /* Resources */, 163 | ); 164 | path = WhatsNew; 165 | sourceTree = ""; 166 | }; 167 | 750EF2FF89D16B278F30C32D34E67C41 /* Support Files */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | 8043DFD07C694C7BD63BA6DBCBC8AB8B /* Info.plist */, 171 | 9C2555FD2C6EF079B15FDAA971317E07 /* WhatsNew.modulemap */, 172 | EB2F7D56EA354D2800864AD448BD5EBB /* WhatsNew.xcconfig */, 173 | F6D20331185AC38D6F96ABE34563A7B9 /* WhatsNew-dummy.m */, 174 | 8EDF93AA95E80AC37595C348A12C6207 /* WhatsNew-prefix.pch */, 175 | BEB6F444263DE354F76D1B64634FB43A /* WhatsNew-umbrella.h */, 176 | ); 177 | name = "Support Files"; 178 | path = "Example/Pods/Target Support Files/WhatsNew"; 179 | sourceTree = ""; 180 | }; 181 | 7DB346D0F39D3F0E887471402A8071AB = { 182 | isa = PBXGroup; 183 | children = ( 184 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 185 | EC9A63CDF5DD5081544D7C1E82C0CB9F /* Development Pods */, 186 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 187 | 0F0FB531AD8DDAFD0AA722A3A102DCED /* Products */, 188 | 97D64C3CC27ADE21AD0E4B09B42B3C19 /* Targets Support Files */, 189 | ); 190 | sourceTree = ""; 191 | }; 192 | 8390020447C7BF7B83DBB94EFA11FF53 /* WhatsNew */ = { 193 | isa = PBXGroup; 194 | children = ( 195 | D7A84CDC6D0732F461A7DE8B24B58879 /* WhatsNewViewController.swift */, 196 | AEF4329B1F991FC40084D8AD /* Items */, 197 | AEDF764E1F9BF7FC00B4DA1E /* Utils */, 198 | ); 199 | path = WhatsNew; 200 | sourceTree = ""; 201 | }; 202 | 85DD6A78AF18A7EB872815F782C58BD4 /* Pods-WhatsNew_Tests */ = { 203 | isa = PBXGroup; 204 | children = ( 205 | B281056ED9A1A17E568C9D211E32AD02 /* Info.plist */, 206 | 5D6ED143E57D36714739817D90FD8740 /* Pods-WhatsNew_Tests.modulemap */, 207 | BD6FC406DFEF595A49D1D1F84E2BA50D /* Pods-WhatsNew_Tests-acknowledgements.markdown */, 208 | 169E315DC2B32D72F4A1C1C66A73C766 /* Pods-WhatsNew_Tests-acknowledgements.plist */, 209 | 2E478294EF37EA4AEB233B4C5F4CE35C /* Pods-WhatsNew_Tests-dummy.m */, 210 | 8C7150187C90654A214B4D71C5770A0B /* Pods-WhatsNew_Tests-frameworks.sh */, 211 | C75694724194F6EA1DC761D35F2D7A1F /* Pods-WhatsNew_Tests-resources.sh */, 212 | 27CA8504470B5F18EB5D2381A8521481 /* Pods-WhatsNew_Tests-umbrella.h */, 213 | C1915EA79F0C79338E671ECC522CA61E /* Pods-WhatsNew_Tests.debug.xcconfig */, 214 | B58F457791C9C232882EC7524020D47E /* Pods-WhatsNew_Tests.release.xcconfig */, 215 | ); 216 | name = "Pods-WhatsNew_Tests"; 217 | path = "Target Support Files/Pods-WhatsNew_Tests"; 218 | sourceTree = ""; 219 | }; 220 | 97D64C3CC27ADE21AD0E4B09B42B3C19 /* Targets Support Files */ = { 221 | isa = PBXGroup; 222 | children = ( 223 | 18EEA926EBF72AFA67DAD6CBA38CFB58 /* Pods-WhatsNew_Example */, 224 | 85DD6A78AF18A7EB872815F782C58BD4 /* Pods-WhatsNew_Tests */, 225 | ); 226 | name = "Targets Support Files"; 227 | sourceTree = ""; 228 | }; 229 | AEDF764E1F9BF7FC00B4DA1E /* Utils */ = { 230 | isa = PBXGroup; 231 | children = ( 232 | AEDF764C1F9BF7F800B4DA1E /* NibLoadable.swift */, 233 | ); 234 | path = Utils; 235 | sourceTree = ""; 236 | }; 237 | AEF4329B1F991FC40084D8AD /* Items */ = { 238 | isa = PBXGroup; 239 | children = ( 240 | AEEFC7511FA7B07100B74463 /* WhatsNew.swift */, 241 | AE0A06BB1FA7575600BB565D /* WhatsNewItem.swift */, 242 | AEEFC7531FA7B5C200B74463 /* PresentationOption.swift */, 243 | AEF432931F991F9E0084D8AD /* WhatsNewItemTextView.swift */, 244 | AEF432991F991FBD0084D8AD /* WhatsNewItemImageView.swift */, 245 | ); 246 | path = Items; 247 | sourceTree = ""; 248 | }; 249 | B99D94E0361A868C56C793635968C2C5 /* WhatsNew */ = { 250 | isa = PBXGroup; 251 | children = ( 252 | 03E5BA4EB92D6EEC226CD3A2E4D8D38B /* Resources */, 253 | 750EF2FF89D16B278F30C32D34E67C41 /* Support Files */, 254 | 8390020447C7BF7B83DBB94EFA11FF53 /* WhatsNew */, 255 | ); 256 | name = WhatsNew; 257 | path = ../..; 258 | sourceTree = ""; 259 | }; 260 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 261 | isa = PBXGroup; 262 | children = ( 263 | D35AF013A5F0BAD4F32504907A52519E /* iOS */, 264 | ); 265 | name = Frameworks; 266 | sourceTree = ""; 267 | }; 268 | D35AF013A5F0BAD4F32504907A52519E /* iOS */ = { 269 | isa = PBXGroup; 270 | children = ( 271 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */, 272 | ); 273 | name = iOS; 274 | sourceTree = ""; 275 | }; 276 | EC9A63CDF5DD5081544D7C1E82C0CB9F /* Development Pods */ = { 277 | isa = PBXGroup; 278 | children = ( 279 | B99D94E0361A868C56C793635968C2C5 /* WhatsNew */, 280 | ); 281 | name = "Development Pods"; 282 | sourceTree = ""; 283 | }; 284 | /* End PBXGroup section */ 285 | 286 | /* Begin PBXHeadersBuildPhase section */ 287 | 9D549A43E4F4DC79BE687E36FB2E3F7D /* Headers */ = { 288 | isa = PBXHeadersBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | 8B8520A1545AECB69AD2BD14C31E84AA /* WhatsNew-umbrella.h in Headers */, 292 | ); 293 | runOnlyForDeploymentPostprocessing = 0; 294 | }; 295 | ADD8A7010926F1341632BE78C52B8F12 /* Headers */ = { 296 | isa = PBXHeadersBuildPhase; 297 | buildActionMask = 2147483647; 298 | files = ( 299 | F72B94266495557D1C01DEBF53BA5B68 /* Pods-WhatsNew_Tests-umbrella.h in Headers */, 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | }; 303 | B4CCF298C5F2B1F96B4ADE17F1125954 /* Headers */ = { 304 | isa = PBXHeadersBuildPhase; 305 | buildActionMask = 2147483647; 306 | files = ( 307 | F3F4CCC88A0C872F5FEC8C9C5F5D2414 /* Pods-WhatsNew_Example-umbrella.h in Headers */, 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | }; 311 | /* End PBXHeadersBuildPhase section */ 312 | 313 | /* Begin PBXNativeTarget section */ 314 | 5677F40DA24678D9D63E3BDDCCF8953E /* Pods-WhatsNew_Example */ = { 315 | isa = PBXNativeTarget; 316 | buildConfigurationList = 7018983067589265E32FADE2C474F50E /* Build configuration list for PBXNativeTarget "Pods-WhatsNew_Example" */; 317 | buildPhases = ( 318 | B81753421AFC179C96CB1E901859A074 /* Sources */, 319 | A95C6759AA3AE795499564A00F6C305B /* Frameworks */, 320 | B4CCF298C5F2B1F96B4ADE17F1125954 /* Headers */, 321 | ); 322 | buildRules = ( 323 | ); 324 | dependencies = ( 325 | CA7C33E6F66673BDC053FAFA4DCE9D65 /* PBXTargetDependency */, 326 | ); 327 | name = "Pods-WhatsNew_Example"; 328 | productName = "Pods-WhatsNew_Example"; 329 | productReference = 7426B28509D8938AE159DED67ED3EC8D /* Pods_WhatsNew_Example.framework */; 330 | productType = "com.apple.product-type.framework"; 331 | }; 332 | A24F7F5EA5E8756782335D05836E039A /* Pods-WhatsNew_Tests */ = { 333 | isa = PBXNativeTarget; 334 | buildConfigurationList = FB9AC03974321CCA84EFC295C3A04A8B /* Build configuration list for PBXNativeTarget "Pods-WhatsNew_Tests" */; 335 | buildPhases = ( 336 | 35EE37B8B78633FA171DCC6CD639471A /* Sources */, 337 | 295627EFCEE765E1AB41AE11F85C3E87 /* Frameworks */, 338 | ADD8A7010926F1341632BE78C52B8F12 /* Headers */, 339 | ); 340 | buildRules = ( 341 | ); 342 | dependencies = ( 343 | ); 344 | name = "Pods-WhatsNew_Tests"; 345 | productName = "Pods-WhatsNew_Tests"; 346 | productReference = 3C084CCD8C4FF9BA651A6FA482EBDD03 /* Pods_WhatsNew_Tests.framework */; 347 | productType = "com.apple.product-type.framework"; 348 | }; 349 | D627907C4EF6F525762FD647843BA24E /* WhatsNew */ = { 350 | isa = PBXNativeTarget; 351 | buildConfigurationList = 80BA23FC3D73EB319DEDD2C28C7EAAB2 /* Build configuration list for PBXNativeTarget "WhatsNew" */; 352 | buildPhases = ( 353 | CFEF3EEBD48921010DA8180A24219B05 /* Sources */, 354 | 80409A08E68742907328B205C4E94A83 /* Frameworks */, 355 | 56541649AF8D1FDDCF7639D89E7E72D3 /* Resources */, 356 | 9D549A43E4F4DC79BE687E36FB2E3F7D /* Headers */, 357 | ); 358 | buildRules = ( 359 | ); 360 | dependencies = ( 361 | ); 362 | name = WhatsNew; 363 | productName = WhatsNew; 364 | productReference = 1116B9DD2B5D65F9E82998BE5D922B31 /* WhatsNew.framework */; 365 | productType = "com.apple.product-type.framework"; 366 | }; 367 | /* End PBXNativeTarget section */ 368 | 369 | /* Begin PBXProject section */ 370 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 371 | isa = PBXProject; 372 | attributes = { 373 | LastSwiftUpdateCheck = 0830; 374 | LastUpgradeCheck = 0930; 375 | TargetAttributes = { 376 | D627907C4EF6F525762FD647843BA24E = { 377 | LastSwiftMigration = 1000; 378 | }; 379 | }; 380 | }; 381 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 382 | compatibilityVersion = "Xcode 3.2"; 383 | developmentRegion = English; 384 | hasScannedForEncodings = 0; 385 | knownRegions = ( 386 | en, 387 | ); 388 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 389 | productRefGroup = 0F0FB531AD8DDAFD0AA722A3A102DCED /* Products */; 390 | projectDirPath = ""; 391 | projectRoot = ""; 392 | targets = ( 393 | 5677F40DA24678D9D63E3BDDCCF8953E /* Pods-WhatsNew_Example */, 394 | A24F7F5EA5E8756782335D05836E039A /* Pods-WhatsNew_Tests */, 395 | D627907C4EF6F525762FD647843BA24E /* WhatsNew */, 396 | ); 397 | }; 398 | /* End PBXProject section */ 399 | 400 | /* Begin PBXResourcesBuildPhase section */ 401 | 56541649AF8D1FDDCF7639D89E7E72D3 /* Resources */ = { 402 | isa = PBXResourcesBuildPhase; 403 | buildActionMask = 2147483647; 404 | files = ( 405 | AEF432981F991FB30084D8AD /* WhatsNewItemImageView.xib in Resources */, 406 | AEF432961F991FAB0084D8AD /* WhatsNewItemTextView.xib in Resources */, 407 | B42DDBB405B841CD84A7BCD3413EC9C7 /* WhatsNew.xib in Resources */, 408 | ); 409 | runOnlyForDeploymentPostprocessing = 0; 410 | }; 411 | /* End PBXResourcesBuildPhase section */ 412 | 413 | /* Begin PBXSourcesBuildPhase section */ 414 | 35EE37B8B78633FA171DCC6CD639471A /* Sources */ = { 415 | isa = PBXSourcesBuildPhase; 416 | buildActionMask = 2147483647; 417 | files = ( 418 | 4D9998F0CFE858D65D284884FF9A4DB3 /* Pods-WhatsNew_Tests-dummy.m in Sources */, 419 | ); 420 | runOnlyForDeploymentPostprocessing = 0; 421 | }; 422 | B81753421AFC179C96CB1E901859A074 /* Sources */ = { 423 | isa = PBXSourcesBuildPhase; 424 | buildActionMask = 2147483647; 425 | files = ( 426 | FE9C4FDB3287EA2334E319908B1637B8 /* Pods-WhatsNew_Example-dummy.m in Sources */, 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | }; 430 | CFEF3EEBD48921010DA8180A24219B05 /* Sources */ = { 431 | isa = PBXSourcesBuildPhase; 432 | buildActionMask = 2147483647; 433 | files = ( 434 | AEEFC7541FA7B5C200B74463 /* PresentationOption.swift in Sources */, 435 | AEF432941F991F9E0084D8AD /* WhatsNewItemTextView.swift in Sources */, 436 | AE0A06BC1FA7575600BB565D /* WhatsNewItem.swift in Sources */, 437 | AEF4329A1F991FBD0084D8AD /* WhatsNewItemImageView.swift in Sources */, 438 | 7EC1CA6ABF0742DAB7E5B4A25F28DEC3 /* WhatsNew-dummy.m in Sources */, 439 | AEEFC7521FA7B07200B74463 /* WhatsNew.swift in Sources */, 440 | AEDF764D1F9BF7F800B4DA1E /* NibLoadable.swift in Sources */, 441 | 646113EE73660F5B4AF4E6B2ABF21369 /* WhatsNewViewController.swift in Sources */, 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | }; 445 | /* End PBXSourcesBuildPhase section */ 446 | 447 | /* Begin PBXTargetDependency section */ 448 | CA7C33E6F66673BDC053FAFA4DCE9D65 /* PBXTargetDependency */ = { 449 | isa = PBXTargetDependency; 450 | name = WhatsNew; 451 | target = D627907C4EF6F525762FD647843BA24E /* WhatsNew */; 452 | targetProxy = BFDA70ED04FD335B9BE086F61CC4BF52 /* PBXContainerItemProxy */; 453 | }; 454 | /* End PBXTargetDependency section */ 455 | 456 | /* Begin XCBuildConfiguration section */ 457 | 157AF0CD5E5AB2A2E74D3B8ECD865185 /* Release */ = { 458 | isa = XCBuildConfiguration; 459 | buildSettings = { 460 | ALWAYS_SEARCH_USER_PATHS = NO; 461 | CLANG_ANALYZER_NONNULL = YES; 462 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; 463 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 464 | CLANG_CXX_LIBRARY = "libc++"; 465 | CLANG_ENABLE_MODULES = YES; 466 | CLANG_ENABLE_OBJC_ARC = YES; 467 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 468 | CLANG_WARN_BOOL_CONVERSION = YES; 469 | CLANG_WARN_COMMA = YES; 470 | CLANG_WARN_CONSTANT_CONVERSION = YES; 471 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 472 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 473 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 474 | CLANG_WARN_EMPTY_BODY = YES; 475 | CLANG_WARN_ENUM_CONVERSION = YES; 476 | CLANG_WARN_INFINITE_RECURSION = YES; 477 | CLANG_WARN_INT_CONVERSION = YES; 478 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 479 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 480 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 481 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 482 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 483 | CLANG_WARN_STRICT_PROTOTYPES = YES; 484 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 485 | CLANG_WARN_UNREACHABLE_CODE = YES; 486 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 487 | CODE_SIGNING_REQUIRED = NO; 488 | COPY_PHASE_STRIP = YES; 489 | ENABLE_NS_ASSERTIONS = NO; 490 | ENABLE_STRICT_OBJC_MSGSEND = YES; 491 | GCC_C_LANGUAGE_STANDARD = gnu99; 492 | GCC_NO_COMMON_BLOCKS = YES; 493 | GCC_PREPROCESSOR_DEFINITIONS = ( 494 | "POD_CONFIGURATION_RELEASE=1", 495 | "$(inherited)", 496 | ); 497 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 498 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 499 | GCC_WARN_UNDECLARED_SELECTOR = YES; 500 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 501 | GCC_WARN_UNUSED_FUNCTION = YES; 502 | GCC_WARN_UNUSED_VARIABLE = YES; 503 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 504 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 505 | STRIP_INSTALLED_PRODUCT = NO; 506 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 507 | SYMROOT = "${SRCROOT}/../build"; 508 | VALIDATE_PRODUCT = YES; 509 | }; 510 | name = Release; 511 | }; 512 | 1B0D16DCD96C73F7DD3D73079794C754 /* Release */ = { 513 | isa = XCBuildConfiguration; 514 | baseConfigurationReference = 90184468AEA1323CF7D8CFFF87D6F0DB /* Pods-WhatsNew_Example.release.xcconfig */; 515 | buildSettings = { 516 | CODE_SIGN_IDENTITY = ""; 517 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 518 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 519 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 520 | CURRENT_PROJECT_VERSION = 1; 521 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 522 | DEFINES_MODULE = YES; 523 | DYLIB_COMPATIBILITY_VERSION = 1; 524 | DYLIB_CURRENT_VERSION = 1; 525 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 526 | ENABLE_STRICT_OBJC_MSGSEND = YES; 527 | GCC_NO_COMMON_BLOCKS = YES; 528 | INFOPLIST_FILE = "Target Support Files/Pods-WhatsNew_Example/Info.plist"; 529 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 530 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 531 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 532 | MACH_O_TYPE = staticlib; 533 | MODULEMAP_FILE = "Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example.modulemap"; 534 | MTL_ENABLE_DEBUG_INFO = NO; 535 | OTHER_LDFLAGS = ""; 536 | OTHER_LIBTOOLFLAGS = ""; 537 | PODS_ROOT = "$(SRCROOT)"; 538 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 539 | PRODUCT_NAME = Pods_WhatsNew_Example; 540 | SDKROOT = iphoneos; 541 | SKIP_INSTALL = YES; 542 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 543 | SWIFT_VERSION = 3.0; 544 | TARGETED_DEVICE_FAMILY = "1,2"; 545 | VERSIONING_SYSTEM = "apple-generic"; 546 | VERSION_INFO_PREFIX = ""; 547 | }; 548 | name = Release; 549 | }; 550 | 2B84E4F131F5327416A790DF84BD3570 /* Debug */ = { 551 | isa = XCBuildConfiguration; 552 | baseConfigurationReference = EF6B52DFF12BEDED919B8798A178FE9C /* Pods-WhatsNew_Example.debug.xcconfig */; 553 | buildSettings = { 554 | CODE_SIGN_IDENTITY = ""; 555 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 556 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 557 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 558 | CURRENT_PROJECT_VERSION = 1; 559 | DEBUG_INFORMATION_FORMAT = dwarf; 560 | DEFINES_MODULE = YES; 561 | DYLIB_COMPATIBILITY_VERSION = 1; 562 | DYLIB_CURRENT_VERSION = 1; 563 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 564 | ENABLE_STRICT_OBJC_MSGSEND = YES; 565 | GCC_NO_COMMON_BLOCKS = YES; 566 | INFOPLIST_FILE = "Target Support Files/Pods-WhatsNew_Example/Info.plist"; 567 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 568 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 569 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 570 | MACH_O_TYPE = staticlib; 571 | MODULEMAP_FILE = "Target Support Files/Pods-WhatsNew_Example/Pods-WhatsNew_Example.modulemap"; 572 | MTL_ENABLE_DEBUG_INFO = YES; 573 | OTHER_LDFLAGS = ""; 574 | OTHER_LIBTOOLFLAGS = ""; 575 | PODS_ROOT = "$(SRCROOT)"; 576 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 577 | PRODUCT_NAME = Pods_WhatsNew_Example; 578 | SDKROOT = iphoneos; 579 | SKIP_INSTALL = YES; 580 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 581 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 582 | SWIFT_VERSION = 3.0; 583 | TARGETED_DEVICE_FAMILY = "1,2"; 584 | VERSIONING_SYSTEM = "apple-generic"; 585 | VERSION_INFO_PREFIX = ""; 586 | }; 587 | name = Debug; 588 | }; 589 | 926B7F33D805F31295517F3CC616F547 /* Release */ = { 590 | isa = XCBuildConfiguration; 591 | baseConfigurationReference = B58F457791C9C232882EC7524020D47E /* Pods-WhatsNew_Tests.release.xcconfig */; 592 | buildSettings = { 593 | CODE_SIGN_IDENTITY = ""; 594 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 595 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 596 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 597 | CURRENT_PROJECT_VERSION = 1; 598 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 599 | DEFINES_MODULE = YES; 600 | DYLIB_COMPATIBILITY_VERSION = 1; 601 | DYLIB_CURRENT_VERSION = 1; 602 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 603 | ENABLE_STRICT_OBJC_MSGSEND = YES; 604 | GCC_NO_COMMON_BLOCKS = YES; 605 | INFOPLIST_FILE = "Target Support Files/Pods-WhatsNew_Tests/Info.plist"; 606 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 607 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 608 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 609 | MACH_O_TYPE = staticlib; 610 | MODULEMAP_FILE = "Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests.modulemap"; 611 | MTL_ENABLE_DEBUG_INFO = NO; 612 | OTHER_LDFLAGS = ""; 613 | OTHER_LIBTOOLFLAGS = ""; 614 | PODS_ROOT = "$(SRCROOT)"; 615 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 616 | PRODUCT_NAME = Pods_WhatsNew_Tests; 617 | SDKROOT = iphoneos; 618 | SKIP_INSTALL = YES; 619 | TARGETED_DEVICE_FAMILY = "1,2"; 620 | VERSIONING_SYSTEM = "apple-generic"; 621 | VERSION_INFO_PREFIX = ""; 622 | }; 623 | name = Release; 624 | }; 625 | C366F14B691D5D24F57BE79C024883D8 /* Debug */ = { 626 | isa = XCBuildConfiguration; 627 | baseConfigurationReference = C1915EA79F0C79338E671ECC522CA61E /* Pods-WhatsNew_Tests.debug.xcconfig */; 628 | buildSettings = { 629 | CODE_SIGN_IDENTITY = ""; 630 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 631 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 632 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 633 | CURRENT_PROJECT_VERSION = 1; 634 | DEBUG_INFORMATION_FORMAT = dwarf; 635 | DEFINES_MODULE = YES; 636 | DYLIB_COMPATIBILITY_VERSION = 1; 637 | DYLIB_CURRENT_VERSION = 1; 638 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 639 | ENABLE_STRICT_OBJC_MSGSEND = YES; 640 | GCC_NO_COMMON_BLOCKS = YES; 641 | INFOPLIST_FILE = "Target Support Files/Pods-WhatsNew_Tests/Info.plist"; 642 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 643 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 644 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 645 | MACH_O_TYPE = staticlib; 646 | MODULEMAP_FILE = "Target Support Files/Pods-WhatsNew_Tests/Pods-WhatsNew_Tests.modulemap"; 647 | MTL_ENABLE_DEBUG_INFO = YES; 648 | OTHER_LDFLAGS = ""; 649 | OTHER_LIBTOOLFLAGS = ""; 650 | PODS_ROOT = "$(SRCROOT)"; 651 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 652 | PRODUCT_NAME = Pods_WhatsNew_Tests; 653 | SDKROOT = iphoneos; 654 | SKIP_INSTALL = YES; 655 | TARGETED_DEVICE_FAMILY = "1,2"; 656 | VERSIONING_SYSTEM = "apple-generic"; 657 | VERSION_INFO_PREFIX = ""; 658 | }; 659 | name = Debug; 660 | }; 661 | CADFB27E6608A92F440337975A8523CE /* Debug */ = { 662 | isa = XCBuildConfiguration; 663 | baseConfigurationReference = EB2F7D56EA354D2800864AD448BD5EBB /* WhatsNew.xcconfig */; 664 | buildSettings = { 665 | CODE_SIGN_IDENTITY = ""; 666 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 667 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 668 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 669 | CURRENT_PROJECT_VERSION = 1; 670 | DEBUG_INFORMATION_FORMAT = dwarf; 671 | DEFINES_MODULE = YES; 672 | DYLIB_COMPATIBILITY_VERSION = 1; 673 | DYLIB_CURRENT_VERSION = 1; 674 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 675 | ENABLE_STRICT_OBJC_MSGSEND = YES; 676 | GCC_NO_COMMON_BLOCKS = YES; 677 | GCC_PREFIX_HEADER = "Target Support Files/WhatsNew/WhatsNew-prefix.pch"; 678 | INFOPLIST_FILE = "Target Support Files/WhatsNew/Info.plist"; 679 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 680 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 681 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 682 | MODULEMAP_FILE = "Target Support Files/WhatsNew/WhatsNew.modulemap"; 683 | MTL_ENABLE_DEBUG_INFO = YES; 684 | PRODUCT_NAME = WhatsNew; 685 | SDKROOT = iphoneos; 686 | SKIP_INSTALL = YES; 687 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 688 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 689 | SWIFT_VERSION = 4.2; 690 | TARGETED_DEVICE_FAMILY = "1,2"; 691 | VERSIONING_SYSTEM = "apple-generic"; 692 | VERSION_INFO_PREFIX = ""; 693 | }; 694 | name = Debug; 695 | }; 696 | D7B1487F48E36BAD2CEF0AFCA4908B67 /* Debug */ = { 697 | isa = XCBuildConfiguration; 698 | buildSettings = { 699 | ALWAYS_SEARCH_USER_PATHS = NO; 700 | CLANG_ANALYZER_NONNULL = YES; 701 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; 702 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 703 | CLANG_CXX_LIBRARY = "libc++"; 704 | CLANG_ENABLE_MODULES = YES; 705 | CLANG_ENABLE_OBJC_ARC = YES; 706 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 707 | CLANG_WARN_BOOL_CONVERSION = YES; 708 | CLANG_WARN_COMMA = YES; 709 | CLANG_WARN_CONSTANT_CONVERSION = YES; 710 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 711 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 712 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 713 | CLANG_WARN_EMPTY_BODY = YES; 714 | CLANG_WARN_ENUM_CONVERSION = YES; 715 | CLANG_WARN_INFINITE_RECURSION = YES; 716 | CLANG_WARN_INT_CONVERSION = YES; 717 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 718 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 719 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 720 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 721 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 722 | CLANG_WARN_STRICT_PROTOTYPES = YES; 723 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 724 | CLANG_WARN_UNREACHABLE_CODE = YES; 725 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 726 | CODE_SIGNING_REQUIRED = NO; 727 | COPY_PHASE_STRIP = NO; 728 | ENABLE_STRICT_OBJC_MSGSEND = YES; 729 | ENABLE_TESTABILITY = YES; 730 | GCC_C_LANGUAGE_STANDARD = gnu99; 731 | GCC_DYNAMIC_NO_PIC = NO; 732 | GCC_NO_COMMON_BLOCKS = YES; 733 | GCC_OPTIMIZATION_LEVEL = 0; 734 | GCC_PREPROCESSOR_DEFINITIONS = ( 735 | "POD_CONFIGURATION_DEBUG=1", 736 | "DEBUG=1", 737 | "$(inherited)", 738 | ); 739 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 740 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 741 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 742 | GCC_WARN_UNDECLARED_SELECTOR = YES; 743 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 744 | GCC_WARN_UNUSED_FUNCTION = YES; 745 | GCC_WARN_UNUSED_VARIABLE = YES; 746 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 747 | ONLY_ACTIVE_ARCH = YES; 748 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 749 | STRIP_INSTALLED_PRODUCT = NO; 750 | SYMROOT = "${SRCROOT}/../build"; 751 | }; 752 | name = Debug; 753 | }; 754 | E79791646BB11861CD0CCB99C42FC32B /* Release */ = { 755 | isa = XCBuildConfiguration; 756 | baseConfigurationReference = EB2F7D56EA354D2800864AD448BD5EBB /* WhatsNew.xcconfig */; 757 | buildSettings = { 758 | CODE_SIGN_IDENTITY = ""; 759 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 760 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 761 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 762 | CURRENT_PROJECT_VERSION = 1; 763 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 764 | DEFINES_MODULE = YES; 765 | DYLIB_COMPATIBILITY_VERSION = 1; 766 | DYLIB_CURRENT_VERSION = 1; 767 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 768 | ENABLE_STRICT_OBJC_MSGSEND = YES; 769 | GCC_NO_COMMON_BLOCKS = YES; 770 | GCC_PREFIX_HEADER = "Target Support Files/WhatsNew/WhatsNew-prefix.pch"; 771 | INFOPLIST_FILE = "Target Support Files/WhatsNew/Info.plist"; 772 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 773 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 774 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 775 | MODULEMAP_FILE = "Target Support Files/WhatsNew/WhatsNew.modulemap"; 776 | MTL_ENABLE_DEBUG_INFO = NO; 777 | PRODUCT_NAME = WhatsNew; 778 | SDKROOT = iphoneos; 779 | SKIP_INSTALL = YES; 780 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 781 | SWIFT_VERSION = 4.2; 782 | TARGETED_DEVICE_FAMILY = "1,2"; 783 | VERSIONING_SYSTEM = "apple-generic"; 784 | VERSION_INFO_PREFIX = ""; 785 | }; 786 | name = Release; 787 | }; 788 | /* End XCBuildConfiguration section */ 789 | 790 | /* Begin XCConfigurationList section */ 791 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 792 | isa = XCConfigurationList; 793 | buildConfigurations = ( 794 | D7B1487F48E36BAD2CEF0AFCA4908B67 /* Debug */, 795 | 157AF0CD5E5AB2A2E74D3B8ECD865185 /* Release */, 796 | ); 797 | defaultConfigurationIsVisible = 0; 798 | defaultConfigurationName = Release; 799 | }; 800 | 7018983067589265E32FADE2C474F50E /* Build configuration list for PBXNativeTarget "Pods-WhatsNew_Example" */ = { 801 | isa = XCConfigurationList; 802 | buildConfigurations = ( 803 | 2B84E4F131F5327416A790DF84BD3570 /* Debug */, 804 | 1B0D16DCD96C73F7DD3D73079794C754 /* Release */, 805 | ); 806 | defaultConfigurationIsVisible = 0; 807 | defaultConfigurationName = Release; 808 | }; 809 | 80BA23FC3D73EB319DEDD2C28C7EAAB2 /* Build configuration list for PBXNativeTarget "WhatsNew" */ = { 810 | isa = XCConfigurationList; 811 | buildConfigurations = ( 812 | CADFB27E6608A92F440337975A8523CE /* Debug */, 813 | E79791646BB11861CD0CCB99C42FC32B /* Release */, 814 | ); 815 | defaultConfigurationIsVisible = 0; 816 | defaultConfigurationName = Release; 817 | }; 818 | FB9AC03974321CCA84EFC295C3A04A8B /* Build configuration list for PBXNativeTarget "Pods-WhatsNew_Tests" */ = { 819 | isa = XCConfigurationList; 820 | buildConfigurations = ( 821 | C366F14B691D5D24F57BE79C024883D8 /* Debug */, 822 | 926B7F33D805F31295517F3CC616F547 /* Release */, 823 | ); 824 | defaultConfigurationIsVisible = 0; 825 | defaultConfigurationName = Release; 826 | }; 827 | /* End XCConfigurationList section */ 828 | }; 829 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 830 | } 831 | --------------------------------------------------------------------------------