iOS开发小技巧汇总

《iOS开发的一些奇巧淫技》:作者分享了一些 iOS 开发中涉及的小技巧。

IOS8,用户许可的变动:

iOS 8引入请求用户位置的两个新权限:一个仅当App运行时接收更新,另一个可以在App未运行的时候接收更新。

以前,开始监视位置的时候,iOS会自动向用户寻求App权限。这一点在iOS 8中有所改变,你需要在开始更新位置之前明确地显式请求用户许可。

为此,如果当前许可状态不明,你需要调用 CLLocationManager 的requestWhenInUseAuthorization或requestAlwaysAuthorization方法。

cself.locationManager = [[CLLocationManager alloc] init];
  self.locationManager.delegate = self;
  if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
    [self.locationManager requestWhenInUseAuthorization];
  }
  [self.locationManager startUpdatingLocation];

最后一步:在App的 info.plist 中添加 NSLocationWhenInUseUsageDescription 或 NSLocationAlwaysUsageDescription 为新键,然后输入告知用户请求许可的字符串。例如:“显示附近的物品项需要获取您的位置。”

图片描述

图片描述

IOS8,修复通知注册

在iOS 8中,用户通知许可有变动,主要是为了支持 可操作通知 。老版本的相关API在iOS 8中无效,不宜使用。

现在,通知许可共分为两 层 ,你的App必须先请求许可 显示 特定类型的通知,而成功得到用户许可后,你需要请求许可接收 远程 通知。

之前的做法是在-application:didFinishLaunchingWithOptions:内调用-registerForRemoteNotificationTypes:来接收delegate回调检查状态。如果在iOS 8中这么写,你会发现根本没有调用delegate方法。

这是由于你需要先请求第一层用户通知许可。以下是 appDelegate 中的一个简单示例:

c- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // 1
  UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
  // 2
  [application registerUserNotificationSettings:settings];

  return YES
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
  // 3
  if (notificationSettings.types != UIUserNotificationTypeNone) {
    // 4
    [application registerForRemoteNotifications];
  }
}

// 5
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // ... (no changes needed)
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
// ... (no changes needed)
}

与之前相比多了一个回调,下面是这几步的简要解释:

  1. 首先创建一个UIUserNotificationSettings,一个定义了App显示通知类型的设置对象,其中也包括定义操作的类目(categories)。
  2. 调用-registerUserNotificationSettings:,传入设置对象。这会向用户请求许可。
  3. 当用户给予回应,新的delegate方法-application:didRegisterUserNotificationSettings:被调用。这里传入的notificationSettings与第二步传入的那个对象不一定相同。这个只描述得到了用户许可的权限。查看types就可以验证用户许可了那些权限。
  4. 如果成功获得用户许可,现在可以调用-registerForRemoteNotifications。注意这个方法不再接受参数了。现在设置信息已经被设置对象捕获,这里只要请求接受远程通知。
  5. 此后依然能像往常一样通过相同的回调来获取设备令牌(device token)。

IOS8,友好的二次许可请求

如果用户在询问首次出现时拒绝许可,那么以后就不再弹出询问。如果用户拒绝了一个必要的许可,常见的情形是在App中显示错误页面,或是告诉用户如何到 设置隐私 中开启相应许可的提示。上述做法多少显得有些笨拙,也有不少App因此得到了差评。

IOSTips:AlertView弹出到系统设置


真烦人
502 声望22 粉丝

吾日三省吾身-为人谋而不忠乎?与朋友交而不信乎?传不习乎?