斯坦福大学iOS公开课笔记(14)-UIApplication和网络指示器

UIApplication

之前我们使用了应用委托,比如应用启动时调用的方法、回调URL时调用的方法等等,这些都是应用委托,但是应用委托实际上是由一个对象上的属性所设置,这就是UIApplication

在整个应用中,UIApplication只有一个实例:

1
UIApplication *myApplication = [UIApplication sharedApplication];

这里并没有很多东西,实际上有用的东西都在委托中AppDelegate中。

网络指示器

网络指示器其实是UIApplication中的一个特定的属性,他是一个布尔类型:

1
@property (nonatomic ,getter=is_) newworkActivityIndicatorVisible;

如果这个标识设置成YES,状态栏上就会有一个小菊花在转动,表示网络正在使用。

这个指示器的使用有一点麻烦,因为他仅仅是一个布尔类型,而且是存在于整个应用的,所以当你进行一个10秒的网络活动时,你把它设置为YES,而在第5秒的时候又开启了一个2秒的网络活动,这个时候同样把他设置成YES,但是当2秒的活动结束的时候,我们会把他设置成NO,那么问题来了,这个时候10秒的网络还没有结束。所以为了处理它我们需要做很多麻烦的判断。

完成之前的Demo

这个部分主要是将应用适配到iPad,这里就不详细介绍了。

Core Location

Core Location属于MapKit框架中,主要用于提供当前手机在地球上的位置。

CLLocation

CLLocation是基本对象,包含经纬度、高度等信息。

这里可以看到有一个C的结构体用来存放经纬度的信息:

1
2
3
4
5
@property (readonly) CLLocationCoordinate2D coordinate;
typedef{
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;

其中经纬度的值实际上是double型的数字。

还有高度信息:

1
@property (readonly) CLLocationDistance altitude;

高度信息是以来计算的单位。

精度

当我们获取位置时,我们可以设置获取的精度,如果是由GPS获取的定位,那么定位就一定是非常准确的,如果是由电话信号塔来获取的位置,可能就非常不准确。当然,精度越高,耗电量也就越大。

精度分为以下几种:

1
2
3
4
5
//kCLLocationAccuracyBest; 精度要求最高
//kCLLocationAccuracyNearestTenMeters; 10米
//kCLLocationAccuracyHundredMeters; 百米
//kCLLocationAccuracyKilometer; 千米
//kCLLocationAccuracyThreeKilometers; 3千米

CLLocationManager

CLLocationManager 可以用来实例化并使用获取定位的信息,那么具体操作的步骤是什么呢?

  • 首先,我们要检查我们手中的设备是否支持定位,而且不同的手机型号可能获取定位的方式也不同。
  • 接下来,我们要设定委托,并在想要获取数据的类中实现相关的代码。
  • 再来我们需要设置一些属性比如精度等等。
  • 最后,我们就可以开始监控设备的位置了。

我们可以通过设置一些属性,让手机在更新距离达到一定范围之后再通知我们进行处理,这样做可是尽可能的节约电量的使用。

1
2
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy; //期望的经度
@property(assign, nonatomic) CLLocationDistance distanceFilter; //更新到该距离之内不要告诉我更新了多少

并可以通过这些方法更新或停止更新位置信息,同时也可以汇报错误。

1
2
3
4
5
- (void)startUpdatingLocation;//开始更新位置
- (void)stopUpdatingLocation;//停止位置更新
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;//位置更新的代理方法
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;//更新失败
-

当地区发生重大变化时

当用户的位置发生重大的变化时,我们可以通过这两个方法获取。

1
2
- (void)startMonitoringSignificantLocationChanges;
- (void)stopMonitoringSignificantLocationChanges;

无论APP处于什么状态下,我们都可以获取到这些信息:

1
2
3
4
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//如果``launchOptions``存在``UIApplicationLaunchOptionsLocationKey``,说明程序启动的原因是因为位置发生了重大变化
return YES;
}

当用户进入某个区域时

我们也可以设定一个范围,当用户进入这个范围时,就会触发方法:

1
2
- (void)startMonitoringForRegion:(CLRegion *)region;
- (void)requestStateForRegion:(CLRegion *)region;

或者通过信标来监控

1
2
@property (readonly, nonatomic) CLLocationDistance maximumRegionMonitoringDistance;//设置最大监控距离
- (void)startRangingBeaconsInRegion:(CLBeaconRegion *)region;//设置信标

这节课的内容还没有结束,更多重要的MapKit相关课程都留到了下节课中,那就让我们下节课见吧!