Slide 1

Slide 1 text

iOS professional practices MOW2012 19/4-2011 @uffekoch uffe@hugelawn.com +45 2828 7878 http://hugelawn.com

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

UNIT TESTING IOS APPS

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

ASSERT MACROS • STFail • STAssertTrue • STAssertEquals • STAssertEqualsWithAccuracy • STAssertNotNil • STAssertEqualObjects • STAssertNoThrow

Slide 8

Slide 8 text

Test Suite '/Users/uffe/Library/Developer/Xcode/DerivedData/damco-fbpbbvmjpsvwumgxshqoqkdcigui/Build/Products/Debug-iphonesimulator/ damcoTests.octest(Tests)' started at 2012-04-19 09:12:33 +0000 Test Suite 'DCSearchManagerTests' started at 2012-04-19 09:12:33 +0000 Test Case '-[DCSearchManagerTests testCBLbyCBLReference]' started. Test Case '-[DCSearchManagerTests testCBLbyCBLReference]' passed (0.003 seconds). Test Case '-[DCSearchManagerTests testContainerByEquipmentNumberArray]' started. Test Case '-[DCSearchManagerTests testContainerByEquipmentNumberArray]' passed (0.003 seconds). Test Case '-[DCSearchManagerTests testContainerFields]' started. Test Case '-[DCSearchManagerTests testContainerFields]' passed (0.002 seconds). Test Case '-[DCSearchManagerTests testsearch_bkk0231421]' started. Test Case '-[DCSearchManagerTests testsearch_bkk0231421]' passed (0.001 seconds). Test Suite 'DCSearchManagerTests' finished at 2012-04-19 09:12:33 +0000. Executed 13 tests, with 0 failures (0 unexpected) in 0.034 (0.040) seconds Test Suite 'containerByEquipmentNumberTests' started at 2012-04-19 09:12:33 +0000 Test Case '-[containerByEquipmentNumberTests testBuildDictionary]' started. Test Case '-[containerByEquipmentNumberTests testBuildDictionary]' passed (0.001 seconds). Test Case '-[containerByEquipmentNumberTests testParsingForTableHeads]' started. Test Case '-[containerByEquipmentNumberTests testParsingForTableHeads]' passed (0.000 seconds). Test Case '-[containerByEquipmentNumberTests testParsingForTableRows]' started. Test Case '-[containerByEquipmentNumberTests testParsingForTableRows]' passed (0.001 seconds). Test Case '-[containerByEquipmentNumberTests testParsingForTableRowsXpath]' started. Test Case '-[containerByEquipmentNumberTests testParsingForTableRowsXpath]' passed (0.001 seconds). Test Case '-[containerByEquipmentNumberTests testParsingForTitle]' started. Test Case '-[containerByEquipmentNumberTests testParsingForTitle]' passed (0.000 seconds). Test Suite 'containerByEquipmentNumberTests' finished at 2012-04-19 09:12:33 +0000. Executed 5 tests, with 0 failures (0 unexpected) in 0.004 (0.005) seconds Test Suite 'containerDetailsTests' started at 2012-04-19 09:12:33 +0000 Test Case '-[containerDetailsTests testContainerDetailFields]' started. Test Case '-[containerDetailsTests testContainerDetailFields]' passed (0.001 seconds). Test Case '-[containerDetailsTests testFindTitle]' started. Test Case '-[containerDetailsTests testFindTitle]' passed (0.000 seconds). Test Suite 'containerDetailsTests' finished at 2012-04-19 09:12:33 +0000. Executed 2 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds Test Suite 'damco_parserTests' started at 2012-04-19 09:12:33 +0000 Test Case '-[damco_parserTests testInvalidXml]' started. Entity: line 2: parser error : Extra content at the end of the document "text/xsl" href="spot.xsl"?>spot ^ Test Case '-[damco_parserTests testInvalidXml]' passed (0.000 seconds). Test Case '-[damco_parserTests testValidXml]' started. Test Case '-[damco_parserTests testValidXml]' passed (0.000 seconds). Test Suite 'damco_parserTests' finished at 2012-04-19 09:12:33 +0000. Executed 2 tests, with 0 failures (0 unexpected) in 0.001 (0.001) seconds Test Suite 'searchOverviewTests' started at 2012-04-19 09:12:33 +0000 Test Case '-[searchOverviewTests testCBLbyCBLReference]' started. Test Case '-[searchOverviewTests testCBLbyCBLReference]' passed (0.001 seconds). Test Case '-[searchOverviewTests testContainerbyCSNumber]' started. Test Case '-[searchOverviewTests testContainerbyCSNumber]' passed (0.000 seconds). Test Case '-[searchOverviewTests testHBLbyHBLNumber]' started. Test Case '-[searchOverviewTests testHBLbyHBLNumber]' passed (0.000 seconds). Test Case '-[searchOverviewTests testParsingForSecTitle]' started. Test Case '-[searchOverviewTests testParsingForSecTitle]' passed (0.000 seconds). Test Suite 'searchOverviewTests' finished at 2012-04-19 09:12:33 +0000. Executed 4 tests, with 0 failures (0 unexpected) in 0.002 (0.002) seconds Test Suite '/Users/uffe/Library/Developer/Xcode/DerivedData/damco-fbpbbvmjpsvwumgxshqoqkdcigui/Build/Products/Debug-iphonesimulator/ damcoTests.octest(Tests)' finished at 2012-04-19 09:12:33 +0000. Executed 26 tests, with 0 failures (0 unexpected) in 0.042 (0.052) seconds

Slide 9

Slide 9 text

AUTOMATED BUILD AND DEPLOYMENT

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

BATTERY MANAGEMENT

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Safari Background Running

Slide 22

Slide 22 text

CRASHES IN THE FIELD

Slide 23

Slide 23 text

REPORTING CRASHES - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[CrashReportSender sharedCrashReportSender] sendCrashReportToURL:CRASH_REPORTER_URL delegate:self activateFeedback:YES];

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

Identifier: com.vestas.vpm Date/Time: 2012-04-18 06:16:33 +0000 OS Version: iPhone OS 4.3.5 Exception Type: SIGTRAP Exception Codes: #0 at 0x33bb300c Application Specific Information: *** Terminating app due to uncaught exception \\\'NSInternalInconsistencyException\\\', reason: \\\'Invalid update: invalid number of rows in section 2. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted).\\\' Thread 0 Crashed: 0 libsystem_kernel.dylib 0x33bb300c 0x33ba2000 + 69644 1 libsystem_c.dylib 0x35197f95 0x35185000 + 77717 2 VestasVPM 0x000ca649 uncaught_exception_handler (PLCrashReporter.m:137) 3 CoreFoundation 0x33b547d3 0x33ab6000 + 649171 4 libobjc.A.dylib 0x3604906b 0x36043000 + 24683 5 libstdc++.6.dylib 0x3334fe3d 0x3330d000 + 273981 6 libstdc++.6.dylib 0x3334fe91 0x3330d000 + 274065 7 libstdc++.6.dylib 0x3334ff05 0x3330d000 + 274181 8 libobjc.A.dylib 0x36048fe1 0x36043000 + 24545 9 CoreData 0x35341135 0x3530a000 + 225589 10 CoreData 0x3530c58b 0x3530a000 + 9611 11 VestasVPM 0x000032b3 -[VPMAppDelegate loginSucces:] (VPMAppDelegate.m:65) 12 VestasVPM 0x00004e0b -[LoginViewController onGetUserTypeReceived:result:] (LoginViewController.m:115) 13 VestasVPM 0x0001d249 -[PerformanceManagerAsync onGetUserTypeReceived:] (VPM.m:3087) 14 CoreFoundation 0x33ac1f03 0x33ab6000 + 48899 15 VestasVPM 0x00007195 -[SoapWebService

Slide 27

Slide 27 text

LIMBO-ING UNDER THE 20MB APP SIZE LIMIT

Slide 28

Slide 28 text

DATA SYNCHRONISATION BETWEEN SERVER BACKENDS AND IOS APPS REST SOAP ... JSON XML CSV YAML OGDL ... MKNetworkKit ASIHTTP AFNetworking RESTKit NSURLRequest ... Core Data SQLite files NSUserDefaults KeyValue- Archiving ...

Slide 29

Slide 29 text

DATA SYNCHRONISATION BETWEEN SERVER BACKENDS AND IOS APPS REST SOAP ... JSON XML CSV YAML OGDL ... MKNetworkKit ASIHTTP AFNetworking RESTKit NSURLRequest ... Core Data SQLite files NSUserDefaults KeyValue- Archiving ...

Slide 30

Slide 30 text

No content