美文网首页iosios实用开发技巧征服iOS
iOS 10 开发遇到的问题总结

iOS 10 开发遇到的问题总结

作者: 没有昵称的昵称没有 | 来源:发表于2017-01-23 18:48 被阅读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)安全功能.具体步骤小编会在另一篇文章里介绍.

    相关文章

      网友评论

        本文标题:iOS 10 开发遇到的问题总结

        本文链接:https://www.haomeiwen.com/subject/caggbttx.html