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

问题描述 投票:1回答:1

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

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

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

ios
1个回答
0
投票

对于使用某个URL启动Safari的应用程序,代码必须调用openURLUIApplication方法。

您可以通过继承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)
)
© www.soinside.com 2019 - 2024. All rights reserved.