SlideShare a Scribd company logo
Connecting with the
Enterprise
The how and why of Enterprise
integrations with RubyMotion
Who the heck is this guy?
Kevin Poorman,Architect at West Monroe Partners
@codefriar -- Hey, I just met you,And this is crazy, But here's my twitter, So follow me, maybe!
Boring corporate bio here.
-- West Monroe Partners.
#MyBabyDaughterTessa!, #Homebrew(beer), #Ruby,
#AngularJS, #Iot, #Salesforce, #!Java, #!Eclipse,
#FriendsDontLetFriendsUseEclipse
#!boringCorporateness
Agenda
1. Why Enterprise software?
2. Challenges - We'll need a Young priest and an Old
priest
3. Tools - We can do it!
4. A Salesforce Example
Why Enterprise Software?
Flappy birds versus Email.
This is an interactive bit.
Why Enterprise Software?
so chart. much up and to the right. wow.
Why Enterprise Software?
Enterprise Software Stinks.
Design is not simply art, it is the
elegance of function.
-- F. Porsche
Challenges
Lies, Damn Lies, and SDK's
1. Rest Apis Rest "ish" Apis, Soap Apis and SDKs
2. Authentication - Oauth or else
3. Data Integrity and Security
Tools
Time for the how
1. Cocoapods
— ZKsForce
2. Gems
— AFMotion
3. Rakefile!
An example with Enterprise CRM Software vendor Salesforce.
Resetting passwords like a Boss.
Talk is cheap, Show me the Code.
— Linus Torvald
Enter the Rakefile: Frameworks
### Application Frameworks
# You can *add* to this as neccessary but this is the minimum required
# for Salesforce iOS SDK Use.
app.frameworks += %w(CFNetwork CoreData MobileCoreServices SystemConfiguration Security)
app.frameworks += %w(MessageUI QuartzCore OpenGLES CoreGraphics sqlite3)
— How do you know which ones you need?
(lucky) ? Docs : Build Errors
Enter the Rakefile: Libraries
### Additional libraries needed for Salesforce iOS SDK
# You can generally add just about any dylib or static .a lib this way
# These are system dylibs
app.libs << "/usr/lib/libxml2.2.dylib"
app.libs << "/usr/lib/libsqlite3.0.dylib"
app.libs << "/usr/lib/libz.dylib"
# These are provided by Salesforces' iOS SDK.
app.libs << "vendor/openssl/libcrypto.a"
app.libs << "vendor/openssl/libssl.a"
# app.libs << "vendor/RestKit/libRestKit.a"
# app.libs << "vendor/SalesforceCommonUtils/libSalesforceCommonUtils.a"
# app.libs << "vendor/SalesforceNativeSDK/libSalesforceNativeSDK.a"
# app.libs << "vendor/SalesforceOAuth/libSalesforceOAuth.a"
app.libs << "vendor/sqlcipher/libsqlcipher.a"
# app.libs << "vendor/SalesforceSDKCore/libSalesforceSDKCore.a"
app.libs << "vendor/sqlcipher/libsqlcipher.a"
Enter the Rakefile: Vendor'd Projects
# RestKit
app.vendor_project "vendor/RestKit",
:static,
:headers_dir => "RestKit"
# Salesforce Common Utils
app.vendor_project "vendor/SalesforceCommonUtils",
:static,
:headers_dir => "Headers/SalesforceCommonUtils"
Enter the RakeFile: When good vendors go bad
# Salesforce Native SDK
app.vendor_project "vendor/SalesforceNativeSDK",
:static,
:headers_dir => "include/SalesforceNativeSDK"
Warning, a wall of boring, soulless, corporate code is
coming.
class AppDelegate
attr_accessor :window, :initialLoginSuccessBlock, :initialLoginFailureBlock
# def OAuthLoginDomain()
# # You can manually override and force your app to use
# # a sandbox by changing this to test.salesforce.com
# "login.salesforce.com"
# end
def RemoteAccessConsumerKey()
# Specify your connected app's consumer key here
"3MVG9A2kN3Bn17hsUZHiKXv6UUn36wtG7rPTlcsyH8K4jIUB2O2CU4dHNILQ_6lD_l9uDom7TjTSNEfRUE6PU"
end
def OAuthRedirectURI()
# This must match the redirect url specified in your
# connected app settings. This is a fake url scheme
# but for a mobile app, so long as it matches you're good.
"testsfdc:///mobilesdk/detect/oauth/done"
end
def dealloc()
NSNotificationCenter.defaultCenter.removeObserver(self, name:"kSFUserLogoutNotification", object:SFAuthenticationManager.sharedManager)
NSNotificationCenter.defaultCenter.removeObserver(self, name:"kSFLoginHostChangedNotification", object:SFAuthenticationManager.sharedManager)
end
def application(application, didFinishLaunchingWithOptions:launchOptions)
if self
SFLogger.setLogLevel(SFLogLevelDebug)
SFAccountManager.setClientId(RemoteAccessConsumerKey())
SFAccountManager.setRedirectUri(OAuthRedirectURI())
SFAccountManager.setScopes(NSSet.setWithObjects("api", nil))
NSNotificationCenter.defaultCenter.addObserver(self, selector: :logoutInitiated, name: "kSFUserLogoutNotification", object:SFAuthenticationManager.sharedManager)
NSNotificationCenter.defaultCenter.addObserver(self, selector: :loginHostChanged, name: "kSFLoginHostChangedNotification", object:SFAuthenticationManager.sharedManager)
@weakSelf = WeakRef.new(self)
self.initialLoginSuccessBlock = lambda { |info|
@weakSelf.setupRootViewController
}
self.initialLoginFailureBlock = lambda { |info,error|
SFAuthenticationManager.sharedManager.logout
}
end
self.window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
self.initializeAppViewState
SFAuthenticationManager.sharedManager.loginWithCompletion(self.initialLoginSuccessBlock, failure:self.initialLoginFailureBlock)
true
end
def initializeAppViewState()
@window.rootViewController = InitialViewController.alloc.initWithNibName(nil, bundle:nil)
@window.makeKeyAndVisible
end
def setupRootViewController()
navVC = UINavigationController.alloc.initWithRootViewController(HomeScreen.new)
@window.rootViewController = navVC
end
def logoutInitiated(notification)
self.log.SFLogLevelDebug(msg:"Logout Notification Recieved. Resetting App")
self.initializeAppViewState
SFAuthenticationManager.sharedManager.loginWithCompletion(self.initialLoginSuccessBlock, failure:self.initialLoginFailureBlock)
end
def loginHostChanged(notification)
self.log.SFLogLevelDebug(msg:"Login Host Changed Notification Recieved. Resetting App")
self.initializeAppViewState
SFAuthenticationManager.sharedManager.loginWithCompletion(self.initialLoginSuccessBlock, failure:self.initialLoginFailureBlock)
end
end
And now for the actually useful bit in all that
def setupRootViewController()
# Yeah, if you could just replace the root view controller with a ProMotion
# Screen, that'd be great.
navVC = UINavigationController.alloc.initWithRootViewController(HomeScreen.new)
@window.rootViewController = navVC
end
Using the SDK Functions
def query_sf_for_users
results = SFRestAPI.sharedInstance.performSOQLQuery(
# Salesforce has a fun variant on Sql called
# "SOQL" or Salesforce Object Query Language.
# First Argument is the Query we want to run.
"SELECT id, Name, LastName FROM user",
failBlock: lambda {|e| ap e },
# Method is a fun Method that invokes the named
# method as a lambda.
completeBlock: method(:sort_results)
)
end
Using the SDK functions
def reset_password args
UIAlertView.alert("Reset Users Password?",
buttons: ["Cancel", "OK"],
message: "Salesforce will reset their password!") { |button|
if button == "OK"
results = SFRestAPI.sharedInstance.requestPasswordResetForUser(
@id, # id of user to invoke password reset.
failBlock: lambda {|e| ap e },
completeBlock: method(:password_reset_complete)
)
end
}
end
def password_reset_complete response
if(Twitter.accounts.size > 0)
UIAlertView.alert("Password Reset!",
buttons: ["OK", "Tweet"]) { |button|
tweet if button == "Tweet"
}
end
end
ObjC2RubyMotion
Turns this:
RootViewController *rootVC = [[RootViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:rootVC];
self.window.rootViewController = navVC;
Into this:
rootVC = RootViewController.alloc.initWithNibName(nil, bundle:nil)
navVC = UINavigationController.alloc.initWithRootViewController(rootVC)
self.window.rootViewController = navVC
Q & A
Where we A some Q's
Comments? Snide Remarks?
Thank You!
Everything should be as simple as possible, but no
simpler.
-- A. Einstein
Ps: Investigative reporters have discovered that RM 3.5,
will include a third new Ruby Compiler -- for Windows
and Windows Phone 8.1, this will, of course, be the only
redeeming feature of Windows*.

More Related Content

PPT
The Future of Selenium Testing for Mobile Web and Native Apps
PDF
Building Mobile Friendly APIs in Rails
PDF
20150319 testotipsio
PPTX
You are not_hiding_from_me_.net
PDF
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
PDF
Ionic으로 모바일앱 만들기 #3
PPTX
Building RESTful APIs w/ Grape
PDF
iPhone Coding For Web Developers
The Future of Selenium Testing for Mobile Web and Native Apps
Building Mobile Friendly APIs in Rails
20150319 testotipsio
You are not_hiding_from_me_.net
How React Native, Appium and me made each other shine @ContinuousDeliveryAmst...
Ionic으로 모바일앱 만들기 #3
Building RESTful APIs w/ Grape
iPhone Coding For Web Developers

What's hot (20)

PPTX
Agility Requires Safety
PDF
Selenium, Appium, and Robots!
PDF
selenium-2-mobile-web-testing
PDF
Calabash Andoird + Calabash iOS
PPTX
Intro to Silex
PDF
Testing Native iOS Apps with Appium
PPTX
The Power of a Great API
KEY
Titanium appcelerator best practices
PDF
Building Rich Applications with Appcelerator
PDF
Travis and fastlane
PDF
Best Practices in apps development with Titanium Appcelerator
PDF
E2E testing Single Page Apps and APIs with Cucumber.js and Puppeteer
ODP
YAPC::NA 2007 - Epic Perl Coding
PDF
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
PPTX
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
PDF
Rick Blalock: Your Apps are Leaking - Controlling Memory Leaks
PDF
Titanium - Making the most of your single thread
PDF
Put an end to regression with codeception testing
PPTX
Jasmine with JS-Test-Driver
PDF
Composer at Scale, Release and Dependency Management
Agility Requires Safety
Selenium, Appium, and Robots!
selenium-2-mobile-web-testing
Calabash Andoird + Calabash iOS
Intro to Silex
Testing Native iOS Apps with Appium
The Power of a Great API
Titanium appcelerator best practices
Building Rich Applications with Appcelerator
Travis and fastlane
Best Practices in apps development with Titanium Appcelerator
E2E testing Single Page Apps and APIs with Cucumber.js and Puppeteer
YAPC::NA 2007 - Epic Perl Coding
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
Rick Blalock: Your Apps are Leaking - Controlling Memory Leaks
Titanium - Making the most of your single thread
Put an end to regression with codeception testing
Jasmine with JS-Test-Driver
Composer at Scale, Release and Dependency Management
Ad

Similar to Connecting with the enterprise - The how and why of connecting to Enterprise Software Systems with RubyMotion (20)

PDF
Baruco 2014 - Rubymotion Workshop
PDF
Crossing the Bridge: Connecting Rails and your Front-end Framework
PDF
Mobile App Feature Configuration and A/B Experiments
PDF
TorqueBox
PDF
Javaland 2017: "You´ll do microservices now". Now what?
PDF
Become a webdeveloper - AKAICamp Beginner #1
PDF
Behavior & Specification Driven Development in PHP - #OpenWest
PDF
Mobile Development integration tests
PDF
Atmosphere Conference 2015: The 10 Myths of DevOps
PDF
Paris Web - Javascript as a programming language
PDF
Cocoapods and Most common used library in Swift
PDF
I Love APIs - Oct 2015
PDF
Appium mobile web+dev conference
PDF
Appium workship, Mobile Web+Dev Conference
PDF
Testing Big in JavaScript
PPTX
Building Large Scale PHP Web Applications with Laravel 4
PDF
Practical WebAssembly with Apex, wasmRS, and nanobus
PDF
"I have a framework idea" - Repeat less, share more.
PPTX
Using Ruby in Android Development
PPTX
Intro to Rails
Baruco 2014 - Rubymotion Workshop
Crossing the Bridge: Connecting Rails and your Front-end Framework
Mobile App Feature Configuration and A/B Experiments
TorqueBox
Javaland 2017: "You´ll do microservices now". Now what?
Become a webdeveloper - AKAICamp Beginner #1
Behavior & Specification Driven Development in PHP - #OpenWest
Mobile Development integration tests
Atmosphere Conference 2015: The 10 Myths of DevOps
Paris Web - Javascript as a programming language
Cocoapods and Most common used library in Swift
I Love APIs - Oct 2015
Appium mobile web+dev conference
Appium workship, Mobile Web+Dev Conference
Testing Big in JavaScript
Building Large Scale PHP Web Applications with Laravel 4
Practical WebAssembly with Apex, wasmRS, and nanobus
"I have a framework idea" - Repeat less, share more.
Using Ruby in Android Development
Intro to Rails
Ad

More from Kevin Poorman (8)

PPTX
10 Principles of Apex Testing
PDF
10 principles of apex testing
PPTX
Mac gyver df14 - final
PPTX
Ionic on visualforce and sf1 df14
PPTX
Finding a good development partner
PPTX
Ci of js and apex using jasmine, phantom js and drone io df14
PPTX
Apex for humans
PPTX
Apex 10 commandments df14
10 Principles of Apex Testing
10 principles of apex testing
Mac gyver df14 - final
Ionic on visualforce and sf1 df14
Finding a good development partner
Ci of js and apex using jasmine, phantom js and drone io df14
Apex for humans
Apex 10 commandments df14

Recently uploaded (20)

PDF
Empathic Computing: Creating Shared Understanding
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
cuic standard and advanced reporting.pdf
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Electronic commerce courselecture one. Pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
KodekX | Application Modernization Development
PDF
Spectral efficient network and resource selection model in 5G networks
Empathic Computing: Creating Shared Understanding
MYSQL Presentation for SQL database connectivity
Understanding_Digital_Forensics_Presentation.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
20250228 LYD VKU AI Blended-Learning.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Advanced methodologies resolving dimensionality complications for autism neur...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Network Security Unit 5.pdf for BCA BBA.
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
cuic standard and advanced reporting.pdf
NewMind AI Weekly Chronicles - August'25 Week I
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
Electronic commerce courselecture one. Pdf
Chapter 3 Spatial Domain Image Processing.pdf
KodekX | Application Modernization Development
Spectral efficient network and resource selection model in 5G networks

Connecting with the enterprise - The how and why of connecting to Enterprise Software Systems with RubyMotion

  • 1. Connecting with the Enterprise The how and why of Enterprise integrations with RubyMotion
  • 2. Who the heck is this guy? Kevin Poorman,Architect at West Monroe Partners @codefriar -- Hey, I just met you,And this is crazy, But here's my twitter, So follow me, maybe! Boring corporate bio here. -- West Monroe Partners. #MyBabyDaughterTessa!, #Homebrew(beer), #Ruby, #AngularJS, #Iot, #Salesforce, #!Java, #!Eclipse, #FriendsDontLetFriendsUseEclipse #!boringCorporateness
  • 3. Agenda 1. Why Enterprise software? 2. Challenges - We'll need a Young priest and an Old priest 3. Tools - We can do it! 4. A Salesforce Example
  • 4. Why Enterprise Software? Flappy birds versus Email. This is an interactive bit.
  • 5. Why Enterprise Software? so chart. much up and to the right. wow.
  • 6. Why Enterprise Software? Enterprise Software Stinks. Design is not simply art, it is the elegance of function. -- F. Porsche
  • 7. Challenges Lies, Damn Lies, and SDK's 1. Rest Apis Rest "ish" Apis, Soap Apis and SDKs 2. Authentication - Oauth or else 3. Data Integrity and Security
  • 8. Tools Time for the how 1. Cocoapods — ZKsForce 2. Gems — AFMotion 3. Rakefile!
  • 9. An example with Enterprise CRM Software vendor Salesforce. Resetting passwords like a Boss. Talk is cheap, Show me the Code. — Linus Torvald
  • 10. Enter the Rakefile: Frameworks ### Application Frameworks # You can *add* to this as neccessary but this is the minimum required # for Salesforce iOS SDK Use. app.frameworks += %w(CFNetwork CoreData MobileCoreServices SystemConfiguration Security) app.frameworks += %w(MessageUI QuartzCore OpenGLES CoreGraphics sqlite3) — How do you know which ones you need? (lucky) ? Docs : Build Errors
  • 11. Enter the Rakefile: Libraries ### Additional libraries needed for Salesforce iOS SDK # You can generally add just about any dylib or static .a lib this way # These are system dylibs app.libs << "/usr/lib/libxml2.2.dylib" app.libs << "/usr/lib/libsqlite3.0.dylib" app.libs << "/usr/lib/libz.dylib" # These are provided by Salesforces' iOS SDK. app.libs << "vendor/openssl/libcrypto.a" app.libs << "vendor/openssl/libssl.a" # app.libs << "vendor/RestKit/libRestKit.a" # app.libs << "vendor/SalesforceCommonUtils/libSalesforceCommonUtils.a" # app.libs << "vendor/SalesforceNativeSDK/libSalesforceNativeSDK.a" # app.libs << "vendor/SalesforceOAuth/libSalesforceOAuth.a" app.libs << "vendor/sqlcipher/libsqlcipher.a" # app.libs << "vendor/SalesforceSDKCore/libSalesforceSDKCore.a" app.libs << "vendor/sqlcipher/libsqlcipher.a"
  • 12. Enter the Rakefile: Vendor'd Projects # RestKit app.vendor_project "vendor/RestKit", :static, :headers_dir => "RestKit" # Salesforce Common Utils app.vendor_project "vendor/SalesforceCommonUtils", :static, :headers_dir => "Headers/SalesforceCommonUtils"
  • 13. Enter the RakeFile: When good vendors go bad # Salesforce Native SDK app.vendor_project "vendor/SalesforceNativeSDK", :static, :headers_dir => "include/SalesforceNativeSDK" Warning, a wall of boring, soulless, corporate code is coming.
  • 14. class AppDelegate attr_accessor :window, :initialLoginSuccessBlock, :initialLoginFailureBlock # def OAuthLoginDomain() # # You can manually override and force your app to use # # a sandbox by changing this to test.salesforce.com # "login.salesforce.com" # end def RemoteAccessConsumerKey() # Specify your connected app's consumer key here "3MVG9A2kN3Bn17hsUZHiKXv6UUn36wtG7rPTlcsyH8K4jIUB2O2CU4dHNILQ_6lD_l9uDom7TjTSNEfRUE6PU" end def OAuthRedirectURI() # This must match the redirect url specified in your # connected app settings. This is a fake url scheme # but for a mobile app, so long as it matches you're good. "testsfdc:///mobilesdk/detect/oauth/done" end def dealloc() NSNotificationCenter.defaultCenter.removeObserver(self, name:"kSFUserLogoutNotification", object:SFAuthenticationManager.sharedManager) NSNotificationCenter.defaultCenter.removeObserver(self, name:"kSFLoginHostChangedNotification", object:SFAuthenticationManager.sharedManager) end def application(application, didFinishLaunchingWithOptions:launchOptions) if self SFLogger.setLogLevel(SFLogLevelDebug) SFAccountManager.setClientId(RemoteAccessConsumerKey()) SFAccountManager.setRedirectUri(OAuthRedirectURI()) SFAccountManager.setScopes(NSSet.setWithObjects("api", nil)) NSNotificationCenter.defaultCenter.addObserver(self, selector: :logoutInitiated, name: "kSFUserLogoutNotification", object:SFAuthenticationManager.sharedManager) NSNotificationCenter.defaultCenter.addObserver(self, selector: :loginHostChanged, name: "kSFLoginHostChangedNotification", object:SFAuthenticationManager.sharedManager) @weakSelf = WeakRef.new(self) self.initialLoginSuccessBlock = lambda { |info| @weakSelf.setupRootViewController } self.initialLoginFailureBlock = lambda { |info,error| SFAuthenticationManager.sharedManager.logout } end self.window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) self.initializeAppViewState SFAuthenticationManager.sharedManager.loginWithCompletion(self.initialLoginSuccessBlock, failure:self.initialLoginFailureBlock) true end def initializeAppViewState() @window.rootViewController = InitialViewController.alloc.initWithNibName(nil, bundle:nil) @window.makeKeyAndVisible end def setupRootViewController() navVC = UINavigationController.alloc.initWithRootViewController(HomeScreen.new) @window.rootViewController = navVC end def logoutInitiated(notification) self.log.SFLogLevelDebug(msg:"Logout Notification Recieved. Resetting App") self.initializeAppViewState SFAuthenticationManager.sharedManager.loginWithCompletion(self.initialLoginSuccessBlock, failure:self.initialLoginFailureBlock) end def loginHostChanged(notification) self.log.SFLogLevelDebug(msg:"Login Host Changed Notification Recieved. Resetting App") self.initializeAppViewState SFAuthenticationManager.sharedManager.loginWithCompletion(self.initialLoginSuccessBlock, failure:self.initialLoginFailureBlock) end end
  • 15. And now for the actually useful bit in all that def setupRootViewController() # Yeah, if you could just replace the root view controller with a ProMotion # Screen, that'd be great. navVC = UINavigationController.alloc.initWithRootViewController(HomeScreen.new) @window.rootViewController = navVC end
  • 16. Using the SDK Functions def query_sf_for_users results = SFRestAPI.sharedInstance.performSOQLQuery( # Salesforce has a fun variant on Sql called # "SOQL" or Salesforce Object Query Language. # First Argument is the Query we want to run. "SELECT id, Name, LastName FROM user", failBlock: lambda {|e| ap e }, # Method is a fun Method that invokes the named # method as a lambda. completeBlock: method(:sort_results) ) end
  • 17. Using the SDK functions def reset_password args UIAlertView.alert("Reset Users Password?", buttons: ["Cancel", "OK"], message: "Salesforce will reset their password!") { |button| if button == "OK" results = SFRestAPI.sharedInstance.requestPasswordResetForUser( @id, # id of user to invoke password reset. failBlock: lambda {|e| ap e }, completeBlock: method(:password_reset_complete) ) end } end def password_reset_complete response if(Twitter.accounts.size > 0) UIAlertView.alert("Password Reset!", buttons: ["OK", "Tweet"]) { |button| tweet if button == "Tweet" } end end
  • 18. ObjC2RubyMotion Turns this: RootViewController *rootVC = [[RootViewController alloc] initWithNibName:nil bundle:nil]; UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:rootVC]; self.window.rootViewController = navVC; Into this: rootVC = RootViewController.alloc.initWithNibName(nil, bundle:nil) navVC = UINavigationController.alloc.initWithRootViewController(rootVC) self.window.rootViewController = navVC
  • 19. Q & A Where we A some Q's Comments? Snide Remarks?
  • 20. Thank You! Everything should be as simple as possible, but no simpler. -- A. Einstein Ps: Investigative reporters have discovered that RM 3.5, will include a third new Ruby Compiler -- for Windows and Windows Phone 8.1, this will, of course, be the only redeeming feature of Windows*.