iOS-Strategies for Implementing Specific App Features

本文介绍了,App中需要用到的功能点以及其处理策略。

Privacy Strategies

通过硬盘加密(On-Disk Encryption)进行数据保护

数据保护在iOS系统上,是基于两种策略进行保护的:

  • 设备的文件系统支持数据保护;
  • 设备需要密码进行解锁。

基于以上策略,进行数据保护的文件API如下:

1
2
创建新文件时:[data writeToFile:@"Path" options:NSDataWritingFileProtectionNone error:nil]
修改已有文件的权限时: [[NSFileManager defaultManager] setAttributes:@{NSFileProtectionKey:NSFileProtectionNone} ofItemAtPath:@"Path" error:nil]

这里有四种保护方式:

Name Key Func
No protection NSDataWritingFileProtectionNone(NSData) NSFileProtectionNone(NSFileManager) 不保护,即使锁屏也可访问
Complete NSDataWritingFileProtectionComplete(NSData) NSFileProtectionComplete(NSFileManager) 完全保护,锁屏不可访问
Complete unless already open NSDataWritingFileProtectionCompleteUnlessOpen(NSData) NSFileProtectionCompleteUnlessOpen(NSFileManager) 部分保护,没有打开的文件,锁屏不可访问,对于已打开的文件,锁屏也可以继续访问
Complete until first login NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication(NSData) NSFileProtectionCompleteUntilFirstUserAuthentication(NSFileManager) 部分保护,只有设备启动,并且用户解锁过一次,才能访问

对于文件的访问状态变化,可以通过以下方式获取:

1
2
3
AppDelegate中的:applicationProtectedDataWillBecomeUnavailable:和applicationProtectedDataDidBecomeAvailable:两个回调;
监听UIApplicationProtectedDataWillBecomeUnavailable和UIApplicationProtectedDataDidBecomeAvailable两个通知;
UIApplication的protectedDataAvailable属性;

标识用户

标识用户的方式有以下几种:

  • 标识用户与服务端的账号:App自定义登录页面;
  • 标识用户与广告:使用ASIdentifierManageradvertisingIdentifier属性;
  • 标识用户与设备:一台设备会生成一个对应的UUID,这个只能标识设备,一个用户可能有多台设备,方法如下:
1
[[UIDevice currentDevice] identifierForVendor]

Respecting Restrictions

iOS系统的用户可以对一些内容进行限制,例如父母可以限制儿童可以访问的内容,如果App播放或者修改一些被限制的多媒体文件,需要根据设置App中的设置进行判断,以及根据设置的变化而变化。

获取当前的某项设置,可以使用以下方法:

1
[NSUserDefaults standardUserDefaults] objectForKey:>

其中,Key包含:

Media rating key Value
com.apple.content-rating.ExplicitBooksAllowed Boolean.如果为NO,则详细的Books信息将不被允许访问
com.apple.content-rating.ExplicitMusicPodcastsAllowed Boolean.如果为NO,则详细的Music、Movies和Podcasts信息将不被允许访问
com.apple.content-rating.AppRating NSNumber.0到1000之间,高于这个值的App将不被允许访问
com.apple.content-rating.MovieRating NSNumber.0到1000之间,高于这个值的Movie将不被允许访问
com.apple.content-rating.TVShowRating NSNumber.0到1000之间,高于这个值的TV Show将不被允许访问

其中,App评级是所有地区通用的,对应关系如下:

Rating name Numerical value
4+ 100
9+ 200
12+ 300
17+ 600

Movie和TV的评级是每个地区不同的,有些地区没有评级系统,需要App根据当地的律法自行判断。每个地图的评级定义可能不同,例如美国是用字符串“G”和数字100来表明最低的评级。

注意,可以通过监听NSUserDefaultsDidChangeNotification通知来获取用户是否改变Restrictions的设置。

Supporting Multiple Versions of iOS

由于iOS系统的升级,有些API可能不再可用了,所以,需要进行检查(Runtime Checks),下面是一些常用的检查方法:

判断Class是否存在

1
2
3
4
5
6
if ([UIPrintInteractionController class]) {
// Create an instance of the class and use it.
}
else {
// The print interaction controller is not available so use an alternative technique.
}

判断Method是否存在

1
2
[TestClass instancesRespondToSelector:]
[[TestClass instance] respondsToSelector:]

判断一个C函数是否存在

1
2
3
if (UIGraphicsBeginPDFPage != NULL) {
UIGraphicsBeginPDFPage();
}

Tips for Developing a VoIP App

VoIP(Voice over Internet Protocol),在iOS 8以上的系统,可以通过Apple Push Notification service(APNs)PushKit Framework来创建服务,而不需要通过原来的建立Socket或者其他方式的长连接来监听来电。

VoIP服务需要注意以下几点:

  • 设置后台运行:设置支持VoIP,建议设置支持后台音乐;
  • 使用PushKit来接受和处理VoIP推送;
  • 处理好音频焦点(Audio Session);
  • 使用CoreTelephony处理好电话事件;
  • 处理好网络变化情况;
  • 需要VoIP的服务证书,来允许推送服务端连接到VoIP服务端。