有没有办法阻止第三方打开网址?

时间:2018-03-01 01:28:22

标签: ios

我们的iOS应用包括第三方框架的多种形式的广告,运行远程抓取的网络广告素材。我们一直在寻找和处理用户被扔出我们的应用程序(到Safari)而没有任何交互的实例。有时这是恶意的,有时候只是偶然的。

在任何情况下,有没有人知道我们可以在iOS上使用的任何机制,使得无法在我们的应用程序中打开URL(我们可以自行决定)?

理想情况下,Apple提供UIApplicationDelegate-(BOOL)shouldOpenURLInSafari:...方法是最好的。

1 个答案:

答案 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
    }
}