我们的iOS应用程序包括第三方框架的多种形式的广告,运行远程获取的网络广告素材。我们一直在寻找和处理用户被扔出我们的应用程序(到Safari)而没有任何交互的实例。有时这是恶意的,有时候只是偶然的。
在任何情况下,有没有人知道我们可以在iOS上使用的任何机制,使URL无法在我们的应用程序中打开(没有我们的判断)?
理想情况下,Apple提供一些像UIApplicationDelegate
这样的-(BOOL)shouldOpenURLInSafari:...
方法是最好的。
对于使用某个URL启动Safari的应用程序,代码必须调用openURL
的UIApplication
方法。
您可以通过继承UIApplication
并覆盖旧的和新的openURL
方法(iOS 10+和iOS 10之前的版本)来阻止此类调用。如果您的应用无需打开任何网址,或者您可以检查网址,并且仅允许您知道应用应该制作的网址,那么您对这些已覆盖方法的实施就无法执行任何操作。
诀窍是安装自定义UIApplication
类。
在Objective-C中,您需要通过将自定义类传递给调用UIApplicationMain
的第三个参数来更新main.m.默认情况下,此参数将为nil
。
更新了main.m:
#import <UIKit/UIKit.h>
#import "MyApplication.h"
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv,
NSStringFromClass([MyApplication class]),
NSStringFromClass([AppDelegate class]));
}
}
自定义UIApplication
:
#import "MyApplication.h"
@implementation MyApplication
- (void)openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options completionHandler:(void (^)(BOOL))completion {
// optionally allow some URLs as needed
NSLog(@"block %@", url);
if (completion) {
completion(YES);
}
}
- (BOOL)openURL:(NSURL *)url {
// optionally allow some URLs as needed
NSLog(@"block %@", url);
return YES;
}
@end
在Swift中,您需要在AppDelegate.swift中删除@UIApplicationMain
的使用,添加main.swift,并向该文件添加对UIApplicationMain
的调用。
以下是自定义UIApplication
的示例:
import UIKit
class MyApplication: UIApplication {
override func open(_ url: URL, options: [String : Any] = [:], completionHandler completion: ((Bool) -> Void)? = nil) {
// optionally allow some URLs as needed
print("block \(url)")
completion?(true)
}
override func openURL(_ url: URL) -> Bool {
// optionally allow some URLs as needed
print("block \(url)")
return true
}
}
这是一个示例main.swift(由https://stackoverflow.com/a/24021180/1226963提供):
import Foundation
import UIKit
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(MyApplication.self),
NSStringFromClass(AppDelegate.self)
)