Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
These are confidential sessions—please refrain from streaming, blogging, or taking pictures
Session 301
Extending Your Apps forEnterprise and Education Use
Victor AlexanderiOS Data Access Engineer
Dave RahardjaiOS Device Management Engineer
Apps in Enterprise
Authentication
Networking
Data Security
Management
Authentication
Built into iOSAuthentication
• Shared keychain—great for apps from same developer
Built into iOSAuthentication
• Shared keychain—great for apps from same developer
Shared Keychain
App 1 App 2
Built into iOSAuthentication
• Shared keychain—great for apps from same developer
Shared Keychain
App 1 App 2 App 3
Built into iOSSingle Sign-On
Shared Keychain
App 1 App 2 App 3
Built into iOSSingle Sign-On
App 1 App 2 App 3
Built into iOSSingle Sign-On
Server
App 1 App 2 App 3
Built into iOSSingle Sign-On
App 1 App 2 App 3
Server
Built into iOSSingle Sign-On
• Kerberos•Grant access to specific apps only• Password not stored inside apps
App 1 App 2 App 3
Server
App developersSingle Sign-On
•No code changes (if you use NSURLConnection)•Use NSURLConnection or NSURLSession•No authentication callback to your appconnection:willSendRequestForAuthenticationChallenge
IT integratorsSingle Sign-On
• Configuration profile■ Define account■ Define apps■ Define URL prefixes
•Works with third-party apps and Safari
Authentication
Networking
Data Security
Management
Networking
Built into iOSNetworking
• SSL/TLS• Proxies—per-SSID or global•Wi-Fi
■ 802.1X■ WPA/WPA2
• VPN
Built into iOSPer-App VPN
Built into iOSPer-App VPN
App 1 App 2 App 3
VPN
Enterprise
Internet
Built into iOSPer-App VPN
Built into iOSPer-App VPN
• Limit VPN access to specific apps• Security + privacy
App developersPer-App VPN
App developersPer-App VPN
•No code changes required
IT integratorsPer-App VPN
• VPN plugin support• Configured using MDM
App developersNetworking
•Use NSURLConnection/NSURLSession• Be aware of proxies if you use lower level API• Be conscious of cellular data usageurlRequest.allowsCellularAccess = NO;
Authentication
Networking
Data Security
Management
Data Security
Built into iOSData Security
•Data protection—protects data at rest with passcode
Built into iOSData Security
•Data protection—protects data at rest with passcode
Complete withAuthorization CompleteNone
Built into iOSData Security
•Data protection—protects data at rest with passcode
Restart Complete withAuthorization CompleteNone
Built into iOSData Security
•Data protection—protects data at rest with passcode
Restart
User enters passcode Complete
Complete withAuthorization CompleteNone
Complete withAuthorizationNone
Built into iOSData Security
•Data protection—protects data at rest with passcode
Restart
User enters passcode
User locks device CompleteComplete withAuthorization
Complete
Complete withAuthorization CompleteNone
Complete withAuthorization
None
None
Built into iOSData Security
•Data protection—protects data at rest with passcode• Installed apps automatically protected with NSFileProtectionCompleteUntilFirstUserAuthentication
Built into iOSData Security
•Data protection—protects data at rest with passcode• Installed apps automatically protected with NSFileProtectionCompleteUntilFirstUserAuthentication
Built into iOSData Security
•Data protection—protects data at rest with passcode• Installed apps automatically protected with NSFileProtectionCompleteUntilFirstUserAuthentication
• FIPS 140-2 certification
App developersData Security
App developersData Security
•Use NSFileProtectionComplete when appropriate
App developersData Security
•Use NSFileProtectionComplete when appropriate•Write data to buffer if device is locked
App developersData Security
•Use NSFileProtectionComplete when appropriate•Write data to buffer if device is locked• Keychain data protection keep secrets on one devicekSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
App developersData Security
•Use NSFileProtectionComplete when appropriate•Write data to buffer if device is locked• Keychain data protection keep secrets on one devicekSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
• iCloud document sync
Authentication
Networking
Data Security
Management
Management
Built into iOSManagement
•Mobile device management■ Passcode and security policies■ Account installation■ Remote erase■ App installation and removal
Built into iOSManaged Open In
Built into iOSManaged Open In
• Prevent unintentional data movement
Built into iOSManaged Open In
• Prevent unintentional data movement•Managed data stay in managed apps and accounts
DemoManaged open in
Built into iOSApp Configuration and Feedback
Built into iOSApp Configuration and Feedback
• Configuration■ Send configuration dictionary to managed app■ Appears in NSUserDefaults
Built into iOSApp Configuration and Feedback
• Configuration■ Send configuration dictionary to managed app■ Appears in NSUserDefaults
• Feedback■ App writes to NSUserDefaults ■ Read feedback dictionary from managed app
App developersApp Configuration and Feedback
• Read configuration dictionary using[[NSUserDefaults standardUserDefaults] objectForKey:@”com.apple.configuration.managed”]
•Write feedback dictionary to NSUserDefaults keycom.apple.feedback.managed
• Listen for changes using NSUserDefaultsDidChangeNotification
• Your app might not be running
DemoApp configuration and feedback
App Configuration
- (void)viewDidLoad { [super viewDidLoad];
//...
[[NSNotificationCenter defaultCenter] addObserverForName:NSUserDefaultsDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { [self readDefaultsValues]; }];
[self readDefaultsValues];}
App Configuration
- (void)readDefaultsValues { NSDictionary *serverConfig = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"com.apple.configuration.managed"];
NSString *serverURLString = serverConfig[@"serverURL"]; if (serverURLString && [serverURLString isKindOfClass:[NSString class]]) { self.serverURLTextField.text = serverURLString; } else { self.serverURLTextField.text = @"http://foo.bar"; }
//...}
App Feedback
- (void)incrementSuccessCount { self.successCount += 1;
//...
NSMutableDictionary *feedback = [[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"com.apple.feedback.managed"] mutableCopy]; if (!feedback) feedback = [NSMutableDictionary dictionary];
feedback[@"successCount"] = @(self.successCount); [[NSUserDefaults standardUserDefaults] setObject:feedback forKey:@"com.apple.feedback.managed"];}
App developersApp Configuration
App developersApp Configuration
• Settings and preferences■ App UI settings■ URLs■ Disable iCloud document sync
App developersApp Configuration
• Settings and preferences■ App UI settings■ URLs■ Disable iCloud document sync
• Stored as NSFileProtectionNone—no passwords or private keys!
App developersApp Configuration
• Settings and preferences■ App UI settings■ URLs■ Disable iCloud document sync
• Stored as NSFileProtectionNone—no passwords or private keys!•Document your dictionary keys
App developersApp Configuration
• Settings and preferences■ App UI settings■ URLs■ Disable iCloud document sync
• Stored as NSFileProtectionNone—no passwords or private keys!•Document your dictionary keys• Validate all input types and values
App developersApp Configuration
• Settings and preferences■ App UI settings■ URLs■ Disable iCloud document sync
• Stored as NSFileProtectionNone—no passwords or private keys!•Document your dictionary keys• Validate all input types and values• Keep it small
App developersApp Configuration
• Settings and preferences■ App UI settings■ URLs■ Disable iCloud document sync
• Stored as NSFileProtectionNone—no passwords or private keys!•Document your dictionary keys• Validate all input types and values• Keep it small•App might not be running
App developersApp Feedback
• Errors and usage statistics•Aggregate, don’t log•Document your dictionary keys• Keep it small•App might not be running• Respect privacy
IT integratorsApp Configuration and Feedback
• Provide configuration when installing app•Use feedback to detect server connection errors
App developersFonts
• Installed using configuration profiles• Font list may change• kCTFontManagerRegisteredFontsChangedNotification
Single App Mode
•MDM-controlled
App-Requested Single App Mode
App-Requested Single App Mode
•MDM-authorizedUIAccessibilityRequestGuidedAccessSession()UIAccessibilityIsGuidedAccessEnabled()UIAccessibilityGuidedAccessStatusDidChangeNotification
App developersApp Revocation
•App licenses can expire• Expiry date available on receipt• See session on receipts
Authentication
Networking
Data Security
Management
Authentication
Networking
Data Security
Management
Summary
Summary
• Build the next generation of enterprise apps
Summary
• Build the next generation of enterprise apps•Use iOS 7 features
Summary
• Build the next generation of enterprise apps•Use iOS 7 features• Support app configuration and feedback
Summary
• Build the next generation of enterprise apps•Use iOS 7 features• Support app configuration and feedback•Use NSURLConnection / NSURLSession
Summary
• Build the next generation of enterprise apps•Use iOS 7 features• Support app configuration and feedback•Use NSURLConnection / NSURLSession• Build in data protection and security
More Information
Paul [email protected]
Apple in Businesshttp://www.apple.com/business/
Apple in Educationhttp://www.apple.com/education/
Apple Developer Forumshttp://devforums.apple.com
Using Receipts to Protect Your Digital Sales PresidioThursday 2:00PM
Managing Apple Devices Pacific HeightsTuesday 11:30AM
Related Sessions
Labs
Apps for Enterprise and Education Lab Services Lab BTuesday 4:30PM