Driving Behavioral Change for Information Management through Data-Driven Gree...
What's new in iOS 7
1. What’s new in iOS 7?
Highlights of 1500 new APIs
Jordi Gimenez (@gimix3) & Hermes Pique (@hpique)
NSBarcelona
2. 82% of devices are using iOS 7.
As measured by the App Store during a 7-day period ending February 23, 2014.
3. Agenda
What we will cover
•
•
•
•
•
•
•
NSTextStorage
UIViewController transitions
iCloud & Core Data
App Store Receipt
Speech Synthesis
JavaScript Evaluation
New Networking Possibilities
19. iCloud
• Using iCloud in iOS 5-6 is a bug
• Sync network setup (!)
• Limited APIs
• Poor support for account changes
• Unreliability
• In iOS 7 it’s actually usable
20. iCloud
Core Data with iCloud in 3 steps
1. Add iCloud to Core Data
2. Respond to changes
3. Respond to account changes
27. “This is doable.”
–James Wilson (Engineering Manager for the App Store in OS X) at WWDC 2013, about verifying the
App Store receipt
28. App Store Receipt
Verification in 5 steps
1.
2.
3.
4.
5.
Get the receipt data
Verify the receipt signature
Get the receipt fields
Verify the receipt hash
Get in-app purchases (optional)
29. App Store Receipt
Getting the receipt data
const char *cpath = [[path stringByStandardizingPath] fileSystemRepresentation];
FILE *fp = fopen(cpath, "rb");
if (!fp) return nil;
!
PKCS7 *p7 = d2i_PKCS7_fp(fp, NULL);
fclose(fp);
if (!p7) return nil;
!
NSURL *certificateURL = [[NSBundle mainBundle]
URLForResource:@"AppleIncRootCertificate" withExtension:@"cer"];
NSData *certificateData = [NSData dataWithContentsOfURL:certificateURL];
if ([self verifyPCKS7:p7 withCertificateData:certificateData]) {
struct pkcs7_st *contents = p7->d.sign->contents;
if (PKCS7_type_is_data(contents)) {
ASN1_OCTET_STRING *octets = contents->d.data;
data = [NSData dataWithBytes:octets->data length:octets->length];
}
}
PKCS7_free(p7);
30. App Store Receipt
Verifying the receipt signature
int result = 0;
OpenSSL_add_all_digests(); // Required for PKCS7_verify to work
X509_STORE *store = X509_STORE_new();
if (store) {
const uint8_t *certificateBytes = (uint8_t *)(certificateData.bytes);
X509 *certificate = d2i_X509(NULL, &certificateBytes
(long)certificateData.length);
if (certificate){
X509_STORE_add_cert(store, certificate);
BIO *payload = BIO_new(BIO_s_mem());
result = PKCS7_verify(container, NULL, store, NULL, payload, 0);
BIO_free(payload);
X509_free(certificate);
}
}
X509_STORE_free(store);
EVP_cleanup();
31. App Store Receipt
Getting the receipt fields
[RMAppReceipt enumerateASN1Attributes:asn1Data.bytes length:asn1Data.length
usingBlock:^(NSData *data, int type) {
const uint8_t *s = data.bytes; const NSUInteger length = data.length;
switch (type) {
case 2: bundleIdData = data; _bundleId = RMASN1ReadUTF8String(&s, length); break;
case 3: appVersion = RMASN1ReadUTF8String(&s, length); break;
case 4: opaqueValue = data; break;
case 5: hash = data; break;
case 17: {
RMAppReceiptIAP *purchase = [[RMAppReceiptIAP alloc] initWithASN1Data:data];
[purchases addObject:purchase];
break; }
case 19: originalAppVersion = RMASN1ReadUTF8String(&s, length); break;
case 21: expirationDate = [RMAppReceipt formatRFC3339String:RMASN1ReadIA5SString(&s,
length)]; break;
}
}];
35. About me
Jordi Giménez
• CTO at Mobile Jazz
• Co-organizer of NSBarcelona
• iOS and Android developer
• High-availability, high-scalability
• IT Security
36. Speech Synthesis with AV Foundation
AV Foundation framework provides essential services for working with time-based audiovisual media.
Play, capture, edit, or encode media.
37. AV Foundation
Speech synthesis
• AVFoundation allows provides a convenient interface to the speech
synthesizer
AVSpeechSynthesizer *synthesizer = [AVSpeechSynthesizer new];
AVSpeechUtterance *utterance = [AVSpeechUtterance
speechUtteranceWithString:@"Hello world!"];
[synthesizer speakUtterance:utterance];
44. New networking APIs
• Multitasking: background execution of network tasks
• AirDrop: data transfer between nearby devices
• Multipeer connectivity: message passing between ad-hoc groups of
people
45. Multitasking
iOS applications can’t generally run in the background, in order to save
battery and boost performance
• UIBackgroundModes specify when the app should wake up
•
•
•
•
•
•
•
•
•
audio
location
newsstand-content
external-accessory
bluetooth-central
bluetooth-peripherial
fetch
remote-notification
46. Multitasking
Background fetch: wake up at intervals
// 1. Specify `fetch` in UIBackgroundModes in Info.plist to wake up the application
at intervals.
!
// 2. Give an interval hint:
[[UIApplication sharedApplication]
setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
!
// 3. Handle fetch wakeup
-(void) application:(UIApplication *)application performFetchWithCompletionHandler:
(void(^) (UIBackgroundFetchResult))completionHandler
{
// fetch content from the network
if(newContent) {
completionHandler(UIBackgroundFetchResultNewData);
} else {
completionHandler(UIBackgroundFetchResultNoData);
}
}
47. Multitasking
Remote notifications: wake up on server demand
// 1. Specify `remote-notification` in UIBackgroundModes in Info.plist to wake up the
application upon reception of push notifications with `content-available=1` attribute.
!
// 2. Handle fetch wakeup
- (void) application:(UIApplication *)application didReceiveRemoteNotification:
(NSDictionary *)userInfo performFetchWithCompletionHandler:(void(^)
(UIBackgroundFetchResult))completionHandler
{
if([[userInfo objectForKey:@"content-available"] intValue] != 1) {
completionHandler(UIBackgroundFetchResultNoData); // no content-available!
return;
}
// fetch content from the network
if(newContent) {
completionHandler(UIBackgroundFetchResultNewData);
} else {
completionHandler(UIBackgroundFetchResultNoData);
}
}
49. Multitasking
Background Transfer Service
Uploads/downloads files even if the application is in background
!
1.
2.
3.
4.
Make an NSURLSession with the desired NSURLSessionConfiguration
Provide a session identifier and delegate
Initiate a task
Delegate methods will be called upon progress/completion
50. Multitasking
Background Transfer Service
The application might be killed while in the background.
!
To deal with background mode, also implement
-application:handleEventsForBackgroundURLSession:completionHandler:
like this:
!
1. Look at the session identifier provided by the system
2. Make an NSURLSession with the desired NSURLSessionConfiguration,
matching the settings for that identifier, with a delegate
3. Delegate methods will be called to notify completion
52. AirDrop
AirDrop lets users share photos,
documents, URLs (including custom
schemes), and other kinds of data via
Wifi/Bluetooth
!
(See Apple’s AirDropSample)
53. AirDrop
Sending a file
1. Implement a class with the UIActivityItemSource
protocol
Provides:
• a URL with custom scheme or
• an UTI + NSData.
2. Display a UIActivityViewController to handle
your class instance
!
UIActivityViewController already existed
before to share data between apps, AirDrop was
added
54. AirDrop
Receiving a file
• Add the document types and URL schemes you want to support (Xcode
Target > Info)
!
!
!
!
!
!
No matter where the file comes from (local or AirDrop) you will
receive it the same way.
57. Multipeer connectivity
• Allows to make ad-hoc groups of up to 8 devices in order to share data
(NSData, streams)
• Ideal for games or other kinds of data transfer on the spot
59. iBeacons
• iBeacons are Bluetooth Low Energy devices emitting an identifier
• CoreLocation integrates natively with iBeacons to provide regions
• Applications can be notified when entering/leaving a region (even in the
background) with very little power consumption
!
• Useful for:
• Locating areas at a retail store
• Augmentation of museum
• Geocaching/scavenger hunt games
• Tourism
60. iBeacons
Listen for iBeacons
// tell location manager to start monitoring for the beacon region
region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
identifier:@"ibeacon.test"];
!
[locationManager startMonitoringForRegion:region];
[locationManager startRangingBeaconsInRegion:region];
!
// listen for location manager updates
-(void)locationManager:(CLLocationManager*)manager
didRangeBeacons:(NSArray*)beacons
inRegion:(CLBeaconRegion*)region
{
NSLog(@"Beacons found: %@", beacons);
}
61. iBeacons
Advertising your iDevice
// start the peripheral manager, tells about Bluetooth state
peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];
!
// listen for bluetooth peripheral updates
-(void)peripheralManagerDidUpdateState:(CBPeripheralManager*)peripheral
{
if (peripheral.state == CBPeripheralManagerStatePoweredOn) {
// makes a region describing this device
CLBeaconRegion *advertisingRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
major:33 minor:44 identifier:@"ibeacon.test"];
// gets this device's data to use as beacon
NSDictionary* beaconData = [advertisingRegion peripheralDataWithMeasuredPower:nil];
// advertises
[self.peripheralManager startAdvertising:beaconData];
}
else if (peripheral.state == CBPeripheralManagerStatePoweredOff)
{
[self.peripheralManager stopAdvertising];
}
}
62. Wrap up
• Speech synthesis
• JavaScript evaluation
• Networking in the background
• Background fetch
• Remote notification background mode
• Background Transfer Service
• AirDrop & Multi-peer connectivity
• iBeacons
63. So… What’s new in iOS 7?
OK, you want the full list
• https://developer.apple.com/ios7/
• https://developer.apple.com/library/prerelease/ios/releasenotes/General/
WhatsNewIniOS/Article