Apple wprowadziła metodę openURL:
jako sposób na otwieranie linków zewnętrznych z iOS 2. powiązanej funkcji canOpenURL:
dostał trochę prywatności kontroluje w systemie iOS 9, aby uniemożliwić wyszukiwanie urządzeń do zainstalowanych aplikacji. Teraz w systemie iOS 10 firma Apple wycofała zwykłe stare openURL
dla openURL:options:completionHandler:
.
Oto moja szybkie przypomnienie tego, co trzeba wiedzieć, aby otworzyć odnośnik zewnętrzny z iOS 10.
obecnie przestarzała metoda ma jeden parametr URL, aby otworzyć i zwraca wartość logiczną, aby zgłosić sukces lub niepowodzenie :
// Objective-C
- (BOOL)openURL:(NSURL*)url
// Swift
open func canOpenURL(_ url: URL) -> Bool
nowa metoda w iOS 10:
// Objective-C
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options
completionHandler:(void (^ __nullable)(BOOL success))completion
// Swift
open func open(_ url: URL, options: [String : Any] = [:],
completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)
Istnieją obecnie trzy parametry:
- URL, aby otworzyć
- słownika opcje (patrz poniżej ważnych Wpisy). Użyj pustego słownika dla tego samego zachowania, co
openURL:
.
- Program obsługi zakończenia wywoływany w głównej kolejce z wynikiem . Nullable, jeśli nie jesteś zainteresowany statusem.
Otwieranie adresu URL z iOS 10
Co to znaczy jeśli masz tylko 10 iOS app, nie dbają o możliwości i stanu zaawansowania i po prostu chcą zatrzymać Xcode narzekania:
// Objective-C
UIApplication *application = [UIApplication sharedApplication];
[application openURL:URL options:@{} completionHandler:nil];
// Swift
UIApplication.shared.open(url, options: [:], completionHandler: nil)
W praktyce, o ile nadal obsługuje się system iOS 9 lub wcześniejszy, należy cofnąć się do zwykłej starej metody openURL
.Spójrzmy na przykład gdzie to zrobić, a także korzystać z obsługi ukończenia aby sprawdzić stan otwarty:
Pierwszy z Objective-C:
- (void)openScheme:(NSString *)scheme {
UIApplication *application = [UIApplication sharedApplication];
NSURL *URL = [NSURL URLWithString:scheme];
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
[application openURL:URL options:@{}
completionHandler:^(BOOL success) {
NSLog(@"Open %@: %d",scheme,success);
}];
} else {
BOOL success = [application openURL:URL];
NSLog(@"Open %@: %d",scheme,success);
}
}
// Typical usage
[self openScheme:@"tweetbot://timeline"];
ja przechodząc pustego słownika dla opcji i I nie rób nic użytecznego w obsłudze zakończeń, poza rejestrowaniem sukcesu. Swift wersja:
func open(scheme: String) {
if let url = URL(string: scheme) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
print("Open \(scheme): \(success)")
})
} else {
let success = UIApplication.shared.openURL(url)
print("Open \(scheme): \(success)")
}
}
}
// Typical usage
open(scheme: "tweetbot://timeline")
Opcje
Plik nagłówka UIApplication
wymienia jeden klucz do słownika opcje:
UIApplicationOpenURLOptionUniversalLinksOnly
: Użyj wartość logiczną ustawioną na true (TAK), aby tylko otwarte adres URL, jeśli jest to prawidłowy link uniwersalny z aplikacją skonfigurowaną do jego otwarcia. Jeśli nie skonfigurowano żadnej aplikacji lub użytkownik wyłączył tę funkcję, aby otworzyć łącze, procedura obsługi zakończenia jest wywoływana z wartością false (NO).
Aby zastąpić domyślne zachowanie utworzyć słownik z kluczem ustawiona na true (YES) i przekazać go jako parametr opcji:
// Objective-C
NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES};
[application openURL:URL options:options completionHandler:nil];
// Swift
let options = [UIApplicationOpenURLOptionUniversalLinksOnly : true]
UIApplication.shared.open(url, options: options, completionHandler: nil)
Tak na przykład, jeśli ustawisz na true i spróbować otwórz adres URL: https://twitter.com/kharrison nie powiedzie się, jeśli nie zainstaluję aplikacji Twitter, zamiast otwierać łącze w Safari.
Referencje: openURL: deprecated in iOS 10
Słownik opcji została opisana w obu odpowiedzi [tutaj] (http : //stackoverflow.com/questions/38964264/openurl-in-ios10). –
BTW - Jeśli Twoja aplikacja nadal obsługuje system iOS 9 lub starszy, po prostu nadal używaj starego 'openURL'. Powinieneś przenieść się do nowego tylko wtedy, gdy twoim celem wdrożenia jest iOS 10. – rmaddy
oczywiście w UIKit.framework jest to skomentowane! – Joannes