Date post: | 16-Jul-2015 |
Category: |
Mobile |
Upload: | jose-manuel-ortega-candel |
View: | 324 times |
Download: | 3 times |
MADRID · NOV 21-22 · 2014
From iOS To Android(or reverse)
José Manuel Ortega Candel
@jmortegac
http://www.linkedin.com/jmortega1
MADRID · NOV 21-22 · 2014
https://speakerdeck.com/jmortega/
MADRID · NOV 21-22 · 2014
ARCHITECTURE / iOS / ANDROID
TOOLS XCODE vs ANDROID STUDIO
APPLICATIONS / PERMISSIONS / PRIVACY
USER INTERFACE
STATIC ANALYSIS CODE / TESTING
CERTIFICATES AND SIGNING
EMULATORS / MEMORY MANAGEMENT/ DATABASE
APP PUBLISHING / DEVELOPER LIBRARIES
MADRID · NOV 21-22 · 2014
ARCHITECTURE
MADRID · NOV 21-22 · 2014
Android Architecture
DALVIK ART
Just-In-Time (JIT) Compilation Ahead-Of-Time (AOT)
Compilation
Cache builds up over time
Boot times are faster
Cache is built at first boot
Rebooting device takes
significantly longer
Apps compiled when executed Stores Compiled Apps
Consumes much more internal
storage space
MADRID · NOV 21-22 · 2014
iOS Architecture
MADRID · NOV 21-22 · 2014
TOOLS
MADRID · NOV 21-22 · 2014
IDES Android iOS
https://developer.android.com/sdk/
installing/studio.html
APPCode http://www.jetbrains.com/objc/
MADRID · NOV 21-22 · 2014
on Android Studio
InteliJ IDE Based Maven based Build Dependency Combines Ant && Maven / Gradle Tasks
MADRID · NOV 21-22 · 2014
Android Studio
Templates
MADRID · NOV 21-22 · 2014
Android Studio
Project settings
MADRID · NOV 21-22 · 2014
XCode
Provides multiple ios app templates
MADRID · NOV 21-22 · 2014
Xcode Project
Testing on device
Base SDK
MADRID · NOV 21-22 · 2014
Interface Builder
MADRID · NOV 21-22 · 2014
Instruments on iOS
Debugging, performance analysis, and testing
Real-time CPU, memory, disk, energy, and network
usage
Threads, network, and energy usage
I/O system and thread activity
Allows detecting memory leaks
MADRID · NOV 21-22 · 2014
APPLICATIONS
MADRID · NOV 21-22 · 2014
Android Applications
MADRID · NOV 21-22 · 2014
Android Layout Manager+ Device Preview
MADRID · NOV 21-22 · 2014
Android Applications
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);}
} public static void invokeWebBrowser(Activity activity){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
activity.startActivity(intent);
}
Activity
Intents [Explicit,Implicits]
Services
Content Providers[Sharing data between apps]
Fragments from 3.0
MADRID · NOV 21-22 · 2014
Android components
MADRID · NOV 21-22 · 2014
Android’s RecyclerView
Adapter
ViewHolder
LayoutManager
ItemDecoration
ItemAnimator
https://developer.android.com/training/material/lists-cards.html
MADRID · NOV 21-22 · 2014
Android Navigation Drawer
MADRID · NOV 21-22 · 2014
Layout Systems
UINavigationBar
UITableView
TextView
TextView
LinearLayout
TextView
TextView
MADRID · NOV 21-22 · 2014
LifeCycle Applications
MADRID · NOV 21-22 · 2014
LifeCycle Applications
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
MADRID · NOV 21-22 · 2014
iOS Applications
C
Objective –C,[message passing]
Swift
PlayGround for leaning Swift
Programming with Objetive-C in windows/
linux
http://www.gnustep.org/
https://developer.apple.com/swift
MADRID · NOV 21-22 · 2014
Objective-C vs Swift
NSString *string = @“hello”;
let string = "hello" as NSString
let s: NSString = "hello"
var string: NSString = "hello"
string= "Hello"
NSLog(@“This is a string”); println("This is a string");
NSArray *myArray = [NSArray
arrayWithObjects:@“string1",
@“string2", nil];
var myArray = [“string1", "string2"]
var myArray : [String] =
[“string1", "string2"]
MADRID · NOV 21-22 · 2014
iOS Applications
@synthesize will generate getter and setter
methods for your @property
@interface MyObject:NSObject {
NSString *_name;
}
@property (nonatomic,assign) NSString* name;
@end
@implementation MyObject
@synthesize name = _ name;
@end
MADRID · NOV 21-22 · 2014
UIKit Framework
UIButton
UILabel
UIImageView
UITextField
UIPickerView
UIWindow
UIView
UIViewController
NSObject,NSString,NSMutableString, NSDate,NSNumber
Collections(NSArray, NSDictionary, NSSet,NSEnumerator)
Foundation Framework
MADRID · NOV 21-22 · 2014
iOS Applications
UIViewController is the parent for view Controllers
MADRID · NOV 21-22 · 2014
iOS Applications
Organizer
MADRID · NOV 21-22 · 2014
iOS Applications
Snippets in XCode
MADRID · NOV 21-22 · 2014
iOS Applications
MADRID · NOV 21-22 · 2014
iOS Applications
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController <UITableViewDataSource,
UITableViewDelegate>{
IBOutlet UITableView *table;
NSMutableData *dataReceive;
}
@property(nonatomic,assign) NSMutableData *dataReceive;
@end
UIViewController interface MyViewController.h
implementation MyViewController.m @implementation MyViewController
@synthesize dataReceive,table;
- (void)viewDidLoad{
[super viewDidLoad];
NSURL *url = [[NSURL alloc] initWithString:@“url"];
self.dataReceive = [[NSMutableData data] retain];
}
MADRID · NOV 21-22 · 2014
iOS Applications
UINavigationController
MADRID · NOV 21-22 · 2014
iOS Applications
UINavigationController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
//Recuperamos el ViewController
UIViewController *rootViewController = [storyboard instantiateInitialViewController];
// Creamos un UINavigationController, que se encargará de controlar y almacenar los distintos
viewControllers de nuestra aplicación.
UINavigationController *navigationController = [[UINavigationController
alloc]initWithRootViewController:rootViewController];
//Asignamos el navigationController como principal.
self.window.rootViewController = navigationController; return YES;
}
-(IBAction)goToPantalla2:(id)sender { UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
//Obtenemos el controlador con Identifier "Pantalla2"
Pantalla2ViewController *pantalla2Controller = [storyBoard
instantiateViewControllerWithIdentifier:@"Pantalla2"];
//Lanzamos el controlador en el navigation de forma animada:
[self.navigationController pushViewController:pantalla2Controller animated:YES]; }
MADRID · NOV 21-22 · 2014
Design patterns on iOS Applications MVC
Target-action
Delegate and protocols
A delegate is an object that control of the user interface for that event.
MADRID · NOV 21-22 · 2014
ViewPager / UIPageViewController
Swipe gesture
MADRID · NOV 21-22 · 2014
Multilanguage
NSString *localizedString =
NSLocalizedString(@"Hello",@“DefaultString");
MADRID · NOV 21-22 · 2014
Certificates and Signing
Android iOS
Self-signed certificate
Apps are signed by
developers
Apple certificate
Apps are signed by Apple
Java Keytool
Generate a distribution
provisioning profile
Export + Sign APK
iOS Provisioning Portal
Debug and distribution
certificate
App ID (unique ID of your app)
Set of device unique identifiers
Developer certificate
MADRID · NOV 21-22 · 2014
Android Studio
Export + Sign APK
MADRID · NOV 21-22 · 2014
PERMISSIONS
MADRID · NOV 21-22 · 2014
Permissions on Android
AndroidManifest.xml Protection mechanism to interact with other
applications
<uses--‐permission android:name="android.permission.INTERNET"/>
<uses--‐permission
android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses--‐permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses--‐permission
android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses--‐permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
MADRID · NOV 21-22 · 2014
Permissions on iOS o Declare your application requirements in its manifest-like Info.plist.
This is used only for ensuring device compatibility.
o UIRequiredDeviceCapabilities allows you to list
’hardware-like’ capabilities that your app needs.
o AppStore reads this information for filter installer
devices.
MADRID · NOV 21-22 · 2014
Permissions on iOS
Privacy Analysis Tools for iOs Applications
patia.unileon.es
MADRID · NOV 21-22 · 2014
Privacy
Permission Manager
MADRID · NOV 21-22 · 2014
USER
INTERFACE
MADRID · NOV 21-22 · 2014
Evolution
MADRID · NOV 21-22 · 2014
Android Material design
Minimalist and consistency
Transitions, animiations
Cards
https://developer.android.com/training/material/get-started.html
MADRID · NOV 21-22 · 2014
Android Material design
Ldrawer
https://github.com/kanytu/android-material-drawer-template
https://github.com/IkiMuhendis/LDrawer
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme"
parent="android:Theme.Material.Light">
<item name="android:colorPrimary">
@color/primary</item>
<item name="android:colorPrimaryDark">
@color/primary_dark</item>
<item name="android:colorAccent">
@color/accent</item>
<item name="android:textColorPrimary">
@color/text_primary</item>
<item name="android:textColor">
@color/text_secondary</item>
<item name="android:navigationBarColor">
@color/primary_dark</item> </style>
</resources>
MADRID · NOV 21-22 · 2014
Android Material design
https://github.com/google/iosched
MADRID · NOV 21-22 · 2014
Android Fragments Fragment is a chunk of user interface with its own life cycle. Fragment must exist within an Activity Interaction with fragments is done through FragmentManager Fragment API was introduced in API 11
http://developer.android.com/tools/support-library
MADRID · NOV 21-22 · 2014
Android Fragments
MADRID · NOV 21-22 · 2014
iOS Master-Detail template UISplitViewController
MADRID · NOV 21-22 · 2014
Notifications
MADRID · NOV 21-22 · 2014
STATIC
ANALYSIS CODE
MADRID · NOV 21-22 · 2014
Static analysis code on Android Studio
Inspect Profile
Lint
MADRID · NOV 21-22 · 2014
Static analysis code on Java projects
SonarQube
Sonnar-runner
MADRID · NOV 21-22 · 2014
Static analysis code on XCode
Static Analyzer
Detect memory leaks
MADRID · NOV 21-22 · 2014
TESTING
MADRID · NOV 21-22 · 2014
Mobile Application Testing
TYPES Unit Testing
Functionality Testing
Integration Testing
Regression Load Testing
Stress Testing
Performance
Usability Testing
MADRID · NOV 21-22 · 2014
Mobile Application Testing
MADRID · NOV 21-22 · 2014
CheckList
Rotating the screen
Behavior of when network is not
available
Navigation between screens
Behavior of app if app is running for
longer period of time and checking
memory
MADRID · NOV 21-22 · 2014
Testing on Android
Unit & Integration,TDD
Junit
RoboElectric
Acceptance,BDD
RobotiumTesting User Interface
Calabash
MADRID · NOV 21-22 · 2014
Unit testing on iOS
XCTest
#import <XCTest/XCTest.h>
#import “TestObject.h"
@interface TestOjectLogicTests : XCTestCase {
@private
TestObject *object;
}
@end
MADRID · NOV 21-22 · 2014
EMULATORS
MADRID · NOV 21-22 · 2014
Emulator vs Simulator Android iOS
Emulator Simulator
Very slow integrated with SDK Integrated with Xcode
Emulates hardware and software Simulates only software
Launched apps are equal
binaries from the apps compiled
for Device CPU
Launched apps are different
binaries from the apps compiled
for Device CPU
MADRID · NOV 21-22 · 2014
Genymotion
Integration with Eclipse and Android Studio
MULTI OS Compatible with Linux,Windows and Mac
Requires VirtualBox
MADRID · NOV 21-22 · 2014
Alternatives
http://jimulabs.com/ for Android live preview
https://appthwack.com/ for testing in the cloud with real
devices
MADRID · NOV 21-22 · 2014
MEMORY
MANAGEMENT
MADRID · NOV 21-22 · 2014
Android Handles memory management
automatically Garbage Collector
iOS release, retain, autorelease
ARC(Automatic Reference Counting)
Developer maintain the count number for each object
Destroys object when reference counting become 0
@autoreleasepool
With ARC, compiler set this methods where its
necessary
MADRID · NOV 21-22 · 2014
ARC
Migrating to ARC
Project Build Settings
MADRID · NOV 21-22 · 2014
DATA
PERSISTENCE
MADRID · NOV 21-22 · 2014
Android iOS
SQLite
android.database.sqlite
Tables and relations
Core Data
Objects
DataModel
Content Providers
/data/data/<Application-Package>
/databases/<database-name>
Only acces with root
DataModel editor in Xcode for
register objects and their
relationships
MADRID · NOV 21-22 · 2014
iOS Core Data
MADRID · NOV 21-22 · 2014
Alernatives
http://realm.io/
Android and iOS
Object-oriented API
C++ Core
MADRID · NOV 21-22 · 2014
SHARED
ACTIONS
MADRID · NOV 21-22 · 2014
Android
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/share"
android:title="@string/share"
android:showAsAction="ifRoom"
android:actionProviderClass="android.widget.ShareActionProvider"/>
</menu>
private ShareActionProvider mShareActionProvider;
mShareActionProvider.setShareIntent(getDefaultShareIntent());
private Intent getDefaultShareIntent(){
Intent intent = new Intent(Intent.ACTION_SEND); //IMPLICIT INTENT
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"Extra Text");
return intent;}
MADRID · NOV 21-22 · 2014
iOS
- (IBAction)shareButton:(UIBarButtonItem *)sender
{
NSString *textToShare = @“textToShare";
UIImage *imageToShare = [UIImage imageNamed:@"yourImage.png"];
NSURL *myWebsite = [NSURL
URLWithString:@"http://www.example.com/"];
NSArray *objectsToShare = @[textToShare, imageToShare ,myWebsite];
UIActivityViewController *activityVC = [[UIActivityViewController
alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
NSArray *excludeActivities =
@[UIActivityTypeAirDrop,UIActivityTypePrint];
activityVC.excludedActivityTypes = excludeActivities;
[self presentViewController:activityVC animated:YES completion:nil];
}
UIActivityViewController
MADRID · NOV 21-22 · 2014
CHECK
CONNECTIVITY
MADRID · NOV 21-22 · 2014
Check connectivity on Android
ConnectivityManager
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
public static boolean checkConnectivity(Context context) {
ConnectivityManager cm
=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
}
MADRID · NOV 21-22 · 2014
Check connectivity on iOS
Reachability
internetReach = [[Reachability reachabilityForInternetConnection]
retain];
[internetReach startNotifier];
if([internetReach currentReachabilityStatus] == ReachableViaWWAN) {
// Tenemos conexión a Internet
}
wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
[wifiReach startNotifier];
if([wifiReach currentReachabilityStatus] == ReachableViaWiFi) {
// Estamos conectados mediante Wi-Fi
}
MADRID · NOV 21-22 · 2014
APP
PUBLISHING
MADRID · NOV 21-22 · 2014
Android iOS
Google requires a one time fee of
US$25
iOS Developer Program
$99 /year
Greater capacity for monetization
Google play + Publish in other
stores like Amazon,Opera
AppStore
Alpha/beta testing before put in
production
Upload to store in 30 min
Review process 5-7 days
Android Developer
Console
Beta Testing
http://ibetatest.com/
http://testflightapp.com/
MADRID · NOV 21-22 · 2014
Distribution
MADRID · NOV 21-22 · 2014
Developers
Library
MADRID · NOV 21-22 · 2014
Async connections
iOS Thread managed by NSURLConnection
Android Services, AsyncTask
Libraries for Android Otto Event Bus,RoboSpice
http://square.github.io/otto/
MADRID · NOV 21-22 · 2014
https://play.google.com/store/apps/details?id=com.desarrollodroide.repos
Android libraries with demos in GP
MADRID · NOV 21-22 · 2014
https://developer.apple.com/library/ios/navigation/
iOS Developer library
MADRID · NOV 21-22 · 2014
Classes comparative iOS Android
Base UIApplication Application
Controller UIViewController Activity/Fragment
Event Emitter Target Action/Responder
Chain
Event Listener i.e. onClick()
Data Saving NSUserDefaults / SQLite SharedPreferences / SQLite
Multi Thread NSThread Thread/AsyncTask/Service
Internationalization NSLocalizedString Resource files
GPS CoreLocation LocationManager
for MapView, use Google
SDK
Accelerometer UIAccelerometer SensorManager
Local Notification UILocalNotification NotificationManager
Remote Push
Notification
Apple Push Notifiation Service
C2DM (external package)
com.google.android.c2dm
MADRID · NOV 21-22 · 2014
BOOKS
MADRID · NOV 21-22 · 2014
MADRID · NOV 21-22 · 2014
References
o www.developer.android.com
o http://www.google.com/design/spec/material-design/
introduction.html
o http://tools.android.com/
o https://android-arsenal.com/
o http://android-developers.blogspot.com.es/
o www.developer.apple.com
o https://developer.apple.com/videos/wwdc/
o https://developer.apple.com/library/ios/referencelibrary/Getting
Started/RoadMapiOS/
MADRID · NOV 21-22 · 2014
Thanks
Questions?