动态 iOS 启动广告图

作者: kuai空调 | 来源:发表于2016-08-15 14:49 被阅读3900次

按照苹果的官方的建议,启动图最好是不填充数据的app首页的截图,这样可以让用户感觉应用的响应速度很快,但是这个建议现在已经很少有app执行了,我本人更推崇苹果官方的做法,但是无奈项目要求,所以……

废话不多说。一下内容都是我的实现,仅供参考

首先制作一个在线配置文件,我是将自己需要的参数写成json文件放在服务器上。请求这个配置文件和请求接口一样。

文件内容如下

{
  "errno" : 0,
  "result" : {
    "launch_image" : {
        "show" : 1, 
        "micro" : "http://test.test/1.jpg",
        "small" : "http://test.test/2.jpg",
        "middle" : "http://test.test/3.jpg",
        "big" : "http://test.test/4.jpg"
      }
  }
}

简单解释一下,show在本地解析为BOOL值,1代表有动态启动图要显示;micro、small、middle、big分别对应3.5寸、4寸、4.7寸和5.5寸的设备所需的图片的地址。

确保这个文件能被你请求到并正确解析,接下来先考虑显示启动图的逻辑。

先上代码:

    //取到已经下载好的启动图片的路径
    NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
    NSString *fileName = [path stringByAppendingPathComponent:[[NSUserDefaults standardUserDefaults] valueForKey:@"launchImage"]];
    //将图片文件初始化
    UIImage *img = [UIImage imageWithContentsOfFile:fileName];
    //如果有图片存在
    if (img) {
        //初始化一个imageView,并添加到window上
        UIImageView *imgView = [[UIImageView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.bounds];
        imgView.image = img;
        [self.window addSubview:imgView];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [imgView removeFromSuperview];
        });
    }

上面的代码应该写在AppDelegate.m的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中,每次app启动的时候都会去缓存文件中找文件名是预先存在NSUserDefaults中的key为launchImage的值的文件,如果找到了就将imageView添加到window上面,过三秒再移除。

第二部分是更新下载启动图的逻辑,这部分代码最好写在app每次启动必经的controller里面,比如tabbarController或者rootNavigationController里面,保证每次app启动都能运行这段代码,检查和下载启动图片。

NSInteger screenHeight = [UIScreen mainScreen].bounds.size.height;
CGFloat scale = 0;
NSString *name;
switch (screenHeight) {
      case 480:
      name = info.launch_image.micro;
      scale = 2;
      break;
      case 568:
      name = info.launch_image.small;
      scale = 2;
      break;
      case 667:
      name = info.launch_image.middle;
      scale = 2;
      break;
      case 736:
      name = info.launch_image.big;
      scale = 3;
      break;
}
if (info.launch_image.show) {
    [UIImage downLoadImage:name scale:scale success:^(UIImage *img) {
        NSLog(@"launchImage download Success");
        [[NSUserDefaults standardUserDefaults]setValue:name.lastPathComponent forKey:@"launchImage"];
    }];
}else{
      NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
      NSString *fileName = [path stringByAppendingPathComponent:name.lastPathComponent];
      if ([[NSFileManager defaultManager]fileExistsAtPath:fileName]) {
           NSError *error;
           if ([[NSFileManager defaultManager] removeItemAtPath:fileName error:&error]) {
                NSLog(@"remove file success");
           }else{
                NSLog(@"%@", error);
           }
      }
}

简单说明一下,这段代码里面的info就是之前写好的配置文件,请求成功后对象化的数据。第一部分到switch语句结束都是为了通过当前屏幕的宽度判断需要下载哪一个图片文件。通过配置文件的show字段来判断是否有文件需要下载,有的话就下载下来,并且在NSUserDefaults中设置一个key为launchImage值为所下载文件的文件名的字段。如果show的值是NO的话就找到缓存的文件删除之。

相关文章

网友评论

  • 十一岁的加重:我以为能动态变换启动图片呢
  • Sky521:这不是配置启动图,建议将标题改为 :动态配置 iOS app 的广告图
    kuai空调:@Sky521 有道理,谢谢
  • 拥抱月亮的大星星:还以为是修改启动页那张静态图片。 :pensive:
  • a90a147abe6d:用show来判断 是否下载,不好~
    应该用时间戳来判断,服务器更新图片的话,就更新时间戳。然后本地来判断时间戳是否相等,如果不相等,就下载,否则不下载~
    kuai空调:@摩西摩西和辛巴 你仔细想想其实完全没必要用时间戳,想显示的时候show为1,不想显示的时候show为0就可以了
    2a392233fc62:@摩西摩西和辛巴 我用版本号判断的,json文件添加个字段版本号,判断服务器下发的版本号是不是大于本地的版本号,决定要不要更新图片,后台每次下发新图片就提高版本号。
  • Cyandev:为什么你的打赏留言写得跟我的一样😂
    kuai空调:@Cyandev 一毛钱都没拿到……
    Cyandev:@飞烟灰灭 我还是拿掉吧,指着这个要等到猴年马月,我准备换成赞助我一杯咖啡😂
    kuai空调:@Cyandev 世间还有如此巧合!:joy:
  • 是的蛮大人:这个更准确的来说应该算是闪屏广告
    kuai空调:@是的蛮大人 也可以这么说
  • 李国安:现在基本上大部分公司的广告图都是动态的了吧!
    kuai空调:@CristianoRLong 是的
  • 若非长得丑怎会做逗比:这相当于广告图了
    kuai空调:@若非长得丑怎会做逗比 嗯
  • 红烧大鸡腿:这样会伴随一个问题就是那还都会去加载图片,可是有时候不需要去每次都加载吧😊😊😊
    kuai空调:@HCX_IOS 我自己写的那个下载图片等方法是会检测缓存的:blush:
    红烧大鸡腿: @飞烟灰灭 嗯嗯,我觉得可以加一个字段,如果内容和上次相同就不再下载,直接从本地获取,不同的话就去下载😊😊😊
    kuai空调:这个目前我还不知道能如何改进。不过我的app默认的启动题下面是一个logo,上面7成空间都是空白,而动态加载的图片结构上刚好填充了空白部分,所以看起来还是比较和谐的。不知道你有什么好办法吗
  • 心中的信念:大神,给个源码工程呗
    别闹晓敏:@心中的信念 https://github.com/LJmaster/LJAdvertising 我自己写的本地的,你可以看看,给个✨
    心中的信念:@飞烟灰灭 哦哦好的,谢谢哈
    kuai空调:@心中的信念 因为这个是要跟后端配合的,所以我没法给出一个可以直接运行的demo,看看思路,其实实现起来很简单

本文标题:动态 iOS 启动广告图

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