精华内容
下载资源
问答
  • Minecraft:基于iOS Java版启动器。 导航 介绍 这是为了使Minecraft Java在越狱的iOS上运行。 最低要求:运行iOS 12或更高版本的设备。 建造 要求: Mac OS X(经过测试:10.15) XCode(经过测试:11.7.0) 已...
  • Minecraft:适用于iOS的Java版启动器,基于PojavLauncher Android。 PojavLauncher_iOS Minecraft:基于PojavLauncher Android的iOS Java版启动器。 导航简介建筑物如何运作? 当前状态已知问题许可证贡献积分和第三...
  • checkra1n0.11.0用于给iOS系统进行越狱,支持iOS14,可以将其写入U盘使用支持A9芯片
  • iOS启动图片生成.zip

    2020-03-31 08:59:38
    解压文件,用文本编辑打开auto.sh,更改cd后面的路径为当前文件夹路径,保存后双击auto.sh可一字洞生成,或打开终端cd进入当前文件夹,执行node image,image.js里可以自定义要转换的图片大小格式,该工具依赖于...
  • SESpringBoard, 一款超级易于使用的iOS项目启动器 SESpringBoard简介SESpringBoard是一个易于使用的启动器视图,供你在iPhone应用程序中使用。 只需将SESpringBoard下的所有文件添加到项目中,你就可以 !用法vc1 = ...
  • iLauncher是一款仿苹果IOS桌面的安卓桌面软件,不仅仅是图标的改变,从特效上都是深度复制IOS。  画面不错,功能很简单。  2.1.12.3版更新信息:  1、修正了一些错误  2、删除了缓存选项
  • 主要思路就是用一个控制来作为播放视频的载体,然后在让这个控制作为根视图,视频播放完成之后那就该干嘛干嘛了。 话不多说了,下面就放代码好了 先新建一个控制AnimationViewController在控制中新建一个...
  • 适用于 iOS 8+ 的 Ableton Live 场景启动器应用程序,作为学习项目用 Swift 编写。 设置 Ableton 和 OSC 有关设置说明,请参阅。 建造 使用安装 iOS 8+ 框架依赖项( 、 ): # Needed if you get the "Multiple ...
  • iOS启动速度优化总结

    千次阅读 2019-07-18 16:03:50
    随着项目越做越大,代码和业务量越来越多,这时候每次启动APP的时候就会花费较长的时间,这对用户来说体验很不好。所以,针对APP启动时间的优化还是很有必要的。 关于APP启动时间的分析和优化可以以main()为分界点...

           随着项目越做越大,代码和业务量越来越多,这时候每次启动APP的时候就会花费较长的时间,这对用户来说体验很不好。所以,针对APP启动时间的优化还是很有必要的。

           关于APP启动时间的分析和优化可以以main()为分界点,分为main()方法执行之前的加载时间(pre-main time)和main()之后的加载时间。那么,如何定量的测量这两个阶段具体的执行时间呢,下面先给出测量方法,看一下自己项目启动时间是否合理:

    一、main()方法之前启动时间的测量方法:

           在Xcode中添加环境变量参数DYLD_PRINT_STATISTICS即可,这样运行APP时在控制台就会打印出pre-main花费的时间,如下图:

     

    如果想打印详细的pre-main中各个过程花费的时间,可以再添加一个DYLD_PRINT_STATISTICS_DETAILS参数,这时你会看到pre-main time和total time的值不一样,其实下边的total time - debugger pause time就和上边的pre-main time大概一致了。如下图:

     

    PS:如果你想打印dyld装载动态库的顺序,可以设置这个环境变量 DYLD_PRINT_LIBRARIES

     

    二、main()方法之后的启动时间的测量方法: 

       在main.m文件中,定义一个全局变量:

    CFAbsoluteTime startTime;
    
    int main(int argc, char * argv[]) {
        startTime = CFAbsoluteTimeGetCurrent();

       在AppDelegate.m文件中didFinishLaunchingWithOptions方法return之前计算时间差:

     double launchTime = CFAbsoluteTimeGetCurrent() - startTime;
     NSLog(@"launchTime = %f秒",launchTime);

     

    三、main()方法调用之前启动过程的解析:

         App开始启动后,系统内核(XNU)首先加载可执行文件(自身App的所有.o文件的集合),然后加载动态链接器dyld,dyld是一个专门用来加载动态链接库的库。 执行从dyld开始,dyld从可执行文件的依赖开始, 递归加载所有的依赖动态链接库。 
    动态链接库包括:iOS 中用到的所有系统 framework,加载OC runtime方法的libobjc,系统级别的libSystem,例如libdispatch(GCD)和libsystem_blocks (Block)。

     

        总结来说,main()方法调用前,启动过程大体分为如下步骤: 

        1、内核加载可执行文件

        2、load dylibs image (加载程序所需的动态库镜像文件)

        3、Rebase image /  Bind image (由于ASLR(address space layout randomization)的存在,可执行文件和动态链接库在虚拟内  存中的加载地址每次启动都不固定,所以需要修复镜像中的资源指针)

        4、Objc setup (注册Objc类、将Category中的方法插入方法列表)

        5、initializers (调用Objc类的+load()方法、调用C++类的构造函数)

     

       针对上边各个启动过程,我们可以做的优化有:

       1、减少动态库的引用,将项目中不使用的Framework及时删除,将Xcode配置中General -> Linked Frameworks and Libraries中使用不到的系统库不再引用。

       2、合并动态库。

       3、尽量不使用内嵌(embedded)的dylib,加载内嵌dylib性能开销较大。

       4、清理项目中冗余的类、category。对于同一个类有多个category的,建议进行合并。

       5、将不必须在+load方法中做的事情延迟到+initialize中。

       6、尽量不要用C++虚函数(创建虚函数表有开销),不要在C++构造函数中做大量耗时操作。

     

    四、main()方法调用之后过程的解析: 

         main()方法调用之后,主要是didFinishLaunchingWithOptions方法中初始化必要的服务,显示首页内容等操作。这时候我们可以做的事情主要有:

         1、将一些不影响首页展示的服务放到其他线程中去处理,或者延时处理和懒加载。延时处理可以监听Runloop的状态,当进入kCFRunLoopBeforeWaiting(即将休眠状态)再去处理任务,最大限度的利用CPU等系统资源。

         2、使用Xcode的Instruments的Time Profiler工具,分析启动过程中比较耗时的方法和操作,然后,进行具体的优化。

        3、重点关注TabBarController和首页的性能,保证尽快的能展示出来。这两个控制器及里边的view尽量用代码进行布局,不使用storyboard和xib,如果在布局上想更进一步的优化,那就连autolayout(Massonry)都不要使用,直接使用frame进行布局。

        4、本地缓存。首页的数据离线化,优先展示本地缓存数据,等待网络数据返回之后更新缓存并展示。

     

    以上就是关于iOS客户端启动优化的相关总结,如有不同意见或者更好的方案,欢迎沟通交流。 

     

    参考:

    iOS启动时间优化

    今日头条iOS客户端启动速度优化

    iOS App从点击到启动(介绍系统架构和底层知识较多)

    APP从编译到链接再到启动的过程 

    展开全文
  • 注意:请不要在此仓库上使用zip下载功能,... 一个小型的iOS应用程序,用作Readium SDK的启动器/测试平台。 詹金斯建立状态 主 开发 许可信息 许可信息可以在存储库根目录中的license.txt文件中以及源代码本身中找到。
  • 此插件增加了在启动器中更改应用程序徽章的功能。 它支持iOS和某些Android设备(即使在Oreo上,官方API也不支持该功能)。 入门 的iOSiOS上,需要通知权限才能更新徽章。 会自动询问何时添加或删除徽章。 还将...
  • 程序启动的完整过程 1.main函数 2.UIApplicationMain 创建UIApplication对象 创建UIApplication的delegate对象 3.delegate对象开始处理(监听)系统事件(没有storyboard) 程序启动完毕的时候, 就会调用代理的...

    项目中常见文件

    Info.plist常见的设置

    建立一个工程后,会在Supporting files文件夹下看到一个“Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除

    项目中其他Plist文件不能带有“Info”这个字眼,不然会被错认为是传说中非常重要的“Info.plist”

    Info.plist

    常见属性(红色部分是用文本编辑器打开时看到的key)

    • Localiztion native development region(CFBundleDevelopmentRegion)-本地化相关
    • Bundle display name(CFBundleDisplayName)-程序安装后显示的名称,限制在10-12个字符,如果超出,将被显示缩写名称
    • Icon file(CFBundleIconFile)-app图标名称,一般为Icon.png
    • Bundle version(CFBundleVersion)-应用程序的版本号,每次往App Store上发布一个新版本时,需要增加这个版本号
    • Main storyboard file base name(NSMainStoryboardFile)-主storyboard文件的名称
    • Bundle identifier(CFBundleIdentifier)-项目的唯一标识,部署到真机时用到

    Info.plist 格式内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleExecutable</key>
        <string>$(EXECUTABLE_NAME)</string>
        <key>CFBundleDisplayName</key>
        <string>PickerView Demo</string>
        <key>CFBundleIdentifier</key>
        <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleName</key>
        <string>$(PRODUCT_NAME)</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
        <string>1.0</string>
        <key>CFBundleVersion</key>
        <string>1</string>
        <key>LSRequiresIPhoneOS</key>
        <true/>
        <key>UILaunchStoryboardName</key>
        <string>LaunchScreen</string>
        <key>UIRequiredDeviceCapabilities</key>
        <array>
            <string>armv7</string>
        </array>
        <key>UISupportedInterfaceOrientations</key>
        <array>
            <string>UIInterfaceOrientationPortrait</string>
            <string>UIInterfaceOrientationLandscapeLeft</string>
            <string>UIInterfaceOrientationLandscapeRight</string>
        </array>
    </dict>
    </plist>

    pch文件

    • 项目的Supporting files文件夹下面有个“工程名-Prefix.pch”文件,也是一个头文件
    • pch头文件的内容能被项目中的其他所有源文件共享和访问
    • 一般在pch文件中定义一些全局的宏
    • 在pch文件中添加下列预处理指令,然后在项目中使用Log(…)来输出日志信息,就可以在发布应用的时候,一次性将NSLog语句移除(在调试模式下,才有定义DEBUG)
    #ifdef DEBUG
    #define Log(...) NSLog(__VA_ARGS__)
    #else
    #define Log(...) /* */
    #endif
    #import <Availability.h>
    
    #ifndef __IPHONE_5_0
    #warning "This project uses features only available in iOS SDK 5.0 and later."
    #endif
    
    /************__OBJC__BEGIN************/
    // 里面的所有内容只能用到.m文件中或者.mm
    #ifdef __OBJC__
    
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    #ifdef DEBUG  // 调试阶段
    #define MJLog(...) NSLog(__VA_ARGS__)
    #else // 发布阶段
    #define MJLog(...)
    #endif
    
    #define ABC 10
    
    #endif
    /************__OBJC__END************/
    
    
    /**
     *  外面的所有东西,整个项目共享
     */
    #define Name 10
    
    /**
     pch文件的作用:
     1.存放一些全局的宏(整个项目中都用得上的宏)
     2.用来包含一些全部的头文件(整个项目中都用得上的头文件)
     3.能自动打开或者关闭日志输出功能
     */

    UIApplication

    什么是UIApplication

    • UIApplication对象是应用程序的象征
    • 每一个应用都有自己的UIApplication对象,而且是单例的
    • 通过[UIApplication sharedApplication]可以获得这个单例对象
    • 一个iOS程序启动后创建的第一个对象就是UIApplication对象
    • 利用UIApplication对象,能进行一些应用级别的操作

    UIApplication的常用属性

    设置应用程序图标右上角的红色提醒数字

    @property(nonatomic) NSInteger applicationIconBadgeNumber;

    0代表清除图标右上角的数字

    UIApplication *app = [UIApplication sharedApplication];
    app.applicationIconBadgeNumber = 0;

    设置联网指示器的可见性

    @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
    UIApplication *app = [UIApplication sharedApplication];
    app.networkActivityIndicatorVisible = YES;

    iOS7中的状态栏

    从iOS7开始,系统提供了2种管理状态栏的方式

    • 通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)
    • 通过UIApplication管理(一个应用程序的状态栏都由它统一管理)

    在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式

    状态栏的样式

    - (UIStatusBarStyle)preferredStatusBarStyle; 

    状态栏的可见性

    - (BOOL)prefersStatusBarHidden; 

    利用UIApplication来管理状态栏

    如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置



    openURL:

    UIApplication有个功能十分强大的openURL:方法

    - (BOOL)openURL:(NSURL*)url;
    • URL : 一个资源的唯一路径
    • URL的组成 == 协议头://主机域名/路径
    • 网络资源URL的组成 == http://www.baidu.com/1.png
    • 本地文件资源URL的组成 == file:///Users/apple/Desktop/1.png

    打电话

    UIApplication *app = [UIApplication sharedApplication];
    [app openURL:[NSURL URLWithString:@"tel://10086"]];

    发短信

    [app openURL:[NSURL URLWithString:@"sms://10086"]];

    发邮件

    [app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];

    打开一个网页资源

    [app openURL:[NSURL URLWithString:@"http://yoferzhang.com"]];

    打开其他app程序

    UIApplicationDelegate

    UIApplication 和 delegate

    所有的移动操作系统都有个致命的缺点:app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止

    还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件

    delegate可处理的事件包括:
    - 应用程序的生命周期事件(如程序启动和关闭)
    - 系统事件(如来电)
    - 内存警告
    - … …

    UIApplicationDelegate协议

    // app接收到内存警告时调用
    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
    // app进入后台时调用(比如按了home键)
    - (void)applicationDidEnterBackground:(UIApplication *)application;
    // app启动完毕时调用
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

    每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理

    AppDelegate默认已经遵守了UIApplicationDelegate协议,已经是UIApplication的代理

    /**
     *  app进入后台的时候调用
     *
     *  一般在这里保存应用的数据(游戏数据,比如暂停游戏)
     */
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }
    
    /**
     *  清除不需要再使用的内存
     */
    - (void)applicationWillResignActive:(UIApplication *)application {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    程序启动过程

    iOS程序的启动过程



    UIApplicationMain

    main函数中执行了一个UIApplicationMain这个函数

    int UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);
    • argc、argv:直接传递给UIApplicationMain进行相关处理即可
    • principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
    • delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议
    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }

    UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

    接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)

    程序正常退出时UIApplicationMain函数才返回

    UIWindow

    UIWindow

    UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow

    iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了

    一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow

    也就说,没有UIWindow,就看不见任何UI界面

    添加UIView到UIWindow中两种常见方式:

    - (void)addSubview:(UIView *)view;
    // 直接将view添加到UIWindow中,但并不会理会view对应的UIViewController
    @property(nonatomic,retain) UIViewController *rootViewController;
    // 自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期

    常用方法

    - (void)makeKeyWindow;
    // 让当前UIWindow变成keyWindow(主窗口)
    - (void)makeKeyAndVisible;
    // 让当前UIWindow变成keyWindow,并显示出来

    UIWindow的获得

    [UIApplication sharedApplication].windows

    在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
    (平时输入文字弹出的键盘,就处在一个新的UIWindow中)

    [UIApplication sharedApplication].keyWindow

    用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow

    view.window

    获得某个UIView所在的UIWindow

    四大对象关系图



    总结

    程序启动的完整过程

    1.main函数

    2.UIApplicationMain

    • 创建UIApplication对象
    • 创建UIApplication的delegate对象

    3.delegate对象开始处理(监听)系统事件(没有storyboard)

    • 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
    • 在application:didFinishLaunchingWithOptions:中创建UIWindow
    • 创建和设置UIWindow的rootViewController
    • 显示窗口

    3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

    • 创建UIWindow
    • 创建和设置UIWindow的rootViewController
    • 显示窗口

    新博客文章地址:iOS程序启动过程,原理,UIApplication,代码启动界面

    展开全文
  • (0106)iOS开发之iOS13 适配

    千次阅读 2019-09-27 12:08:15
    升级到iOS13,UISearchController上的SearchBar显示异常,查看后发现对应的高度只有1px,目前没找到具体导致的原因, 解决办法是: 使用KVO监听frame值变化后设置去应该显示的高度 黑线处理crash 之前...

    UIWebview 将被废止

    在这里插入图片描述

    UITextField 的私有属性 _placeholderLabel

    [self.textField setValue:self.placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
    

    居然崩溃了,错误信息如下

    'Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug' 
    

    解决方法

    方案A:
     
    UITextField有个attributedPlaceholder的属性,我们可以自定义这个富文本来达到我们需要的结果。
     
    NSMutableAttributedString *placeholderString = [[NSMutableAttributedString alloc] initWithString:placeholder attributes:@{NSForegroundColorAttributeName : self.placeholderColor}];
    _textField.attributedPlaceholder = placeholderString;
     
     
    方案B:
     
    #import <objc/runtime.h>
     
     
    Ivar ivar =  class_getInstanceVariable([UITextField class], "_placeholderLabel");
    UILabel *placeholderLabel = object_getIvar(textField, ivar);
    placeholderLabel.textColor = [UIColor whiteColor];
    

    iOS 13 通过 KVC 方式修改私有属性,有 Crash 风险,谨慎使用!并不是所有KVC都会Crash,要尝试!

    MPMoviePlayerController 在iOS 13已经不能用了

    'MPMoviePlayerController is no longer available. Use AVPlayerViewController in AVKit.' 
    

    解决方案:

    既然不能再用了,那只能换掉了。替代方案就是AVKit里面的那套播放器。

    iOS 13 DeviceToken有变化

    NSString *dt = [deviceToken description];
    dt = [dt stringByReplacingOccurrencesOfString: @"<" withString: @""];
    dt = [dt stringByReplacingOccurrencesOfString: @">" withString: @""];
    dt = [dt stringByReplacingOccurrencesOfString: @" " withString: @""];
    这段代码运行在 iOS 13 上已经无法获取到准确的DeviceToken字符串了,iOS 13 通过[deviceToken description]获取到的内容已经变了。
    

    解决方案

    方案A:
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        if (![deviceToken isKindOfClass:[NSData class]]) return;
        const unsigned *tokenBytes = [deviceToken bytes];
        NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                              ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                              ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                              ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
        NSLog(@"deviceToken:%@",hexToken);
    }
     
    方案B:
     
    NSMutableString *deviceTokenString = [NSMutableString string];
    const char *bytes = deviceToken.bytes;
    NSInteger count = deviceToken.length;
    for (int i = 0; i < count; i++) {
        [deviceTokenString appendFormat:@"%02x", bytes[i]&0x000000FF];
    }
     
    

    UITableViewCell的UITableViewCellAccessoryDisclosureIndicator显示不正常

    解决方案:
    cell.accessoryView = [[UIImageView alloc] initWithImage:...];
    使用图片来显示。
    

    Sign in with Apple -提供第三方登录的注意啦

    如果你的应用使用了第三方登录,那么你可能也需要加下 「Sign in with Apple」
    Sign In with Apple will be available for beta testing this summer. It will be required as an option for users in apps that support third-party sign-in when it is commercially available later this year.
    

    解决方案
    附上官方Demo:点我下载

    控制器的 modalPresentationStyle 默认值变了

    查阅了下 UIModalPresentationStyle枚举定义,赫然发现iOS 13新加了一个枚举值:
    typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
        UIModalPresentationFullScreen = 0,
        UIModalPresentationPageSheet API_AVAILABLE(ios(3.2)) API_UNAVAILABLE(tvos),
        UIModalPresentationFormSheet API_AVAILABLE(ios(3.2)) API_UNAVAILABLE(tvos),
        UIModalPresentationCurrentContext API_AVAILABLE(ios(3.2)),
        UIModalPresentationCustom API_AVAILABLE(ios(7.0)),
        UIModalPresentationOverFullScreen API_AVAILABLE(ios(8.0)),
        UIModalPresentationOverCurrentContext API_AVAILABLE(ios(8.0)),
        UIModalPresentationPopover API_AVAILABLE(ios(8.0)) API_UNAVAILABLE(tvos),
        UIModalPresentationBlurOverFullScreen API_AVAILABLE(tvos(11.0)) API_UNAVAILABLE(ios) API_UNAVAILABLE(watchos),
        UIModalPresentationNone API_AVAILABLE(ios(7.0)) = -1,
        UIModalPresentationAutomatic API_AVAILABLE(ios(13.0)) = -2,
    };
    

    解决方法

    方案A:
    如果你完全接受苹果的这个默认效果,那就不需要去修改任何代码。
    如果,你原来就比较细心,已经设置了modalPresentationStyle的值,那你也不会有这个影响。
    对于想要找回原来默认交互的同学,直接设置如下即可:
     
    self.modalPresentationStyle = UIModalPresentationOverFullScreen;
     
     
    方案B:
    如果要一次全局更改的话,设置UIViewController Catagory即可以解决:
     
    @implementation UIViewController(modalPresentationStyle)
     
    - (UIModalPresentationStyle)modalPresentationStyle{
        if (@available(iOS 13.0, *)) {
            if ([self isKindOfClass:[UIActivityViewController class]]) {
                return UIModalPresentationPageSheet;
            }else{
                return UIModalPresentationFullScreen;
            }
        }
        return UIModalPresentationPopover;
    }
    

    即将废弃的 LaunchImage

    从 iOS 8 的时候,苹果就引入了 LaunchScreen,我们可以设置 LaunchScreen来作为启动页。当然,现在你还可以使用LaunchImage来设置启动图。不过使用LaunchImage的话,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,随着苹果设备尺寸越来越多,这种方式显然不够 Flexible。而使用 LaunchScreen的话,情况会变的很简单, LaunchScreen是支持AutoLayout+SizeClass的,所以适配各种屏幕都不在话下。
    

    注意啦⚠️,从2020年4月开始,所有使⽤ iOS13 SDK的 App将必须提供 LaunchScreen,LaunchImage即将退出历史舞台*。

    UISearchBar显示问题

    SearchBar的高度只有1px

    1. 升级到iOS13,UISearchController上的SearchBar显示异常,查看后发现对应的高度只有1px,目前没找到具体导致的原因,
    2. 解决办法是: 使用KVO监听frame值变化后设置去应该显示的高度

    黑线处理crash

    1. 之前为了处理搜索框的黑线问题会遍历后删除UISearchBarBackground,在iOS13会导致UI渲染失败crash;
    2. 解决办法是: 设置UISearchBarBackground的layer.contents为nil

    TabBar红点偏移

    1. 如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在最左边去了。遍历UITabBarButton的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,
    2. 解决办法是: 修改为通过UITabBarButton的位置来设置红点的frame

    参考文章

    iOS13适配宝典

    展开全文
  • 展示图片组常用UIScrollView来分页显示,并且由UIPageControl页面控制控制显示当前页。UIScrollView和UIPageControl搭配会更加完美地展现引导页的功能作用。下面我们来看具体的实例: 我们用NSUserDefaults类来...
  • 苹果IOS启动器

    2014-03-30 10:06:45
    非常好,受到很多人的喜欢,我们的主题是非常垃圾的
  • ”——凯文·凯利iOSApp有时可能遇到启动必crash的绝境:每次打开App都闪退,无法正常使用App。为了尝试解决这个问题,微信读书开发了iOS连续闪退保护工具:GYBootingProtection,检测连续闪退,在连续闪退出现时,...
  • iOS开发学习路线

    千次阅读 2018-04-23 09:37:26
    初级iOS开发iOS中级开发说白了,就是你学会了基本的UI界面搭建,上架,沉淀一段时间,你觉得自己还适合这门行业,还适合,还能接受 这个所谓的iOS开发工程师的行业.你就可以说是一名中级iOS开发. 这个沉淀时间 大约在1年...

    初级iOS开发

    iOS中级开发说白了,就是你学会了基本的UI界面搭建,上架,沉淀一段时间,你觉得自己还适合这门行业,还适合,还能接受 这个所谓的iOS开发工程师的行业.你就可以说是一名中级iOS开发.
    这个沉淀时间 大约在1年的实际工作中,就可以完成.
    如果你觉得这门行业不适合你,请仔细结合自身情况,是否转另一门计算机语言,还是彻底转行.
    是否了解AFNetworking 的实现原理
    是否了解SDAutolayout/Masonry 一种布局库的原理
    是否能够处理基本的iOS崩溃原因/无法编译原因/无法上架原因?
    是否拥有了一定的工作效率,稳定的工作效率.(而不是说,上面派了一个活下来,忙都忙不完,天天加班,还一堆bug)
    是否能够处理第三方库引起的崩溃.
    是否可以很好的融入工作环境,完成每一阶段的工作指标,而不会让自己疲惫不堪.
    Xcode的使用
    第三方库的灵活使用
    AFN
    MJRefresh
    各种网站的使用
    说明:作为一名初级的iOS开发,你需要具备以下技能
    必备技能(全部都会的情况下查看下一项)
    如何判断是否可以升阶
    结论

    中级iOS开发

    如何判断是否可以升阶
    结论
    应用的内存处理
    应用的推送处理
    应用的模块化/单元测试
    应用的第三方集成/集中化管理/稳定迭代
    阅读强大的第三方源码/拥有快速上手新的第三方库的能力.
    能够接受各种新功能的开发(这里是指,即使你没有做过,但是你仍然可以凭借着学习,解决任何业务需求:例如:蓝牙.AR.摄像头.硬件交互.等)
    清楚明白数据的传递方式,应用与后台如何交换数据,交换数据的过程,结果,格式.
    多线程的灵活使用.
    各种并发事件的处理/以及界面的合理性/流畅度
    设计模式的灵活使用.
    说明:作为一名中级的iOS开发,你需要具备以下技能
    必备技能(全部都会的情况下查看下一项)

    高级iOS开发

    应用的组件化/架构分层
    数据结构,操作系统,计算机网络都有自己的了解和认知
    Shell脚本/python/Ruby/JS 至少会一种.
    说明:作为一名高级的iOS开发,你需要具备以下技能(我不是高级开发,所以这里只能给你们提供建议.)
    必备技能

    详细学习路线

    学习路线
    简介
    这里只简单阐述一些概念性的东西,以及学习路线规划,真正的知识请从iOS基础知识点往下开始看.
    Objective-C
    介绍
    概念
    编译原理
    程序启动原理
    结束程序.
    监听系统事件
    Info.plist
    .pch
    App组成
    打开程序
    执行main函数
    执行UIApplicationMain函数
    初始化UIApplication(创建设置代理对象,开启事件循环)
    语法.(此处定义可能略失严谨,口头教学为主)
    基础语法
    对象.
    属性
    数据类型
    方法
    继承
    Frame/CGRect/CGPoint和CGSize
    内存(针对MRC下情况进行介绍)
    ARC/MRC
    弱引用/强引用
    Assign,retain,copy,strong
    import 和@class的区别
    Xcode使用
    首先是针对Xcode菜单栏,希望自己可以去翻译一下每个菜单里每项功能的英文都是什么意思,有助于自己熟悉并加深印象的使用Xcode.
    熟悉Xcode的各个功能.
    UIKit控件.
    界面分析(下载App进行学习).
    界面适配
    在这里推荐有兴趣的开发人员,下载并分析,AppStore中的每项分类的top50的应用,多学习大公司以及流行应用是如何开发应用的,其中流行的,新颖的开发界面的方式可以总结下来,猜想在大应用中,别的程序员是如何开发的.
    代码架构.
    代码架构文章推荐:https://casatwy.com/iosying-yong-jia-gou-tan-kai-pian.html
    各种工具、第三方的使用.
    其实每个项目的建立都大致分为:项目框架搭建,原生界面搭建,嵌入第三方库.有很多功能都会用到第三方库,大多数第三方库都是本着快速开发,完整功能实现的目的存在的.需要开发人员能够根据业务逻辑不同,选择最好最优质的第三方库进行使用.
    代码封装
    当使用较多第三方库后,要求开发人员学习其开发特点,以及其封装手法,运用在自己的项目上,封装自己的代码.灵活运用.
    完整项目.
    开发技巧
    个人心得

    iOS基础知识点

    iOS基础知识点
    如何学习iOS
    开始涉猎不止于iOS领域中的知识,会去了解相关职位的基础知识,例如前端和后台或者服务器运维,或者项目相关知识,具体往自己的职业规划靠拢
    多看开源或者注明的第三方库.
    收藏并阅读各种大神的博客或者论坛.
    开始考虑项目中的细节优化,内存处理和耗电情况
    打好基础,学习OC中各种常用语法.
    学习如何上架,上架会因为什么被拒,了解App上架规则.
    多学习官方说明文档.
    刚刚入门(如何学习)
    刚刚入职1年(如何稳定)
    入职3年(如何进阶)
    框架的学习
    AFNetworking
    SDAutoLayout
    YYKit
    SDWebImage
    MJRefresh
    MJExtension
    Bugly
    Qiniu
    Masonry
    TZImagePickerController
    Hyphenate_CN
    第三方框架
    苹果自带框架
    基础UI控件
    UILabel 标题栏
    UIButton 按钮
    UIImageView 图片视图
    UITextField 文本输入框
    UITextView 文本展示视图
    UIProgressView 进度条
    UISlider 滑动开关
    UIGesture 手势
    UIActivityIndicator 菊花控件
    UIAlertView(iOS8废除) 警告框
    UIActionSheet(iOS8废除) 操作表单
    UIAlertController(iOS8出现) 警告视图控制器
    UIScrollView 滚动视图
    UIPageControl 页面控制器
    UISearchBar 搜索框
    UITableView 表视图
    UICollectionView集合视图
    UIWebView网页浏览器
    UISwitch开关
    UISegmentControl选择按钮
    UIPickerView选择器
    UIDatePicker日期选择器
    UIToolbar工具栏
    UINavigationBar通知栏
    UINavigationController通知视图控制器
    UITabbarController选择视图控制器
    UIImagePickerController相册
    UIImage图片
    Xcode的使用
    内存监测
    全局断点
    全局搜索替换
    界面适配
    StoryBoard
    界面预览
    基础操作 状态栏
    偏好设置
    Xcode Source Control 源代码管理器
    Xcode workSpace工作组
    Xcode Scheme 计划
    Xcode AutoLayout 约束
    Xcode CoreData数据库
    LLDB 断点调试
    数据存储
    沙盒存储
    NSDictionary归档
    NSUserDefault
    CoreData
    NSKeyedArchiver
    SQLite
    FMDB
    plist
    App生命周期
    alloc
    init
    创建View
    ViewDidLoad
    ViewWillAppear
    ViewDidAppear
    ViewWillDisappear
    ViewDidDisappear
    视图将要消失 (做一些视图将要消失时的UI的处理)
    视图已经消失 (做一些视图消失之后数据的处理)
    viewDidDisappear销毁定时器
    dealloc
    didReceiveMemoryWarning
    控制器生命周期
    应用生命周期
    开发者账号&上架流程
    个人
    公司
    企业
    https://www.jianshu.com/p/6601a241da8e
    https://www.jianshu.com/p/7c98651d3532
    https://www.jianshu.com/p/9b994a019ee6
    文章推荐:
    常用知识
    响应链
    异常捕捉
    国际化
    代码模块化
    类别/扩展
    iPad与iPhone的区别
    静态库
    内存管理
    Quartz2D
    真机调试
    isKindOfClass 与 isMemberOfClass
    Return/Break/Continue
    Core Animation
    CALayer
    AutoLayout
    KVC/KVO
    谓词NSPredicate
    帧动画
    界面旋转+状态栏隐藏
    plist文件
    通信
    NS系列
    宏定义
    视图层次
    切换视图
    深浅拷贝
    对象序列化
    写入文件
    获取沙盒路径
    翻转视图
    延伸视图
    九大基本数据类型
    九宫格
    坐标比较
    UIColor 、CIColor和CGColor 之间的关系
    画图
    静态变量
    tag值
    延时执行方法

    中级知识点

    设计模式
    UIScrollView/UITableView/UICollectionView 的嵌套
    动态行高
    通知/代理/block
    程序启动原理
    触摸事件/手势
    图文混编
    Runtime
    NSRunLoop
    GCD
    ReactiveCocoa开发
    3DTouch
    界面渲染
    Charles花瓶抓包
    区分模拟器/真机项目
    常用知识
    Block
    蓝牙/传感器
    物理仿真器UIDynamic
    通讯录获取
    音频/视频/二维码
    真机调试
    苹果内购/广告
    推送/远程推送
    单例模式
    多线程
    网络请求
    定位
    源代码管理Git

    iOS高级知识点

    iOS高级知识点
    Socket
    XMPP
    加密
    MD5详解
    Base64加密解密
    RSA非对称加密
    AES对称加密
    音频
    基础
    Core Audio
    Audio Toolbox
    OpenAL
    AVFoundation
    Speex语音聊天
    AudioQueue/AudioSession
    Speex简介
    视频
    AAC视频.H264推流
    P2P传输
    直播
    RTMP协议
    RTMP直播应用与延时分析
    如果做一款inke版的App
    推流发布和播放RTMP
    FFmpeg
    基于FFmpeg的推流器
    HLS流媒体传输协议(HTTP Live Streaming)
    FFmpeg
    ijkPlayer
    直播的技术分析与实现
    算法
    简介
    冒泡排序
    快速排序
    插入排序
    归并排序
    二分查找
    希尔排序
    动态规划
    堆排序

    官方Kit

    ARKit.
    SiriKit
    HealthKit
    HomeKit
    SearchKit
    IOKit
    PDFKit
    CloudKit
    GameplayKit
    SpriteKit
    SceneKit
    MusicKit
    ResearchKit
    MapKit
    StoreKit
    AVKit

    展开全文
  • 在之前的一片文章中已经介绍了从iOS的第一个应用中能学习到哪些知识点在那篇文章中主要介绍了一个iOS程序的启动过程和应用的几大对象,以及应用的生命周期,同时也介绍了应用中的控制知识点,介绍了其生命周期方法...
  • gg修改器ios版下载

    万次阅读 2019-10-28 19:01:14
    gg修改器ios版下载 推荐一个修改器下载站www.miaozan.art    GameGuardian iOS – 您是否花费数月时间尝试玩游戏的所有阶段?您不想花钱达到最好的阶段吗?然后,游戏改装是您的最佳选择。您可以修改任何游戏以...
  • iOS 13 适配 适配主要涉及的方面: UITextField 的私有属性 _placeholderLabel 被禁止访问了 控制的 modalPresentationStyle 默认值变了 DarkMode 深色模式 MPMoviePlayerController 在iOS ...
  • 思路是自定义一个控制,在viewDidLoad的方法中调用要设置的启动图的方法,方法中主要是创建一个UIImageView,对UIImageView的image进行定义,设置启动停留时间,启动完毕移除该控件并跳转到首页或者登录界面。...
  • iOS图标&启动图生成(一)

    千次阅读 2019-06-27 14:50:16
    一个完整的app都需要多种尺寸的图标和启动图。一般情况下,设计师需要根据开发者提供的一套规则,设计出各种尺寸的图标和启动图供开发人员使用。 但最近作者利用业余时间做了个app,因为不希望耽误设计师较多时间,...
  • iOS 13 适配 (填坑...)

    万次阅读 2019-09-19 15:08:44
    iOS13中通过KVC方式来获取私有属性,有Carsh风险,尽量避免使用.比如我们常用的UITextFiled和UISearchController等,在iOS 13的searchbar添加了一个- (void)set_cancelButtonText:(NSString *)text方法,这个方法专门...
  • iOS 优化App启动速度

    千次阅读 2019-04-16 18:56:41
    对于我们App启动分为 冷启动启动, 区别在于你的App 进程有没有在系统中 然后对于启动我们有三个时刻 main()前 --- main()后 --- 首屏渲染完成 main()前主要可执行文件加载, 动态库链接, Objc 运行时的处理, ...
  • iOS 优化程序冷启动时间

    千次阅读 2018-11-21 19:16:28
    一、何为冷启动 1、冷启动 2、热启动 二、冷启动时间 1、什么是冷启动时间 2、冷启动过程做了什么 三、pre-main()阶段 1、pre-main阶段加载 2、pr-main节点时间测量及其优化 四、main()阶段 1、mai...
  • React本地活动演示 建立状态 ... 从React Native导航到主机应用内部的Java活动(或iOS视图控制); 启动一个外部意图来拨打电话号码,从而从JavaScript传递数据; 查询主机应用程序以获取信息。
  • IOS13适配攻略

    千次阅读 2019-10-24 13:59:53
     在iOS13之前,无需权限提示窗即可直接使用蓝牙,但在iOS 13下,新增了使用蓝牙的权限申请。最近一段时间上传IPA包至App Store会收到以下提示。 解决方案:只需要在  Info.plist  里增加以下条目: <key>...
  • iOS13适配宝典

    千次阅读 2019-09-23 11:31:37
    注意啦⚠️,从2020年4月开始,所有使⽤ iOS13 SDK的 App将必须提供 LaunchScreen,LaunchImage即将退出历史舞台。 适配问题七 UISegmentedControl 在iOS 13中具有新外观,并且用于改变分段控件颜色的现有代码...
  • iOS 13 如期而至,虽然正式版还没出来,但是适配工作可以开展起来啦。在适配 iOS 13 过程中,遇到了如下一些问题。 1. UITextField 的私有属性 _placeholderLabel 被禁止访问了 遇到的第一个崩溃是修改UITextField...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,627
精华内容 25,450
关键字:

启动器ios13