iosios实用开发技巧征服iOS

iOS 10 开发遇到的问题总结

2017-01-23  本文已影响562人  没有昵称的昵称没有

每次iOS一更新,就是我们iOS开发的噩梦,它打一个喷嚏,我们就要地震.Xcode7就有访问不到网络的问题,现在小编讲一讲iOS 10 开发遇到的问题:
1.iOS 10 隐私权限设置
2.iOS 10 网络问题
3.iOS 10 推送通知问题
4.iOS 10 适配问题
5.iOS 10 上传APP审核问题

首先,说一说隐私权限设置问题.在升级Xcode8之后,iOS 10开始对隐私权限更加严格.如果你没有设置就会导致APP崩溃,小编开始更新系统的时候就出现了这个问题.解决办法是在info.plist文件添加对应的Key-Value就可以了.如图所示:


QQ20170123-145951@2x.png

在这里小编总结了一些隐私设置Key-Value,具体步骤如图:

QQ20170123-150659@2x.png

点击Source Code之后会跳到这个节面:

QQ20170123-151944@2x.png

在这里添加的代码:

    <key>NSAppleMusicUsageDescription</key>
    <string>音乐权限</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>蓝牙权限</string>
    <key>NSCalendarsUsageDescription</key>
    <string>日历权限</string>
    <key>NSCameraUsageDescription</key>
    <string>摄像头权限</string>
    <key>NSContactsUsageDescription</key>
    <string>通讯录权限</string>
    <key>NSHealthShareUsageDescription</key>
    <string>健康权限</string>
    <key>NSHealthUpdateUsageDescription</key>
    <string>健康权限</string>
    <key>NSHomeKitUsageDescription</key>
    <string></string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>地理位置权限</string>
    <key>NSLocationUsageDescription</key>
    <string>地理位置权限</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>定位当前位置的城市</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>麦克风权限</string>
    <key>NSMotionUsageDescription</key>
    <string>运动权限</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>相册权限</string>
    <key>NSRemindersUsageDescription</key>
    <string></string>
    <key>NSSiriUsageDescription</key>
    <string>Siri权限</string>
    <key>NSSpeechRecognitionUsageDescription</key>
    <string>语音识别权限</string>
    <key>NSVideoSubscriberAccountUsageDescription</key>
    <string></string>

2.网络问题
说起这个问题,小编就觉得很坑.小编做完一个项目,发了一个测试版本给客户,我们这边的机型访问网络都没有问题,唯独客户的手机有问题.小编就测试怎么会出现这种情况.客户说:"我的手机一开始可以访问网络,但是关机之后就不行了".so,按照客户的操作先关机(苹果的关机门你懂的),然后在重启,结果可以访问网络.小编当时就整个人蒙了,心想苹果这也太坑了吧,难道又是机型问题?无力吐槽了,最后在百度找到了解决办法:
方案一: 重启手机再打开有相关联网问题的应用

对于此问题可能带来的问题有:如果你有多个应用具有网络访问问题,你可能需要多次重启设备后依次打开相关应用,因为在每次重启设备之后,系统貌似只能修正一个应用的联网访问请求,关于此问题还需要进一步求证。

方案二:更改 iOS 10 中的蜂窝网络访问权限设置

除了重启设别以外,你也可以尝试在「设置-通用-蜂窝移动网络-使用无线局域网与蜂窝移动的应用」选项中更改任意应用的联网权限设置后再恢复原先设置选项,完成操作后再次打开相关问题应用,也可以解决这一问题。

方案三:临时启动无线局域网助理

在「设置」-「蜂窝移动网络」打开「无线局域网助理」选项,之后再打开相关问题应用也可以解决这个问题。

修复问题后即可关闭「无线局域网助理」选项。
小编的代码解决方法是在访问不到网络时出现警告框,在警告框中选择设置跳转到手机的设置里的网络设置里.具体代码:

UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"网络错误" message:@"检测网络访问失败,您可以去设置中的设置.设置->蜂窝移动网络->若为iOS10以下选择开即可,iOS10以上使用无线局域网与蜂窝移动的应用->门店智能管理系统->选择您要使用的选项" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置", nil];
    [alert show];
#pragma mark 警告框代理方法
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1) {
        if ([[[UIDevice currentDevice] systemVersion] floatValue] < 10.0) {
            NSURL *url = [NSURL URLWithString:@"prefs:root=MOBILE_DATA_SETTINGS_ID"];
            if( [[UIApplication sharedApplication]canOpenURL:url] ) {
                [[UIApplication sharedApplication]openURL:url];
            }
        }else {
            
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

        }
    }
}

3.推送通知问题
iOS 10的本地推送通知的方法也变了,首先判断是哪个系统.

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 10.0) {
        
        [self LowIOSTenSystem];
        
    }else {
        
        [self IOSTenSystem];
        
    }

之后是本地推送代码:

/**
 * IOS10 以下版本消息本地推送
 */

- (void)LowIOSTenSystem {
    
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    // 设置触发通知的时间
    NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
//    NSLog(@"fireDate=%@",fireDate);
    
    notification.fireDate = fireDate;
    // 时区
    notification.timeZone = [NSTimeZone defaultTimeZone];
    // 设置重复的间隔
//    notification.repeatInterval = kCFCalendarUnitSecond;
    
    // 通知内容
    notification.alertBody = self.stringLink;
    notification.applicationIconBadgeNumber = 1;
    // 通知被触发时播放的声音
    notification.soundName = UILocalNotificationDefaultSoundName;
    // 通知参数
    NSDictionary *userDict = [NSDictionary dictionaryWithObject:self.titleStr forKey:@"key"];
    notification.userInfo = userDict;
    
    // ios8后,需要添加这个注册,才能得到授权
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type
                                                                                 categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        // 通知重复提示的单位,可以是天、周、月
//        notification.repeatInterval = NSCalendarUnitDay;
    } else {
        // 通知重复提示的单位,可以是天、周、月
//        notification.repeatInterval = NSDayCalendarUnit;
    }
    
    // 执行通知注册
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
#pragma mark - 此方法是 用户点击了通知,应用在前台 或者开启后台并且应用在后台 时调起
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification
{
    //这里,你就可以通过notification的useinfo,干一些你想做的事情了
    UIAlertView * alert = [[UIAlertView alloc]initWithTitle:self.titleStr message:self.stringLink delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    [alert show];
    application.applicationIconBadgeNumber -= 1;
    
}

/**
 * IOS10 消息本地推送
 */

- (void)IOSTenSystem {
    
    // 使用 UNUserNotificationCenter 来管理通知
    UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
    
    //需创建一个包含待通知内容的 UNMutableNotificationContent 对象,注意不是 UNNotificationContent ,此对象为不可变对象。
    UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
    content.title = [NSString localizedUserNotificationStringForKey:self.titleStr arguments:nil];
    content.body = [NSString localizedUserNotificationStringForKey:self.stringLink
                                                         arguments:nil];
    content.sound = [UNNotificationSound defaultSound];
    
    // 在 alertTime 后推送本地推送
    UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger
                                                  triggerWithTimeInterval:1 repeats:NO];
    
    UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
                                                                          content:content trigger:trigger];
    
    //添加推送成功后的处理!
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        
    }];
}

4.iOS 10 适配有关的问题
APP程序内原来2个字的宽度是24,现在2个字需要27的宽度来显示了
希望有解决办法的朋友,评论告诉我一下耶,谢谢啦.
当我们手机系统字体改变了之后,那我们App的label也会跟着一起变化,这需要我们写很多代码来进一步处理才能实现,但是iOS 10 提供了这样的属性adjustsFontForContentSizeCategory来设置.(这个是百度的,如有问题请评论指正)代码如下:

UILabel *myLabel = [UILabel new];   /*
    UIFont 的preferredFontForTextStyle: 意思是指定一个样式,并让字体大小符合用户设定的字体大小。
   */
    myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline]; /*
 Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed.
 For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle.
 */
     //是否更新字体的变化
    myLabel.adjustsFontForContentSizeCategory = YES;

使用Xcode8打开xib文件后,会出现下图的提示.

QQ20160913-9.png

选择Choose Device即可.之后会发现布局的frame乱了,只需要更新一下frame即可.如下图:

QQ20160913-11.png

注意:如果按上面的步骤操作后,在用Xcode7打开Xib会报错误:

QQ20160913-12.png

解决办法:需要删除Xib里面

<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>

这句话,以及把< document >中的toolsVersion和< plugIn >中的version改成你正常的xib文件中的值,不过不建议这么做.

5.iOS 10 上传APP审核问题
首先你要确定第一个问题就是隐私设置问题,工程中要访问的这些必须都要在info.plist添加,否则你上传到App Store的ipa包会报错.
然后是2017年1月1日起,苹果App Store中的所有App都必须启用 App Transport Security(ATS)安全功能.具体步骤小编会在另一篇文章里介绍.

上一篇下一篇

猜你喜欢

热点阅读