程序化更改应用图标

4

我在iTunes上看到了这个应用程序,它可以在iPhone上创建自定义图标。在我的应用程序中,我也想更改图标,具体来说,我想做的是在我的图标中有一个标签,我想通过编程方式更改标签的值。


这是不可行的。 - Saurabh Passolia
@samfisher 请看一下我的回答。他们基本上是在欺骗用户,让他们认为他们点击了一个应用程序图标,而实际上他们只是点击了一个网页视图主屏幕快捷方式。 - Enrico Susatyo
1
是的,我知道,上面提到的应用程序只是玩了个把戏。我的评论是指关于通过Objective-C代码实际的技术实现。 - Saurabh Passolia
可能是Can I change app icon programmatically的重复问题。 - ymutlu
这个回答解决了你的问题吗?iOS 10.3中的备用图标 - undefined
4个回答

1

从iOS 10.3开始,可以更改应用程序图标。

Swift 3:

if UIApplication.shared.supportsAlternateIcons{
        UIApplication.shared.setAlternateIconName("icon2", completionHandler: { (error) in
            print(error ?? "")
        })
}

Objective C:

[[UIApplication sharedApplication] setAlternateIconName:@"icon2" completionHandler:^(NSError * _Nullable error) {
        //NSLog(@"Error...");
}];

在info.plist中将supportsAlternateIcon设置为Yes。应该在应用程序的Info.plist文件的CFBundleIcons键中添加主要和次要图标。
//Info.plist
<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>Icon1</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>icon1</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>Icon2</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>icon2</string>
            </array>
        </dict>
    </dict>
</dict>

参考资料:


1
应用程序的视频教程中可以看出,他们所做的只是创建了一个带有自定义图标的网页,并且用户可以点击“添加到主屏幕”将自定义网页添加到主屏幕。这应该足以让你开始了。

我该如何在我的应用程序中更改应用图标上的标签? - S S
图标是白色的,上面有一个文本用于显示某个值,我想通过编程来更改该文本。 - S S

0

只是我的个人看法。

直接添加到plist文件中也没有问题,但是在Xcode中可视化查看时会得到一个“奇怪”的值(IOS5 ...):

enter image description here

2) 在模拟器上(Xcode 10 beta...),在运行时调试控制台中,您将看到:

MobileGestalt.c:890: MGIsDeviceOneOfType在此平台上不受支持。

但是它可以正常工作

3) 不要直接在AppDelegate中调用。如果需要,请以分派方式调用:

    final func changeIcon(){

        let name = "Icon1"
        let icon = UIImage(named:  name)
        if UIApplication.shared.supportsAlternateIcons{
            UIApplication.shared.setAlternateIconName(name, completionHandler: { (error) in

                print(error ?? "ok")
            })
        }
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        let when = DispatchTime.now() + 1
        DispatchQueue.main.asyncAfter(deadline: when) {
            self.changeIcon()
        }

        return true
    }
.....

4) 注意:图标名称是您在上一级键中放置的符号名称,例如:

<key>CFBundleIcons</key>
<dict>
    <key>CFBundleAlternateIcons</key>
    <dict>
        <key>Icon1</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>logo2_120x120</string>
            </array>
            <key>UIPrerenderedIcon</key>
            <false/>
        </dict>
        <key>Icon2</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>logo3_120x120</string>
            </array>
        </dict>
    </dict>
</dict>

不要在plist中添加@2x或类似的内容。


0

这是不可能的。除非您的应用程序属于新闻杂志类别。对于新闻杂志应用程序,请使用代码更改图标。

UIApplication *app = [UIApplication sharedApplication];
[app setNewsstandIconImage:newsstandImage];

注意:@Enrico建议的是另一种解决方案。您的应用程序图标仍将出现在主屏幕上,会创建一个重复的图标。这不是大多数用户喜欢的。


我的应用程序不属于新闻类别。 - S S
每天我想要改变图标上的文字,例如每天更换。 - S S
@SeemaSharma 这是不可能的。 - KingofBliss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接