iOS 13原生端适配攻略

            目录

            1. KVC访问私有属性

            2. 模态弹窗ViewController 默认样式改变

            3. 黑暗模式的适配

            4. LaunchImage即将废弃

            5. 新增一直使用蓝牙的权限申请

            6. Sign With Apple

            7. 推送Device Token适配

            8. UIKit 控件变化

            9. StatusBar新增样式


            1. KVC访问私有属性

            ?这次iOS 13系统升级,影响范围最广的应属KVC访问修改私有属性了,直接禁止开发者获取或直接设置私有属性。而KVC的初衷是允许开发者通过Key名直接访问修改对象的属性值,为其中最典型的 UITextField 的 _placeholderLabelUISearchBar 的 _searchField。 造成影响:在iOS 13下App闪退 错误代码:

            // placeholderLabel私有属性访问

            [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];

            [textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];

            // searchField私有属性访问

            UISearchBar *searchBar = [[UISearchBar alloc] init];

            UITextField *searchTextField = [searchBar valueForKey:@"_searchField"];

            解决方案: ?使用 NSMutableAttributedString 富文本来替代KVC访问 UITextField 的 _placeholderLabel

            textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"placeholder" attributes:@{NSForegroundColorAttributeName: [UIColor darkGrayColor], NSFontAttributeName: [UIFont systemFontOfSize:13]}];

            因此,可以为UITextFeild创建Category,专门用于处理修改placeHolder属性提供方法

             

            #import "UITextField+ChangePlaceholder.h"

             

            @implementation UITextField (Change)

             

            - (void)setPlaceholderFont:(UIFont *)font {

             

              [self setPlaceholderColor:nil font:font];

            }

             

            - (void)setPlaceholderColor:(UIColor *)color {

             

              [self setPlaceholderColor:color font:nil];

            }

             

            - (void)setPlaceholderColor:(nullable UIColor *)color font:(nullable UIFont *)font {

             

              if ([self checkPlaceholderEmpty]) {

                  return;

              }

              

              NSMutableAttributedString *placeholderAttriString = [[NSMutableAttributedString alloc] initWithString:self.placeholder];

              if (color) {

                  [placeholderAttriString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, self.placeholder.length)];

              }

              if (font) {

                  [placeholderAttriString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, self.placeholder.length)];

              }

              [self setAttributedPlaceholder:placeholderAttriString];

            }

             

            - (BOOL)checkPlaceholderEmpty {

              return (self.placeholder == nil) || ([[self.placeholder stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0);

            }

            关于 UISearchBar,可遍历其所有子视图,找到指定的 UITextField 类型的子视图,再根据上述 UITextField 的通过富文本方法修改属性。

            #import "UISearchBar+ChangePrivateTextFieldSubview.h"

             

            @implementation UISearchBar (ChangePrivateTextFieldSubview)

             

            /// 修改SearchBar系统自带的TextField

            - (void)changeSearchTextFieldWithCompletionBlock:(void(^)(UITextField *textField))completionBlock {

                

                if (!completionBlock) {

                    return;

                }

                UITextField *textField = [self findTextFieldWithView:self];

                if (textField) {

                    completionBlock(textField);

                }

            }

             

            /// 递归遍历UISearchBar的子视图,找到UITextField

            - (UITextField *)findTextFieldWithView:(UIView *)view {

             

                for (UIView *subview in view.subviews) {

                    if ([subview isKindOfClass:[UITextField class]]) {

                        return (UITextField *)subview;

                    }else if (subview.subviews.count > 0) {

                        return [self findTextFieldWithView:subview];

                    }

                }

                return nil;

            }

            @end

            PS:关于如何查找自己的App项目是否使用了私有api,可以参考 iOS查找私有API 文章


            2. 模态弹窗 ViewController 默认样式改变

            ?模态弹窗属性 UIModalPresentationStyle 在 iOS 13 下默认被设置为 UIModalPresentationAutomatic新特性,展示样式更为炫酷,同时可用下拉手势关闭模态弹窗。 若原有模态弹出 ViewController 时都已指定模态弹窗属性,则可以无视该改动。 若想在 iOS 13 中继续保持原有默认模态弹窗效果。可以通过 runtime 的 Method Swizzling 方法交换来实现。

             

            #import "UIViewController+ChangeDefaultPresentStyle.h"

             

            @implementation UIViewController (ChangeDefaultPresentStyle)

             

            + (void)load {

             

                static dispatch_once_t onceToken;

                dispatch_once(&onceToken, ^{

                    Class class = [self class];

                    //替换方法

                    SEL originalSelector = @selector(presentViewController:animated:completion:);

                    SEL newSelector = @selector(new_presentViewController:animated:completion:);

                    Method originalMethod = class_getInstanceMethod(class, originalSelector);

                    Method newMethod = class_getInstanceMethod(class, newSelector);;

                    BOOL didAddMethod =

                    class_addMethod(class,

                                    originalSelector,

                                    method_getImplementation(newMethod),

                                    method_getTypeEncoding(newMethod));

                                    

                    if (didAddMethod) {

                        class_replaceMethod(class,

                                            newSelector,

                                            method_getImplementation(originalMethod),

                                            method_getTypeEncoding(originalMethod));

                    } else {

                        method_exchangeImplementations(originalMethod, newMethod);

                    }

                });

            }

             

            - (void)new_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

                

                viewControllerToPresent.modalPresentationStyle = UIModalPresentationFullScreen;

                [self new_presentViewController:viewControllerToPresent animated:flag completion:completion];

            }

             

            @end

            #import "UIViewController+ChangeDefaultPresentStyle.h"

             

            @implementation UIViewController (ChangeDefaultPresentStyle)

             

            + (void)load {

             

                static dispatch_once_t onceToken;

                dispatch_once(&onceToken, ^{

                    Class class = [self class];

                    //替换方法

                    SEL originalSelector = @selector(presentViewController:animated:completion:);

                    SEL newSelector = @selector(new_presentViewController:animated:completion:);

                    Method originalMethod = class_getInstanceMethod(class, originalSelector);

                    Method newMethod = class_getInstanceMethod(class, newSelector);;

                    BOOL didAddMethod =

                    class_addMethod(class,

                                    originalSelector,

                                    method_getImplementation(newMethod),

                                    method_getTypeEncoding(newMethod));

                                    

                    if (didAddMethod) {

                        class_replaceMethod(class,

                                            newSelector,

                                            method_getImplementation(originalMethod),

                                            method_getTypeEncoding(originalMethod));

                    } else {

                        method_exchangeImplementations(originalMethod, newMethod);

                    }

                });

            }

             

            - (void)new_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {

                

                viewControllerToPresent.modalPresentationStyle = UIModalPresentationFullScreen;

                [self new_presentViewController:viewControllerToPresent animated:flag completion:completion];

            }

             

            @end


            3. 黑暗模式的适配

            针对黑暗模式的推出,Apple官方推荐所有三方App尽快适配。目前并没有强制App进行黑暗模式适配。因此黑暗模式适配范围现在可采用以下三种策略:

            • 全局关闭黑暗模式

            • 指定页面关闭黑暗模式

            • 全局适配黑暗模式

            3.1. 全局关闭黑暗模式

            方案一:在项目 Info.plist 文件中,添加一条内容,Key为 User Interface Style,值类型设置为String并设置为 Light 即可。

            方案二:代码强制关闭黑暗模式,将当前 window 设置为 Light 状态。

            if(@available(iOS 13.0,*)){

            self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

            }

            3.2 指定页面关闭黑暗模式

            从Xcode 11、iOS 13开始,UIViewController与View新增属性 overrideUserInterfaceStyle,若设置View对象该属性为指定模式,则强制该对象以及子对象以指定模式展示,不会跟随系统模式改变。

            • 设置 ViewController 该属性, 将会影响视图控制器的视图以及子视图控制器都采用该模式

            • 设置 View 该属性, 将会影响视图及其所有子视图采用该模式

            • 设置 Window 该属性, 将会影响窗口中的所有内容都采用该样式,包括根视图控制器和在该窗口中显示内容的所有控制器

            3.3 全局适配黑暗模式

            适配黑暗模式,主要从两方面入手:图片资源适配与颜色适配

            图片资源适配

            ?打开图片资源管理库 Assets.xcassets,选中需要适配的图片素材item,打开最右侧的 Inspectors 工具栏,找到 Appearances 选项,并设置为 Any, Dark模式,此时会在item下增加Dark Appearance,将黑暗模式下的素材拖入即可。关于黑暗模式图片资源的加载,与正常加载图片方法一致。

             

            image.png

             

             

            颜色适配

            iOS 13开始UIColor变为动态颜色,在Light Mode与Dark Mode可以分别设置不同颜色。 若UIColor色值管理,与图片资源一样存储于 Assets.xcassets 中,同样参照上述方法适配。 若UIColor色值并没有存储于 Assets.xcassets 情况下,自定义动态UIColor时,在iOS 13下初始化方法增加了两个方法

            + (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            - (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            • 这两个方法要求传一个block,block会返回一个 UITraitCollection 类

            • 当系统在黑暗模式与正常模式切换时,会触发block回调 示例代码:

            UIColor *dynamicColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {

                    if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {

                        return [UIColor whiteColor];

                    } else {

                        return [UIColor blackColor];

                    }

                }];

                

             [self.view setBackgroundColor:dynamicColor];

            当然了,iOS 13系统也默认提供了一套基本的黑暗模式UIColor动态颜色,具体声明如下:

            @property (class, nonatomic, readonly) UIColor *systemBrownColor        API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *systemIndigoColor       API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *systemGray2Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *systemGray3Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *systemGray4Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *systemGray5Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *systemGray6Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *labelColor              API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *secondaryLabelColor     API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *tertiaryLabelColor      API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *quaternaryLabelColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *linkColor               API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *placeholderTextColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *separatorColor          API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *opaqueSeparatorColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

            @property (class, nonatomic, readonly) UIColor *systemBackgroundColor                   API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *secondarySystemBackgroundColor          API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *tertiarySystemBackgroundColor           API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *systemGroupedBackgroundColor            API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *secondarySystemGroupedBackgroundColor   API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *tertiarySystemGroupedBackgroundColor    API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *systemFillColor                         API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *secondarySystemFillColor                API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *tertiarySystemFillColor                 API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            @property (class, nonatomic, readonly) UIColor *quaternarySystemFillColor               API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);

            监听模式的切换

            当需要监听系统模式发生变化并作出响应时,需要用到 ViewController 以下函数

            // 注意:参数为变化前的traitCollection,改函数需要重写

            - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;

            // 判断两个UITraitCollection对象是否不同

            - (BOOL)hasDifferentColorAppearanceComparedToTraitCollection:(UITraitCollection *)traitCollection;

            示例代码:

            - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {

                [super traitCollectionDidChange:previousTraitCollection];

                // trait has Changed?

                if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {

                // do something...

                }

                }

            系统模式变更,自定义重绘视图

            当系统模式变更时,系统会通知所有的 View以及 ViewController 需要更新样式,会触发以下方法执行(参考Apple官方适配链接):

            NSView

            - (void)updateLayer;

            - (void)drawRect:(NSRect)dirtyRect;

            - (void)layout;

            - (void)updateConstraints;

            UIView

            - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;

            - (void)layoutSubviews;

            - (void)drawRect:(NSRect)dirtyRect;

            - (void)updateConstraints;

            - (void)tintColorDidChange;

            UIViewController

            - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;

            - (void)updateViewConstraints;

            - (void)viewWillLayoutSubviews;

            - (void)viewDidLayoutSubviews;

            UIPresentationController

            - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;

            - (void)containerViewWillLayoutSubviews;

            - (void)containerViewDidLayoutSubviews;


            4. LaunchImage即将废弃

            ?使用 LaunchImage 设置启动图,需要提供各类屏幕尺寸的启动图适配,这种方式随着各类设备尺寸的增加,增加了额外不必要的工作量。为了解决 LaunchImage 带来的弊端,iOS 8引入了 LaunchScreen 技术,因为支持 AutoLayout + SizeClass,所以通过 LaunchScreen 就可以简单解决适配当下以及未来各种屏幕尺寸。 Apple官方已经发出公告,2020年4月开始,所有使用iOS 13 SDK 的App都必须提供 LaunchScreen。 创建一个 LaunchScreen 也非常简单 (1)New Files创建一个 LaunchScreen,在创建的 ViewController 下 View 中新建一个 Image,并配置 Image 的图片 (2)调整 Image 的 frame 为占满屏幕,并修改 Image 的 Autoresizing 如下图,完成

            image.png

            5. 新增一直使用蓝牙的权限申请

            在iOS13之前,无需权限提示窗即可直接使用蓝牙,但在iOS 13下,新增了使用蓝牙的权限申请。最近一段时间上传IPA包至App Store会收到以下提示。

             

            image.png

             

             

            解决方案:只需要在 Info.plist 里增加以下条目:

            NSBluetoothAlwaysUsageDescription 这里输入使用蓝牙来做什么


            6. Sign With Apple

            ?在iOS 13系统中,Apple要求提供第三方登录的App也要支持「Sign With Apple」,具体实践参考 iOS Sign With Apple实践


            7. 推送Device Token适配

            在iOS 13之前,获取Device Token 是将系统返回的 NSData 类型数据通过 -(void)description; 方法直接转换成 NSString 字符串。 iOS 13之前获取结果:

             

            image.png

            iOS 13之后获取结果:

             

            image.png

            适配方案: 目的是要将系统返回 NSData 类型数据转换成字符串,再传给推送服务方。-(void)description; 本身是用于为类调试提供相关的打印信息,严格来说,不应直接从该方法获取数据并应用于正式环境中。将 NSData 转换成 HexString,即可满足适配需求。

             

            - (NSString *)getHexStringForData:(NSData *)data {

                NSUInteger length = [data length];

                char *chars = (char *)[data bytes];

                NSMutableString *hexString = [[NSMutableString alloc] init];

                for (NSUInteger i = 0; i < length; i++) {

                    [hexString appendString:[NSString stringWithFormat:@"%0.2hhx", chars[i]]];

                }

                return hexString;

            } 


            8. UIKit 控件变化

            主要还是参照了Apple官方的 UIKit 修改文档声明。iOS 13 Release Notes

            8.1. UITableView

            iOS 13下设置 cell.contentView.backgroundColor 会直接影响 cell 本身 selected 与 highlighted 效果。 建议不要对 contentView.backgroundColor 修改,而对 cell 本身进行设置。

            8.2. UITabbar

            Badge 文字大小变化

            iOS 13之后,Badge 字体默认由13号变为17号。 建议在初始化 TabbarController 时,显示 Badge 的 ViewController 调用 setBadgeTextAttributes:forState: 方法

            if (@available(iOS 13, *)) {

                [viewController.tabBarItem setBadgeTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:13]} forState:UIControlStateNormal];

                [viewController.tabBarItem setBadgeTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:13]} forState:UIControlStateSelected];

            }

            8.2. UITabBarItem

            加载gif需设置 scale 比例

            NSData *data = [NSData dataWithContentsOfFile:path];

            CGImageSourceRef gifSource = CGImageSourceCreateWithData(CFBridgingRetain(data), nil);

            size_t gifCount = CGImageSourceGetCount(gifSource);

            CGImageRef imageRef = CGImageSourceCreateImageAtIndex(gifSource, i,NULL);

             

            //  iOS 13之前

            UIImage *image = [UIImage imageWithCGImage:imageRef]

            //  iOS 13之后添加scale比例(该imageView将展示该动图效果)

            UIImage *image = [UIImage imageWithCGImage:imageRef scale:image.size.width / CGRectGetWidth(imageView.frame) orientation:UIImageOrientationUp];

            CGImageRelease(imageRef);

            无文字时图片位置调整

            iOS 13下不需要调整 imageInsets,图片会自动居中显示,因此只需要针对iOS 13之前的做适配即可。

            if (IOS_VERSION < 13.0) {

                  viewController.tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);

              }

            TabBarItem选中颜色异常

            在 iOS 13下设置 tabbarItem 字体选中状态的颜色,在push到其它 ViewController 再返回时,选中状态的 tabbarItem 颜色会变成默认的蓝色。

            设置 tabbar 的 tintColor 属性为原本选中状态的颜色即可。

            self.tabBar.tintColor = [UIColor redColor];

            8.3. 新增 Diffable DataSource

            在 iOS 13下,对 UITableView 与 UICollectionView 新增了一套 Diffable DataSource API。为了更高效地更新数据源刷新列表,避免了原有粗暴的刷新方法 - (void)reloadData,以及手动调用控制列表刷新范围的api,很容易出现计算不准确造成 NSInternalInconsistencyException 而引发App crash。 api 官方链接


            9. StatusBar新增样式

            StatusBar 新增一种样式,默认的 default 由之前的黑色字体,变为根据系统模式自动选择展示 lightContent 或者 darkContent

            相关文章
            相关标签/搜索
            管家婆精选心水资料中特网 明溪县| 南华县| 永丰县| 广丰县| 甘肃省| 斗六市| 辽中县| 长乐市| 肥西县| 哈巴河县| 西城区| 英德市| 香格里拉县| 大新县| 八宿县| 林芝县| 方城县| 泰州市| 台湾省| 丰顺县| 新巴尔虎右旗| 凌源市| 黄梅县| 宜君县| 辽阳县| 奉贤区| 余江县| 富阳市| 崇信县| 泰宁县| 尉犁县| 彭水| 和田市| 松潘县| 巴南区| 探索| 新宾| 日照市| 南陵县| 麻城市| 越西县| 雅安市| 茂名市| 新田县| 永仁县| 宜宾县| 金寨县| 太保市| 天门市| 新闻| 咸丰县| 湾仔区| 环江| 左贡县| 漠河县| 蓬莱市| 崇明县| 克什克腾旗| 株洲县| 浦城县| 广平县| 江阴市| 固原市| 保山市| 博兴县| 天峻县| 肇州县| 阳西县| 涟源市| 黑水县| 德保县| 龙里县| 陇川县| 尉氏县| 克拉玛依市| 陇南市| 汤阴县| 合水县| 连江县| 松潘县| 宁武县| 峡江县| 吉木萨尔县| 大余县| 阳原县| 贺兰县| 平果县| 株洲县| 灵璧县| 肇源县| 吴忠市| 安吉县| 特克斯县| 河北省| 新安县| 河北区| 禹城市| 六枝特区| 三亚市| 辛集市| 唐海县| 时尚| 绥中县| 雷波县| 平泉县| 应城市| 麟游县| 定兴县| 池州市| 沅江市| 增城市| 沐川县| 米林县| 额敏县| 通化市| 芮城县| 丹凤县| 徐水县| 威宁| 从江县| 郸城县| 上栗县| 闻喜县| 石渠县| 庐江县| 宾川县| 林甸县| 信丰县| 谷城县| 南召县| 南漳县| 武穴市| 玉环县| 关岭| 石台县| 罗源县| 乐都县| 皋兰县| 凤台县| 皮山县| 广灵县| 乐平市| 社会| 安顺市| 名山县| 乌鲁木齐县| 行唐县| 九龙坡区| 德兴市| 昌图县| 弥渡县| 雷州市| 宁化县| 青河县| 临湘市| 威宁| 巩留县| 翁牛特旗| 右玉县| 金溪县| 孟州市| 天台县| 永和县| 娄烦县| 平塘县| 新泰市| 平遥县| 康马县| 黑龙江省| 民县| 德兴市| 元朗区| 卢湾区| 漳浦县| 自贡市| 宁明县| 双牌县| 尼玛县| 自贡市| 贵港市| 宜宾市| 长汀县| 吴堡县| 武鸣县| 江阴市| 甘洛县| 收藏| 白水县| 晋中市| 咸宁市| 大邑县| 达拉特旗| 焉耆| 焉耆| 嘉定区| 镇江市| 深水埗区| 卫辉市| 衡水市| 梁河县| 霍林郭勒市| 娱乐| 阿克陶县| 丹凤县| 龙游县| 延津县| 加查县| 黄大仙区| 澄城县| 雅安市| 平度市| 沾化县| 诸城市| 深泽县| 博罗县| 柳林县| 济源市| 英吉沙县| 保定市| 花垣县| 米易县| 石阡县| 石林| 衡山县| 丰宁| 东阳市| 邢台市| 财经| 灵宝市| 无为县| 奎屯市| 金寨县| 东乡县| 固安县| 津市市| 金昌市| 汽车| 渝中区| 田林县| 固始县| 乌什县| 寻甸| 盐源县| 九龙县| 阳西县| 樟树市| 陇西县| 荔波县| 临城县| 龙陵县| 宝鸡市| 靖安县| 水城县| 黄陵县| 咸阳市| 武强县| 北辰区| 勐海县| 合江县| 云浮市| 荣昌县| 七台河市| 广安市| 虎林市| 华坪县| 南汇区| 岑巩县| 嫩江县| 罗平县| 梅河口市| 屏东市| 民县| 长岭县| 上饶县| 娄烦县| 灵寿县| 舟曲县| 景泰县| 西吉县| 长汀县| 鄂温| 普兰店市| 玉溪市| 东光县| 确山县| 谢通门县| 岫岩| 邮箱| 河曲县| 德兴市| 丰县| 辽阳市| 体育| 呼玛县| 客服| 宜兴市| 平武县| 三江| 阿图什市| 历史| 疏附县| 勃利县| 宁明县| 南华县| 印江| 安多县| 呼图壁县| 深水埗区| 石嘴山市| 通渭县| 旬邑县| 科尔| 怀宁县| 德令哈市| 迁安市| 宜宾县| 集贤县| 偃师市| 丹棱县| 景泰县| 赞皇县| 曲周县| 南阳市| 鹤壁市| 呼和浩特市| 林西县| 剑阁县| 广州市| 临猗县| 大化| 阿拉善左旗| 芒康县| 四平市| 韶关市| 惠水县| 江孜县| 客服| 南木林县| 杂多县| 玉屏| 昭觉县| 江永县| 鹰潭市| 固阳县| 日土县| 惠来县| 池州市| 高阳县| 陆良县| 乌兰浩特市| 平山县| 木兰县| 连平县| 凤庆县| 华坪县| 延长县| 崇州市| 巫山县| 宜阳县| 远安县| 嘉荫县| 阳原县| 循化| 德钦县| 安新县| 清丰县| 扎鲁特旗| 徐闻县| 皮山县| 伊通| 扶绥县| 永仁县| 盐边县| 瓮安县| 自治县| 西昌市| 青岛市| 翁牛特旗| 类乌齐县| 花垣县| 沧州市| 攀枝花市| 临城县| 兴文县| 义乌市| 武陟县| 三亚市| 通道| 申扎县| 云林县| 合水县| 石阡县| 平果县| 青州市| 东丽区| 安义县| 海兴县| 襄城县| 都兰县| 张掖市| 惠来县| 伽师县| 新绛县| 神农架林区| 清原| 云龙县| 班戈县| 蒲江县| 雷州市| 广安市| 黎川县| 肥东县| 宝坻区| 安顺市| 鄂托克前旗| 永寿县| 抚宁县| 淮南市| 彩票| 渝北区| 牡丹江市| 安溪县| 德保县| 韶关市| 遂川县| 延寿县| 安康市| 驻马店市| 东海县| 东城区| 白朗县| 方山县| 濮阳市| 金川县| 依安县| 普宁市| 嘉峪关市| 股票| 北京市| 油尖旺区| 磴口县| 高碑店市| 白城市| 桐城市| 黄骅市| 曲麻莱县| 兴义市| 阿鲁科尔沁旗| 刚察县| 垣曲县| 肥西县| 柘城县| 来宾市| 临武县| 沐川县| 策勒县| 广西| 习水县| 噶尔县| 小金县| 马鞍山市| 镇赉县| 河间市| 彭州市| 如皋市| 峨眉山市| 衡南县| 区。| 潞城市| 罗田县| 镇康县| 湟中县| 方山县| 海门市| 云和县| 临城县| 阿克苏市| 瓮安县| 临夏市| 广汉市| 剑河县| 张家港市| 聂拉木县| 酉阳| 新民市| 周口市| 平利县| 五峰| 奇台县| 临西县| 乌兰察布市| 内黄县| 仁布县| 马龙县| 电白县| 鄱阳县| 民和| 巢湖市| 大埔区| 澄迈县| 济南市| 吐鲁番市| 宿迁市| 罗田县| 石棉县| 绥德县| 大兴区| 南漳县| 田东县| 澄迈县| 柳州市| 陆良县| 盐城市| 拉萨市| 山东省| 安新县| 梓潼县| 大名县| 科技| 广灵县| 富阳市| 新丰县| 林西县| 怀化市| 维西| 台南县| 新平| 富蕴县| 瑞丽市| 囊谦县| 犍为县| 连城县| 三原县| 孟津县| 临江市| 墨竹工卡县| 湖北省| 巴彦县| 高安市| 渝北区| 平乡县| 二连浩特市| 兴国县| 织金县| 疏勒县| 拉萨市| 安岳县| 丽水市| 穆棱市| 镇原县| 泌阳县| 东乡| 乳山市| 桑日县| 曲周县| 礼泉县| 福清市| 茂名市| 师宗县| 蒙山县| 斗六市| 来安县| 常山县| 寻甸| 永寿县| 吉安市| 青河县| 恩平市| 任丘市| 封开县| 乐亭县| 恩平市| 张北县| 来凤县| 镇雄县| 西乌珠穆沁旗| 剑河县| 清苑县| 龙胜| 五华县| 姜堰市| 玛纳斯县| 澄江县| 洪江市| 霍林郭勒市| 涞水县| 耒阳市| 都昌县| 潼南县| 都安| 宁德市| 洛浦县| 阿拉善右旗| 桐梓县| 于田县| 咸阳市| 通渭县| 大荔县| 罗定市| 东乌珠穆沁旗| 越西县| 东兰县| 民和| 观塘区| 西峡县| 哈巴河县| 漳州市| 什邡市| 古浪县| 河东区| 南阳市| 双峰县| 齐河县| 通州市| 杭锦后旗| http://wap.cwaxdv.fit http://uipqbn.fit http://wap.sfpjcy.fit http://www.uipqbn.fit http://www.jmpknw.fit http://m.xubjpv.fit http://m.svtluc.fit http://wap.gvwpwu.fit http://wap.mtyxhu.fit http://nbaudk.fit http://wap.qbxpur.fit http://wap.goqqwc.fit http://wap.oftkut.fit http://dsmkbk.fit http://wap.xvputn.fit http://qosxya.fit http://wap.cejtcf.fit http://wap.nfletg.fit