我们的iOS应用包括第三方框架的多种形式的广告,运行远程抓取的网络广告素材。我们一直在寻找和处理用户被扔出我们的应用程序(到Safari)而没有任何交互的实例。有时这是恶意的,有时候只是偶然的。
在任何情况下,有没有人知道我们可以在iOS上使用的任何机制,使得无法在我们的应用程序中打开URL(我们可以自行决定)?
理想情况下,Apple提供UIApplicationDelegate
等-(BOOL)shouldOpenURLInSafari:...
方法是最好的。
答案 0 :(得分:0)
对于使用某个网址启动Safari的应用,代码必须调用openURL
的{{1}}方法。
您可以通过继承UIApplication
并覆盖新旧UIApplication
方法(iOS 10+和iOS 10之前的版本)来阻止此类调用。如果您的应用不需要打开任何网址,或者您可以检查网址并且只允许您知道应用应该制作的网址,那么您对这些已覆盖方法的实施就无能为力。
诀窍是安装自定义openURL
类。
在Objective-C中,您需要通过将自定义类传递给调用UIApplication
的第三个参数来更新main.m.默认情况下,此参数为UIApplicationMain
。
更新了main.m:
nil
自定义#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
在Swift中,您需要在AppDelegate.swift中删除#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
的使用,添加main.swift,并向该文件添加对@UIApplicationMain
的调用。
以下是自定义UIApplicationMain
示例:
UIApplication
这是一个示例main.swift(由https://stackoverflow.com/a/24021180/1226963提供):
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
}
}