{"id":29799726,"url":"https://github.com/xiaohange/jqchangeappicon","last_synced_at":"2025-10-11T11:32:13.292Z","repository":{"id":295260756,"uuid":"86678613","full_name":"xiaohange/JQChangeAppIcon","owner":"xiaohange","description":" iOS中 iOS10.3如何更换 app 图标 韩俊强的博客 ：http://blog.csdn.net/qq_31810357/article/details/68489138","archived":false,"fork":false,"pushed_at":"2017-05-12T03:10:10.000Z","size":511,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-24T15:03:26.536Z","etag":null,"topics":["alternate","alternateappicon","alternateiconname","appicon","ios","ios10","objc","objcective-c","swift"],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xiaohange.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-03-30T08:31:26.000Z","updated_at":"2021-06-02T16:15:42.000Z","dependencies_parsed_at":"2025-05-24T15:03:31.607Z","dependency_job_id":"f7dd8710-6de3-4b19-8bec-2585ac4f57df","html_url":"https://github.com/xiaohange/JQChangeAppIcon","commit_stats":null,"previous_names":["xiaohange/jqchangeappicon"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xiaohange/JQChangeAppIcon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaohange%2FJQChangeAppIcon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaohange%2FJQChangeAppIcon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaohange%2FJQChangeAppIcon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaohange%2FJQChangeAppIcon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xiaohange","download_url":"https://codeload.github.com/xiaohange/JQChangeAppIcon/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xiaohange%2FJQChangeAppIcon/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267482004,"owners_count":24094508,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alternate","alternateappicon","alternateiconname","appicon","ios","ios10","objc","objcective-c","swift"],"created_at":"2025-07-28T08:10:31.173Z","updated_at":"2025-10-11T11:32:08.244Z","avatar_url":"https://github.com/xiaohange.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JQChangeAppIcon\n[ iOS中 iOS10.3如何更换 app 图标 (教程)](http://blog.csdn.net/qq_31810357/article/details/68489138\n)\n\n### iOS中 iOS10.3如何更换 app 图标  利用runtime后台切换icon\n#### 效果如下：\n![](http://img.blog.csdn.net/20170330162610437)\n\n#### info.plist 如何填写呢？一时可能搞不清楚如何操作，下面做个实例:\n```\n\u003ckey\u003eCFBundleIcons\u003c/key\u003e\n    \u003cdict\u003e\n        \u003ckey\u003eCFBundleAlternateIcons\u003c/key\u003e\n        \u003cdict\u003e\n            \u003ckey\u003enewIcon\u003c/key\u003e\n            \u003cdict\u003e\n                \u003ckey\u003eCFBundleIconFiles\u003c/key\u003e\n                \u003carray\u003e\n                    \u003cstring\u003enewIcon\u003c/string\u003e\n                \u003c/array\u003e\n                \u003ckey\u003eUIPrerenderedIcon\u003c/key\u003e\n                \u003cfalse/\u003e\n            \u003c/dict\u003e\n        \u003c/dict\u003e\n        \u003ckey\u003eCFBundlePrimaryIcon\u003c/key\u003e\n        \u003cdict\u003e\n            \u003ckey\u003eCFBundleIconFiles\u003c/key\u003e\n            \u003carray\u003e\n                \u003cstring\u003eIcon60X60\u003c/string\u003e\n            \u003c/array\u003e\n        \u003c/dict\u003e\n    \u003c/dict\u003e \n```\n\n#### 替换图标部分的代码：\n```\n- (void)changeAppIcon\n{\n    if ([UIApplication sharedApplication].supportsAlternateIcons) {\n        NSLog(@\"you can change this app's icon\");\n    }else{\n        NSLog(@\"you can not change this app's icon\");\n        return;\n    }\n    \n    NSString *iconName = [[UIApplication sharedApplication] alternateIconName];\n    \n    if (iconName) {\n        // change to primary icon\n        [[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {\n            if (error) {\n                NSLog(@\"set icon error: %@\",error);\n            }\n            NSLog(@\"The alternate icon's name is %@\",iconName);\n        }];\n    }else{\n        // change to alterante icon\n        [[UIApplication sharedApplication] setAlternateIconName:@\"newIcon\" completionHandler:^(NSError * _Nullable error) {\n            if (error) {\n                NSLog(@\"set icon error: %@\",error);\n            }\n            NSLog(@\"The alternate icon's name is %@\",iconName);\n        }];\n    }\n}\n```\n### 遇到一个问题：必须弹框吗？\n#### A：NO！\n#### 优化：利用runtime后台切换icon\n```\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    // Do any additional setup after loading the view, typically from a nib.\n    [self runtimeReplaceAlert];\n}\n\n// 利用runtime来替换展现弹出框的方法\n- (void)runtimeReplaceAlert\n{\n    static dispatch_once_t onceToken;\n    dispatch_once(\u0026onceToken, ^{\n        Method presentM = class_getInstanceMethod(self.class, @selector(presentViewController:animated:completion:));\n        Method presentSwizzlingM = class_getInstanceMethod(self.class, @selector(ox_presentViewController:animated:completion:));\n        // 交换方法实现\n        method_exchangeImplementations(presentM, presentSwizzlingM);\n    });\n}\n\n// 自己的替换展示弹出框的方法\n- (void)ox_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {\n    \n    if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {\n        NSLog(@\"title : %@\",((UIAlertController *)viewControllerToPresent).title);\n        NSLog(@\"message : %@\",((UIAlertController *)viewControllerToPresent).message);\n        \n        // 换图标时的提示框的title和message都是nil，由此可特殊处理\n        UIAlertController *alertController = (UIAlertController *)viewControllerToPresent;\n        if (alertController.title == nil \u0026\u0026 alertController.message == nil) { // 是换图标的提示\n            return;\n        } else {// 其他提示还是正常处理\n            [self ox_presentViewController:viewControllerToPresent animated:flag completion:completion];\n            return;\n        }\n    }\n    \n    [self ox_presentViewController:viewControllerToPresent animated:flag completion:completion];\n}\n\n```\n### 优化后的效果如下：\n![](https://github.com/xiaohange/JQChangeAppIcon/blob/master/demo.gif?raw=true)\n\n## Other\n[JQTumblrHud-高仿Tumblr App 加载指示器hud](https://github.com/xiaohange/JQTumblrHud)\n\n[JQScrollNumberLabel：仿tumblr热度滚动数字条数](https://github.com/xiaohange/JQScrollNumberLabel)\n\n[TumblrLikeAnimView-仿Tumblr点赞动画效果](https://github.com/xiaohange/TumblrLikeAnimView)\n\n[JQMenuPopView-仿Tumblr弹出视图发音频、视频、图片、文字的视图](https://github.com/xiaohange/JQMenuPopView)\n\n## Star\n\u003eiOS开发者交流群：446310206 喜欢就❤️❤️❤️star一下吧！你的支持是我更新的动力！ Love is every every every star! Your support is my renewed motivation!\n\n## License\n\nThis code is distributed under the terms and conditions of the [MIT license](LICENSE). \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaohange%2Fjqchangeappicon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxiaohange%2Fjqchangeappicon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxiaohange%2Fjqchangeappicon/lists"}