范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SDK的IOS移动端笔记

  SDK的移动端测试:真机测试、模拟器测试、直接测试、界面测试。
  真机测试即:用苹果手机进行测试,真机架构一般是arm系列CPU架构。
  模拟器测试即:xcode工具自带的仿真器模块,架构一般是x86_64或i386系列。
  直接测试即 :直接建立工程,基于测试demo的调试性测试。
  界面测试即:进行简单地APP界面开发,形成简单地测试操作界面。IOS【iPhone】知识背景:
  1. iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么iOS测试分为模拟器测试和真机测试,处理器分为32位处理器,和64位处理器, 模拟器32位处理器测试需要i386架构,(iphone5,iphone5s以下的模拟器) 模拟器64位处理器测试需要x86_64架构,(iphone6以上的模拟器) 真机32位处理器需要armv7,或者armv7s架构,(iphone4真机/armv7, ipnone5,iphone5s真机/armv7s) 真机64位处理器需要arm64架构。(iphone6,iphone6p以上的真机) project -> target -> building setting -> Arhitectures 设置 2. 编译库属性设置:
  1.Framework
  Framework是Mac OS X下必不可少的部分,不妨去看看/System/Library/Frameworks/下面,一大堆Framework。Framework是dylib的进一步演化,它把头文件、文档、动态链接库等整合成一个有机的目录,类似一种自描述的方式,这种做法其实在Mac OS X下随处可见。比如应用程序,一般都是一个目录,譬如/Applications/iTunes.app目录对应应用程序iTunes,双击这个目录即开始执行。这种做法和Windows下常见的一个exe/dll打天下很不相同。Framework的创建工具也是libtool,详细用法参考man。
  2.dylib
  动态链接库已成为现代操作系统的基本组成部分,比如Windows下数不清的.DLL文件,Linux下成千上万的.so文件。Mac OS X下也有许多动态链接库,他们的扩展名是.dylib, 所谓dylib,就是bsd风格的动态库 。.dylib是Mach-O格式,也就是Mac OS X下的二进制文件格式。Mac OS X提供了一系列工具,用于创建和访问动态链接库。
  3.设置库编译属性
  debug属性设置为no的时候,会编译支持所有架构的版本,编译的速度会变慢,设置为yes 的时候,只编译当前的architecture版本,编译速度快。
  一般情况下,debug 设置为yes,release为no,这样发行版本能适应不同设备。 3. 常用mac工具:编译xcode工程 xcodebuild -sdk  iphoneos8.1   -target test  -configuration Release  -arch arm64  -arch armv7  CODE_SIGN_IDENTITY="iPhone Distribution: xxxxxxx" clean build /* -sdk 指定最低的SDK版本 -target 指定打包的target -configuration 指定测试或者发布包 -arch 指定cpu的指令集 CODE_SIGN_IDENTITY 指定证书 clean built 设定每次生成app之前都会清楚掉旧的记录 */ xcodebuild -showsdks //查看所支持的SDK xcodebuild -list //查看所支持的target
  2. 【xrun:  通过app文件生成ipa文件 】 sudo xcrun -sdk iphoneos PackageApplication    -v build/Release-iphoneos/test.app  -o `pwd`/build/Release-iphoneos/test2.ipa --sign "iPhone Distribution: xxxxxxxxxx"
  3.创建库【libtool】 libtool -static -o c a.framework/a b.framework/b /*合并库*/  lipo -create liba.a  libb.a  -output libc.a
  4.【xcode-select】XCODEDIR=`xcode-select --print-path`
  5.【otool : 查看库依赖】/* 在苹果审核的时候,苹果可以获取到我们包的API,用于私有API的检测, 那我们使用otool反编译ipa,就像Android的apkTool一样,简单有效。 选择你的ipa包,然后把后缀名改为zip,解压缩得到Payload文件夹,里面就是你的APP。*/ otool -L libfontmanager.dylib otool -ov libwstssl.dylib  /*[查看ipa包是否加壳:其中cryptid代表是否加壳,1代表加壳,0代表已脱壳 ,  两遍,其实代表着该可执行文件支持两种架构armv7和arm64.]*/ otool -l 可执行文件 | grep crypt  otool -tV execfilename //查看汇编码
  6.【lipo -info [ lipo主要用于处理通用二进制文件 ] | file | otool -hv : 查看库架构】lipo -info libcurl.a   //查看库内容 file libcurl.a    //查看库架构 otool -hv xxxx.a // 查看库架构  lipo -info xxx.framework/xxx.a  //查看第三方库的architetures lipo -create xxxx xxxx -output xxxx  //整合成Fat文件 lipo libReact.a -thin arm64 -output arm64/lib-arm64.a //提取特定的cpu架构的thin文件 lipo -remove cpu(armv7/arm64等) xxxx -output xxxx  // 移除掉特定的cpu架构的文件
  7.【其他:gcc | nm | 】/*  编译器/usr/bin/cc   汇编器/usr/bin/as    链接器/usr/bin/ld    创建动态链接库 /usr/bin/libtool    【 cc -c a.c b.c】--》 【 ld -r -o c.o a.o b.o】--》    【 libtool -dynamic -o c.dylib a.o b.o】    【 libtool -static -o c.a a.o b.o  //创建静态库】 */ libtool -dynamic -o c.dylib a.o b.o // 用libtool来创建动态链接库。  gcc -dynamiclib -o c.dylib a.c b.c //gcc直接编译  nm c.dylib  // 可以看到导出符号表 nm -nm a.out  gcc -shared -o c.so a.c b.c // linux 下创建动态库
  8.【ar: [create and maintain library archives ]打包命令】/*这个命令用于创建和管理归档(archive)文件。主要应用是解决第三方库冲突,例如ffmpeg冲突就可以用ar分离出冲突文件,并打包*/ ar -t lib-arm64.a // 查看库文件的member otool -L libAFNetworking.a  ar -x lib-arm64.a  //将.a文件解压缩 ar -rcs liba.a ./*.o    //打包库 ar -d lib.a conflict.o  //将.o从.a静态库中删除
  9.【xxd : 二进制查看命令,将文件显示为16进制字符串表示形式 】/*查看YTKNetwork.a文件里面包含net字符串的,帮助我们分析一些二进制文件。*/ xxd libYTKNetwork.a | grep "net"
  10.【dwarfdump:提取轻量符号表】 /*DWARF("Debugging With Attributed RecordFormats")是记录应用的调试信息的文件,  目前最新版本是V5。在iOS中,我们将Build Settings -> Debug Information Format  修改为DWARF With dSYM File即可将调试信息从可执行文件中剥离到dSYM文件中。  一旦可执行文件被剥离了DWARF文件,那么原则上可执行文件中内部的符号地址映射就不存在了(  这里需要注意下,近期发现如果我们本地修改为release编译虽然能生成dSYM文件,  但是可执行文件中依旧保留了符号表,如果有相关实验不要被此误导)。  尽管我们可以通过OC的存储特性来还原这种映射关系,但是这已经脱离了DWARF的范围了。*/  dwarfdump --debug-info xxxx.app.dSYM/Contents/Resources/DWARF/xxxx //debug_info这个section中存储了主要的调试信息  /* 其他: bugly提供了一种从dSYM文件中抽取轻量符号表的功能,生成的符号表更加小巧,而且保留了地址和符号的映射关系,日志解析后仍然可以精确到行号。 */
  11. 【class-dump:导出头文件 .h   列表 】class-dump -H 可执行文件(.app) -o 目标目录 /*class-dump-z 是对 class-dump 和 class-dump-x 的改进版,完全用C++重写,避免动态调用, 这使得 class-dump-z 比 class-dump 和 class-dump-x快10倍左右, 并且可以在 Linux、Mac、 iPhone 上运行。 */
  12.【其他:】/*反汇编 objdump*/ objdump -x a.out  // 反汇编a.out所有header信息 objdump -D a.out // 反汇编a.out所有section信息  /* 修改动态库的寻找路径install_name_tool  [ change dynamic shared library install names], 	 Library not loaded 的错误时可以使用*/ install_name_tool -id @rpath/a.framework/a a.framework/a //注意上面的动态库路径是个绝对路径,动态链接器加载的时候肯定找不到动态库,我们需要用@RPATH的相对路径,需要使用install_name_tool修改 install_name_tool  -add_rpath /ameworks   ecord install_name_tool -delete_rpath /Users/libs  /Users/xxx.dylib install_name_tool oldpath newpath /path2APP/appName  install_name_tool -change /usr/local/opt/sdl/lib/libSDL-1.2.0.dylib /usr/local/sdl1_2_15/lib/libSDL-1.2.0.dylib /usr/local/bin/ffplay  /*dumpdecrypted: 砸壳命令*/ /*reveal :分析UI工具**/ /*iOS-app-signer-master : ios重签名工具*/ /*cycript : 很多语法的解释器,可以动态修改和调试Mac app和iOS app*/ /*查找工程中是否包含某个文件*/ find . -type f | grep -e ".a" -e ".framework" -e ".m" -e ".cpp" | xargs grep -s ALSmartLink /*MonkeyDev: 集成非越狱手机逆向工具的插件,集成了重签名、打包、classDump、cycript等等一系列逆向需要的工具,是Xcode的一个插件*/ /*Cydia Substrate: Cydia Substrate是一个基于Hook的代码修改框架,可以在Android、iOS平台使用,并实现修改系统默认代码。*/ 4. IOS交叉编译/*cmake 工程 可依赖 ios.toolchain.cmake  : 交叉编译工具链 ios-cmake作为iOS版的Cmake编译工具链,watchOS 和 tvOS开发支持全部的模拟器和相关选项。 Tested with the following combinations:  XCode 5.x, iOS SDK 7 XCode 6.1.x, iOS SDK 8.1 XCode 8.2.x, iOS SDK 10.2 XCode 9.4.x, iOS SDK 11.4 XCode 10.0.x, iOS SDK 12.0 */ /* cmake .. -DCMAKE_TOOLCHAIN_FILE=../../ios.toolchain.cmake -DIOS_PLATFORM=SIMULATOR64 */ Options Set -DIOS_PLATFORM to "SIMULATOR" to build for iOS simulator 32 bit (i386) DEPRECATED Set -DIOS_PLATFORM to "SIMULATOR64" (example above) to build for iOS simulator 64 bit (x86_64) Set -DIOS_PLATFORM to "OS" to build for Device (armv7, armv7s, arm64, arm64e) Set -DIOS_PLATFORM to "OS64" to build for Device (arm64, arm64e) Set -DIOS_PLATFORM to "TVOS" to build for tvOS (arm64) Set -DIOS_PLATFORM to "SIMULATOR_TVOS" to build for tvOS Simulator (x86_64) Set -DIOS_PLATFORM to "WATCHOS" to build for watchOS (armv7k, arm64_32) Set -DIOS_PLATFORM to "SIMULATOR_WATCHOS" to build for watchOS Simulator (x86_64)  Additional Options -DENABLE_BITCODE=(BOOL) - Enabled by default, specify FALSE or 0 to disable bitcode -DENABLE_ARC=(BOOL) - Enabled by default, specify FALSE or 0 to disable ARC -DENABLE_VISIBILITY=(BOOL) - Disabled by default, specify TRUE or 1 to enable symbol visibility support -DIOS_ARCH=(STRING) - Valid values are: armv7, armv7s, arm64, arm64e, i386, x86_64, armv7k, arm64_32. By default it will build for all valid architectures based on -DIOS_PLATFORM (see above)交叉编译脚本参考
  编译涉及变量:
  IOS_MIN_SDK  =6.1
  EXTRA_MAKE_FLAGS  =  "-j4"
  XCODEDIR  =`xcode-select --print-path`
  IOS_SDK=$(xcodebuild -showsdks | grep iphoneos | sort | head -n 1 | awk "{print $NF}")
  SIM_SDK=$(xcodebuild -showsdks | grep iphonesimulator | sort | head -n 1 | awk "{print $NF}")
  IPHONEOS_PLATFORM=${XCODEDIR}/Platforms/iPhoneOS.platform
  IPHONEOS_SYSROOT=${IPHONEOS_PLATFORM}/Developer/SDKs/${IOS_SDK}.sdk
  IPHONESIMULATOR_PLATFORM=${XCODEDIR}/Platforms/iPhoneSimulator.platform
  IPHONESIMULATOR_SYSROOT=${IPHONESIMULATOR_PLATFORM}/Developer/SDKs/${SIM_SDK}.sdk
  CFLAGS  =  "-DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions"
  ./configure --build=x86_64-apple-darwin13.0.0 --host=armv7-apple-darwin13.0.0 --enable-static --disable-shared --prefix=${PREFIX}
  "CC=${CC}" "CFLAGS=${CFLAGS} -miphoneos-version-min=${IOS_MIN_SDK} -arch armv7 -isysroot ${IPHONEOS_SYSROOT}"
  "CXX=${CXX}" "CXXFLAGS=${CXXFLAGS} -arch armv7 -isysroot ${IPHONEOS_SYSROOT}"
  LDFLAGS="-arch armv7 -miphoneos-version-min=${IOS_MIN_SDK} ${LDFLAGS}" "LIBS=${LIBS}"
  /*作者:https://blog.csdn.net/frodo_sens/article/details/41494081?locationNum=10&fps=1*/ #!/bin/bash   BUILD_I386_IOS_SIM=1 BUILD_ARMV7_IPHONE=1 BUILD_ARMV7S_IPHONE=1  BUILD_TARGET=lame   IOS_MIN_SDK=6.1   (   PWD=`pwd` PREFIX=${PWD}/${BUILD_TARGET}  rm -rf ${PREFIX}/platform mkdir -p ${PREFIX}/platform   EXTRA_MAKE_FLAGS="-j4"   XCODEDIR=`xcode-select --print-path`  IOS_SDK=$(xcodebuild -showsdks | grep iphoneos | sort | head -n 1 | awk "{print $NF}") SIM_SDK=$(xcodebuild -showsdks | grep iphonesimulator | sort | head -n 1 | awk "{print $NF}")   IPHONEOS_PLATFORM=${XCODEDIR}/Platforms/iPhoneOS.platform IPHONEOS_SYSROOT=${IPHONEOS_PLATFORM}/Developer/SDKs/${IOS_SDK}.sdk  IPHONESIMULATOR_PLATFORM=${XCODEDIR}/Platforms/iPhoneSimulator.platform IPHONESIMULATOR_SYSROOT=${IPHONESIMULATOR_PLATFORM}/Developer/SDKs/${SIM_SDK}.sdk  CC=clang CFLAGS="-DNDEBUG -g -O0 -pipe -fPIC -fcxx-exceptions" CXX=clang CXXFLAGS="${CFLAGS} -std=c++11 -stdlib=libc++" LDFLAGS="-stdlib=libc++" LIBS="-lc++ -lc++abi"    if [ $BUILD_ARMV7_IPHONE -eq 1 ] then   echo "##################" echo " armv7 for iPhone" echo "##################"   ( 		cd ${PWD}      		make ${EXTRA_MAKE_FLAGS} distclean     ./configure --build=x86_64-apple-darwin13.0.0 --host=armv7-apple-darwin13.0.0 --enable-static --disable-shared --prefix=${PREFIX} "CC=${CC}" "CFLAGS=${CFLAGS} -miphoneos-version-min=${IOS_MIN_SDK} -arch armv7 -isysroot ${IPHONEOS_SYSROOT}" "CXX=${CXX}" "CXXFLAGS=${CXXFLAGS} -arch armv7 -isysroot ${IPHONEOS_SYSROOT}" LDFLAGS="-arch armv7 -miphoneos-version-min=${IOS_MIN_SDK} ${LDFLAGS}" "LIBS=${LIBS}"     make ${EXTRA_MAKE_FLAGS}     make ${EXTRA_MAKE_FLAGS} install  		 		cd ${PREFIX}/platform 		rm -rf armv7 		mkdir armv7 		cp ${PREFIX}/lib/*.a ${PREFIX}/platform/armv7 		 ) ARMV7_IPHONE_OUTPUT=`find ${PREFIX}/platform/armv7/*.a`    else  ARMV7_IPHONE_OUTPUT=  fi  if [ $BUILD_ARMV7S_IPHONE -eq 1 ] then  echo "###################" echo " armv7s for iPhone" echo "###################"   ( 		cd ${PWD} 		     make ${EXTRA_MAKE_FLAGS}  distclean     ./configure --build=x86_64-apple-darwin13.0.0 --host=armv7s-apple-darwin13.0.0 --enable-static --disable-shared --prefix=${PREFIX} "CC=${CC}" "CFLAGS=${CFLAGS} -miphoneos-version-min=${IOS_MIN_SDK} -arch armv7s -isysroot ${IPHONEOS_SYSROOT}" "CXX=${CXX}" "CXXFLAGS=${CXXFLAGS} -arch armv7s -isysroot ${IPHONEOS_SYSROOT}" LDFLAGS="-arch armv7s -miphoneos-version-min=${IOS_MIN_SDK} ${LDFLAGS}" "LIBS=${LIBS}"     make ${EXTRA_MAKE_FLAGS}     make ${EXTRA_MAKE_FLAGS} install  		 		cd ${PREFIX}/platform 		rm -rf armv7s 		mkdir armv7s 		cp ${PREFIX}/lib/*.a ${PREFIX}/platform/armv7s  ) ARMV7S_IPHONE_OUTPUT=`find ${PREFIX}/platform/armv7s/*.a`   else  ARMV7S_IPHONE_OUTPUT=  fi    if [ $BUILD_I386_IOS_SIM -eq 1 ] then  echo "###########################" echo " i386 for iPhone Simulator" echo "###########################"  ( 		cd ${PWD} 		make ${EXTRA_MAKE_FLAGS} distclean     ./configure --build=x86_64-apple-darwin13.0.0 --host=i386-apple-darwin13.0.0 --enable-static --disable-shared --prefix=${PREFIX} "CC=${CC}" "CFLAGS=${CFLAGS} -miphoneos-version-min=${IOS_MIN_SDK} -arch i386 -isysroot ${IPHONESIMULATOR_SYSROOT}" "CXX=${CXX}" "CXXFLAGS=${CXXFLAGS} -arch i386 -isysroot ${IPHONESIMULATOR_SYSROOT}" LDFLAGS="-arch i386 -miphoneos-version-min=${IOS_MIN_SDK} ${LDFLAGS}" "LIBS=${LIBS}"     make ${EXTRA_MAKE_FLAGS}     make ${EXTRA_MAKE_FLAGS} install 		 		 		cd ${PREFIX}/platform 		rm -rf sim 		mkdir sim 		cp ${PREFIX}/lib/*.a ${PREFIX}/platform/sim )  IOS_SIM_OUTPUT=`find ${PREFIX}/platform/sim/*.a`  else  IOS_SIM_OUTPUT=  fi    echo "############################" echo " Create Mixd Libraries" echo "############################"    (  		cd ${PREFIX}/platform 		rm -rf mixd 		mkdir -p mixd      lipo ${IOS_SIM_OUTPUT} ${ARMV7_IPHONE_OUTPUT} ${ARMV7S_IPHONE_OUTPUT} -create -output ${PREFIX}/platform/mixd/lib${BUILD_TARGET}.a 		 )   ) 2>&1 #) >build.log 2>&1  echo "done"【SSL】SDK移动端IOS测试
  测试环境:同一局域网
  客户端:Mac笔记本的xcode开发工具, iphone手机
  服务端: 互联网机:Linux虚拟机: centos_7.6_x64_pure.vmx -->/usr/local/nginx的服务器
  服务端:配置修改: 修改算法套件: ssl_ciphers ALL; listen: 4433 ssl;客户端: 1. arm64/armv7测试---【armv7 暂无相应的测试机】   环境:          1.真机通过数据线连接到Mac笔记本         2.Xcode打开测试工程test_openssl_iphone,配置属性:1. 设备选真机 2. Build Phases: 添加头文件[compile], 库[link Binary with libraries]和证书【boundle】3. General : 配置测试的系统版本 ios11.3 4. Build Setting : (1.Architectures 2. Enable Bitcode: no 3. 所有的库文件搜索路径及头文件搜索路径配置) 4. info.plist: App Transport Security Settings-->Allow Arbitrary Loads :yes          3. main.m: 修改IP+端口, 或者其他配置项         4. 编译通过后,在真机上进行如下配置: (1. 设置-通用-描述文件与设备管理-信任xxx.@qq.com. 2.设置--无线局域网--使用无线与蜂窝网APP-- test- open --- WLAN与蜂窝网络)         5. 运行测试  2. I386/x86_64测试: 环境: 1。打开Xcode, 选择Xcode的仿真机型 2. Xcode打开测试工程test_openssl_simulator,配置属性:1. 设备选真机 2. Build Phases: 添加头文件[compile], 库[link Binary with libraries]和证书【boundle】3. General : 配置测试的系统版本 ios11.3 4. Build Setting : (1.Architectures: [i386 x86_64 armv7 arm64 都配置上]  2. Enable Bitcode: no 3. 所有的库文件搜索路径及头文件搜索路径配置) 4. info.plist: App Transport Security Settings-->Allow Arbitrary Loads :yes  5.  3. main.m: 修改IP+端口, 或者其他配置项 4. 编译通过后,在真机上进行如下配置: (1. 设置-通用-描述文件与设备管理-信任xxx.@qq.com. 2.设置--无线局域网--使用无线与蜂窝网APP-- test- open --- WLAN与蜂窝网络) 5. 运行测试
  测试demo的模板:main.m的模版:  // //  main.m //  ios_openssl_test // //  Created by westone on 2021/10/31. //  #import  #import "AppDelegate.h" #include   int ssl_conn() {     NSLog(@"ssl_conn enter. ");      /*设置证书查找路径:*/     //设置加载文件的名字及后缀,需要将文件添加至iOS的沙盒中:Copy Bundle Resources.     ///private/var/containers/Bundle/Application/66F95C21-47DB-40C5-9960-A61D165ACF02/ios_openssl_test.app/CA.pem     NSString *string = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];     //例如 :签名证书 :CS.pem ; 加载后路径指针为:sig_cert_path     NSString *SIG_CERT_PATH = [[NSBundle mainBundle] pathForResource:@"CS" ofType:@"pem"];     char *sig_cert_path = (char*)[SIG_CERT_PATH UTF8String];          NSString *ENC_CERT_PATH = [[NSBundle mainBundle] pathForResource:@"CE" ofType:@"pem"];     char *enc_cert_path = (char*)[ENC_CERT_PATH UTF8String];          NSString *SIG_KEY_PATH = [[NSBundle mainBundle] pathForResource:@"CS" ofType:@"key"];     char *sig_key_path = (char*)[SIG_KEY_PATH UTF8String];          NSString *ENC_KEY_PATH = [[NSBundle mainBundle] pathForResource:@"CE" ofType:@"key"];     char *enc_key_path = (char*)[ENC_KEY_PATH UTF8String];          NSString *CA_CERT_PATH = [[NSBundle mainBundle] pathForResource:@"CA" ofType:@"pem"];     char *ca_cert_path = (char*)[CA_CERT_PATH UTF8String];      // 测试网络通信:通过request百度,测试网络互通性     NSString *urlStr = @"https://baidu.com";     //如果字符串里面含有中文要进行转码     urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];     //2.创建资源路径     NSURL *url = [NSURL URLWithString:urlStr];     //3.创建请求     NSURLRequest *request = [NSURLRequest requestWithURL:url];     //4.发送请求     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {         NSLog(@"%@",data);     }];          NSLog(@"sig_cert:@%s, sig_key:@%s, enc_cert:@%s, enc_key:%s, ca_cert:%s . ",                sig_cert_path, sig_key_path, enc_cert_path, enc_key_path, ca_cert_path);      /*--------功能验证开始---------*/           /*--------功能验证结束---------*/     NSLog(@"ssl_conn end. ");     return 1; }   int main(int argc, char * argv[]) {     NSString * appDelegateClassName;     @autoreleasepool {         // Setup code that might create autoreleased objects goes here.         appDelegateClassName = NSStringFromClass([AppDelegate class]);     }          printf("openssl test start. ");          int ret = ssl_conn();     if (ret == 1)         printf("ssl 测试成功. ");     else         printf("ssl 测试失败.  ");          return UIApplicationMain(argc, argv, nil, appDelegateClassName); }

有娃之后,才知道当初装得草率了有娃的家和没娃的家,最大区别在哪里?相信在这个话题上,妈妈们最有发言权,确实,在有娃之后,家就会出现明显的变化,不止是人口增加之后的家具猛增,连带安全性舒适性实用度等等,都在呈现递有了它们为你撑腰,再小的家也有炫耀的底气小户型装修时,不少户主会选择在格局上大动干戈,来显示出空间的气势。然而,改变格局这个方法并不适用所有小户型,且一旦改错了或者改后悔,都无法再恢复原本的模样,需要非常谨慎才行。这时,小鹏P7官宣706KM续航后进入修罗场电动星球News出品作者毓肥3月6号上周五,工信部正式发布新能源汽车推广应用推荐车型目录(2020年第3批)。名录里面首次披露了两款热门电动轿车的性能参数国产特斯拉Model3单电这个偏光镜,外形有点儿酷。T1偏光驾驶镜总喜欢戴酷酷的眼镜,一则可以遮挡强光,保护眼睛二则可以装点容颜。是不是好多mm都有这样的感受呢?在阳光比较强烈的情况下,佩戴太阳镜可以减少紫外线阳光直射,对眼睛起到一定的保护作用,颜值控的心头好唐麦W5真无线蓝牙耳机前言在这个真无线蓝牙耳机井喷式增长的2020年,可以说各个厂家都在耳机的音质上下了很大功夫,你能从他们的口中听到各种你闻所未闻的关于音质技术的词汇。而这次,更夸张的是,你能从百元的质感爆表!首款支持LDAC的海贝WH2TWS蓝牙耳机体验前阵子Lime在刷朋友圈,刚好看到一个耳机发烧友发了一张HiByWH2的海报,感觉质感很不错,于是我就赶着首发赶紧入手了一枚,来给大家分享下。WH2支持LDAC蓝牙编码同样价格也很智能跳绳哪家强?云麦Keep对比测评前言随着近几年大众对健康管理认知的深入,大家都开始注重健身和养身。而在运动方面,我个人一直都很喜欢跳绳,主要是跳绳是比跑步游泳更高效燃脂的。因为自己是久坐青年,跳绳可以燃烧全身的脂防风又防雨,出门还保暖!CAMEL骆驼冲锋衣体验作为一名产品摄影师,常年都在棚子内拍摄,没有风吹日晒,因此我也就没有太多的保暖外套和冲锋衣。不过今年,忽然有很多房车的拍摄项目,这就意味着我需要经常外出进行拍摄了。但这北方的高原,想要皮肤好?热水器也要好!云米Al燃气热水器,超微气泡来洗澡前言不知道小伙伴们的家中用的是哪一款热水器呢?热水器在我们的观念中,属于比较传统的家电之一,自从2001年以来风靡全球,成为每个家庭必不可缺的家电之一。一款好的热水器,不仅承载着个下班回家,你真的需要一双舒服的拖鞋。咕咚舒缓拖鞋体验前言夏天来了,我特别喜欢穿帆布鞋,但是帆布鞋佷磨脚,穿的时间太久的话一天都不舒服。所以我每次穿帆布鞋就想着赶紧回家,把鞋子脱掉,好好地休息一下。而且我也很注意家里的拖鞋体验,不想外咕咚10K助我短距离专业慢跑一臂之力前言这几天天儿也热了,大家也都开始参与到马拉松的跑步运动中来,好多周边的朋友在入圈的时候都来问我,到底应该买什么样的鞋子,这类装备到底有没有讲究。我相信绝大多数人都是随便买一双鞋子
联想没有柳传志能发展到今天成为PC世界第一吗?组装电脑世界第一多,关键是卖给国外很便宜,所以全世界其他各国都喜欢买。便宜了就不容易赚钱,怎么办,以两倍价卖给国内,何况前些年机关统一采购,市场在国内,量大得很,不就赚了。而其他电拥有一台真正的千元机是种怎样的体验?感谢邀请拥有一台真正的千元机是种怎样的体验?题主问题的核心是拥有一台真正的千元机是种怎么样的体验?我觉得你算是问对人了,因为我平时使用就是千元机当做备用,而且还有一款主力机型。不过我用的手机是国产华为和红米,感觉越来越好了有朋友看我换了新手机,还会问一句,为啥又换个红米了,苹果的也降价了,你又不是买不起,哈,我觉得不是钱的问题,我一般会调侃一句我是爱国民族主义者,哈哈!其实爱国是真的赤子心,但是我爱俄罗斯人帮华为突破了3G而土耳其人帮华为占领了5G当一些老人到了77岁时,如果会用智能手机聊天,我们会觉得他很厉害了。而77岁的任正非,还在大风大浪中引领着华为奋勇前进,不得不说,任总真的很辛苦。而我今日想说的,正是任正非的远见,首发4nm芯片,华为的劣势越来越大,芯片行业或将迎来洗牌众所周知,目前芯片行业中的巨头企业总共也就几家,分别是苹果华为高通和联发科。其中,苹果是整个行业的带头大哥,A系列芯片一直是行业天花板,而高通凭借着小米OV等企业遥遥领先市场,5G国产厂商纷纷官宣骁龙8新机网友就差魅族了每一次高通带来新的旗舰处理器,各大手机厂商都会随着出一波官宣搭载该处理器的新机消息,即使拿不到首发权和首批机型的名头,也能沾一波新旗舰的热度,今天的新一代骁龙8也不例外。随着高通官哪种助听器的清晰度最好?助听器的清晰度其实与本身的听损时间长短,耳鸣时间的长短,自己的言语识别能力,还有所选择助听器的性能都有一定的关系,可以到专业的验配中心去是试听,在做选择。助听器的清晰度直接影响到患为什么所有APP几乎都要访问手机通讯录,访问以后到底有什么用?大数据啊,窥探你的隐私,搜集信息呗。晚上你比较无聊孤单的时候,找网上的小妹妹和你聊天,越来越投入的时候,人家邀请你裸聊,你答应了,到那时候你就知道通讯录的好处了!第一个原因使用软件有人用真我手机吗?感觉怎么样?今年7月份买的红米note10pro,还可以,但阳光下或者偏一点角度就看不清,有时阳光下接电话手捂住也不行,后来看头条真我的视频,就抱着试试的心态买了q3pro,比红米少了nfc什家用宽带要选择多大速率的?我觉得选择当地宽带的主流带宽即可。或者是最低的。我们这就是200兆最低了,没有100了好像。前几年国家大力推行宽带网络建设。我本来办的3年的10兆的宽带,结果快到期的时候,居然已经5G手机芯片大战升级安卓阵营即将迈入4nm时代每经记者王晶每经编辑文多5G手机芯片战局烟硝再起。继联发科推出5G旗舰芯片天玑9000后不久,12月1日,芯片厂商高通(Qualcomm)也发布了采用4nm制程工艺的芯片产品骁龙8