iOS 10 开发遇到的问题总结

每次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)安全功能.具体步骤小编会在另一篇文章里介绍.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,270评论 25 707
  • 吚吚哑哑,听不懂说的是什么, 幼稚的音色中传递的美好, 是的,我们感受到了! 嘻嘻哈哈,简简单单就听懂了, 一笑而...
    秀秀王子阅读 151评论 0 0
  • 此时在字节码生成的Country2类是final类,并且没有无参的构造方法。如果需要当作JavaBean使用,需要...
    lkmc2阅读 716评论 0 0