iOS开发小技巧汇总
《iOS开发的一些奇巧淫技》:作者分享了一些 iOS 开发中涉及的小技巧。
IOS8,用户许可的变动:
iOS 8引入请求用户位置的两个新权限:一个仅当App运行时接收更新,另一个可以在App未运行的时候接收更新。
以前,开始监视位置的时候,iOS会自动向用户寻求App权限。这一点在iOS 8中有所改变,你需要在开始更新位置之前明确地显式请求用户许可。
为此,如果当前许可状态不明,你需要调用 CLLocationManager 的requestWhenInUseAuthorization或requestAlwaysAuthorization方法。
c
self.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) }
与之前相比多了一个回调,下面是这几步的简要解释:
- 首先创建一个UIUserNotificationSettings,一个定义了App显示通知类型的设置对象,其中也包括定义操作的类目(categories)。
- 调用-registerUserNotificationSettings:,传入设置对象。这会向用户请求许可。
- 当用户给予回应,新的delegate方法-application:didRegisterUserNotificationSettings:被调用。这里传入的notificationSettings与第二步传入的那个对象不一定相同。这个只描述得到了用户许可的权限。查看types就可以验证用户许可了那些权限。
- 如果成功获得用户许可,现在可以调用-registerForRemoteNotifications。注意这个方法不再接受参数了。现在设置信息已经被设置对象捕获,这里只要请求接受远程通知。
- 此后依然能像往常一样通过相同的回调来获取设备令牌(device token)。
IOS8,友好的二次许可请求
如果用户在询问首次出现时拒绝许可,那么以后就不再弹出询问。如果用户拒绝了一个必要的许可,常见的情形是在App中显示错误页面,或是告诉用户如何到 设置隐私 中开启相应许可的提示。上述做法多少显得有些笨拙,也有不少App因此得到了差评。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。