building static libraries for ios with cocoapods

23
Building static libraries for iOS with [email protected]

Upload: sigmapoint

Post on 07-May-2015

2.009 views

Category:

Technology


0 download

DESCRIPTION

If you ever wondered how to easily develop and manage your own libraries for iOS and OS X seek no further! Watch the presentation and read our blog to find a solution. If you have any questions just drop me an email or tweet :)

TRANSCRIPT

Page 1: Building static libraries for iOS with CocoaPods

Building static libraries for iOS with

[email protected]

Page 2: Building static libraries for iOS with CocoaPods

• What is CocoaPods? • Local CocoaPods dependencies. • Building a distribution library. • One library - 5 different architectures. • Avoiding collisions in other projects. • Final thoughts.

Roadmap:

Page 3: Building static libraries for iOS with CocoaPods

CocoaPods is the dependency manager for Objective-C projects. It has thousands of

libraries and can help you scale your projects elegantly. [http://cocoapods.org]

Page 4: Building static libraries for iOS with CocoaPods

Podfile:pod 'CocoaLumberjack', '~> 1.7.0' pod 'AFNetworking', '~> 1.3.3' pod 'UIView+AutoLayout', '~> 1.1.0' pod 'MagicalRecord', '~> 2.2' pod 'Reachability', '~> 3.1.1' pod 'UIAlertView-Blocks', '~> 0.0.1'

Terminal:$ pod install

Page 5: Building static libraries for iOS with CocoaPods

Semantic versioning: !

• Major.Minor.Patch -> 2.0.1 • Major - incompatible API changes • Minor - added features but backward compatible • Patch - backward compatible bug fixes

int add(int a, int b) { return a-b; } // 1.0.0

double add(int a) { return 3.14+a; }int add(int a, int b, int c=0) { return a+b+c; }int add(int a, int b) { return a+b; } // x.y.z

Page 6: Building static libraries for iOS with CocoaPods

CocoaPods project structure

Page 7: Building static libraries for iOS with CocoaPods

Podspec file

Pod::Spec.new do |s| s.name = "NetworkLib" s.version = “1.0.0” s.platform = :ios, '7.0' s.source_files = 'NetworkLib', 'NetworkLib/**/*.{h,m}' s.public_header_files = 'NetworkLib/**/*.h' s.resources = "NetworkLib/*.png" s.framework = 'SystemConfiguration' s.requires_arc = true s.dependency 'AFNetworking' end

Page 8: Building static libraries for iOS with CocoaPods

Local CocoaPods dependency

$ pod 'NetworkLib', :path => '../NetworkLib'

git fork CocoaPods dependency$ pod 'WebViewJavascriptBridge', :git => ‘https://github.com/burczyk/WebViewJavascriptBridge/', :commit => '5183c4c'

Page 9: Building static libraries for iOS with CocoaPods

Demo #1

Page 10: Building static libraries for iOS with CocoaPods

Building distribution library

xcodebuild -workspace NetworkLib.xcworkspace -scheme NetworkLib -sdk iphonesimulator -configuration Debug

lipo -create lib1.a lib2.a -output libMultipleArch.a

Page 11: Building static libraries for iOS with CocoaPods

Aggregate Lib script

Page 12: Building static libraries for iOS with CocoaPods

Build all supported architectures

$ lipo —info libNetworkingLib-debug-0.1.a !!Architectures in the fat file: libNetworkLib-debug-0.1.a are: armv7 armv7s i386 x86_64 arm64

Page 13: Building static libraries for iOS with CocoaPods

Copy files phase & results

Page 14: Building static libraries for iOS with CocoaPods

Demo #2

Page 15: Building static libraries for iOS with CocoaPods

Symbol collisions

What happens if user adds AFNetworking to his app?

Page 16: Building static libraries for iOS with CocoaPods

Symbols investigation$ nm libNetworkLib-debug-0.1.a | grep AFN !!000000000000bea0 s -[UIWebView(_AFNetworking) af_HTTPRequestOperation].eh !0000000000000030 t -[UIWebView(_AFNetworking) af_setHTTPRequestOperation:] !000000000000bec8 s -[UIWebView(_AFNetworking) af_setHTTPRequestOperation:].eh !0000000000000190 t ___44-[UIWebView(AFNetworking) requestSerializer]_block_invoke !000000000000bf18 s ___44-[UIWebView(AFNetworking) requestSerializer]_block_invoke.eh

Page 17: Building static libraries for iOS with CocoaPods

Symbol collisions solutions

• Pretend they don’t exist ;)

• Write in docs which dependencies are required

• Export all dependencies’ headers

• Build library with prefixed symbols

Page 18: Building static libraries for iOS with CocoaPods

Exporting all symbols

http://pdx.esri.com/blog/2013/12/13/namespacing-dependencies/

nm $CODESIGNING_FOLDER_PATH -j | sort | uniq | grep "_OBJC_CLASS_\$_" | grep -v "\$_NS" | sed …

//NamespacedDependencies.h: !#ifndef AFHTTPSessionManager #define AFHTTPSessionManager __NS_SYMBOL(AFHTTPSessionManager) #endif

AFHTTPSessionManager —> SIGMA_AFHTTPSessionManager

Page 19: Building static libraries for iOS with CocoaPods

Configuring Pods & lib to use prefixed symbols

Page 20: Building static libraries for iOS with CocoaPods

Symbols re-investigation

$ nm libNetworkLib-debug-0.1.a | grep SIGMA !!000000000000b720 s l_OBJC_$_CATEGORY_SIGMA_AFURLConnectionOperation_$__UIProgressView !000000000000b6d8 s l_OBJC_$_PROP_LIST_SIGMA_AFURLConnectionOperation_$__UIProgressView !U _OBJC_CLASS_$_SIGMA_AFHTTPRequestOperation !U _OBJC_CLASS_$_SIGMA_AFHTTPRequestSerializer !U _OBJC_CLASS_$_SIGMA_AFHTTPResponseSerializer

Page 21: Building static libraries for iOS with CocoaPods

Demo #3

Page 22: Building static libraries for iOS with CocoaPods

• Easy development • Clean git repo • Easy switching from local podspec to static

library • Shell & classic build script sometimes

necessary • Only one step to put your lib to global repo

Summary

Page 23: Building static libraries for iOS with CocoaPods

Contact: [email protected] @KamilBurczyk

Thank you!

Links: http://cocoapods.org/

http://pdx.esri.com/blog/2013/12/13/namespacing-dependencies/ http://blog.sigmapoint.pl/