【问题标题】:Alternate Icon - Disable alert on icon change (UPDATE)备用图标 - 禁用图标更改警报(更新)
【发布时间】:2018-07-07 05:50:00
【问题描述】:

这是对这个过时问题的更新:Alternate Icon in iOS 10.3: avoid notification dialog for icon change


func setAppIcon(Type: String) {
    if #available(iOS 10.3, *) {
       UIApplication.shared.setAlternateIconName(Type)
    }
}

通过上面的几行可以动态更改 Appicon,该功能是在 iOS 10.3 中添加的。

上面的代码运行良好,但每次 应用程序图标 更改 iOS 都会触发如下警报:

那么有没有办法摆脱这个警报? (我知道苹果可能会拒绝禁用用户信息的申请,但我想将其仅用于测试目的)

任何帮助将不胜感激,谢谢! :-)

【问题讨论】:

    标签: ios swift web-applications appicon


    【解决方案1】:

    试试下面的代码,不过,它是用 Objective-c 写的。它使用了私有方法,我想你不会介意的。

    - (void)lc_setAlternateIconName:(NSString*)iconName
    {
        //anti apple private method call analyse
        if ([[UIApplication sharedApplication] respondsToSelector:@selector(supportsAlternateIcons)] && 
            [[UIApplication sharedApplication] supportsAlternateIcons])
        {
            NSMutableString *selectorString = [[NSMutableString alloc] initWithCapacity:40];
            [selectorString appendString:@"_setAlternate"];
            [selectorString appendString:@"IconName:"];
            [selectorString appendString:@"completionHandler:"];
    
            SEL selector = NSSelectorFromString(selectorString);
            IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
            void (*func)(id, SEL, id, id) = (void *)imp;
            if (func)
            {
                func([UIApplication sharedApplication], selector, iconName, ^(NSError * _Nullable error) {});
            }
        }
    }
    

    【讨论】:

    • 太棒了.. 他们会拒绝这个应用吗?
    • 我的应用没有被拒绝,你可以试试。变量selectorString是反代码静态分析。
    • 如何将void (*func)(id, SEL, id, id) = (void *)imp; if (func) { func([UIApplication sharedApplication], selector, iconName, ^(NSError * _Nullable error) {}); } 转换为swift?
    • 解决方案对我来说效果很好,不能太快地转换最后的位。但使用了一个很好的老式桥文件并且工作正常
    • 这里是我的 swift 版本。问题是,警报仍然显示:/ 也许我犯了一个错误,有人有更好的主意:let selector = #selector(UIApplication.shared.setAlternateIconName) let imp = UIApplication.shared.method(for: selector) typealias ClosureType = @convention(c) (AnyObject, Selector, String?, ((Error?) -> Void)? ) -> Void let curry : ClosureType = unsafeBitCast(imp, to: ClosureType.self) curry(UIApplication.shared, selector, iconName, nil)
    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多