Prima di fare un openUrl:
per avviare un'app che dovrebbe richiamare la mia app (come un'app che agisce in base alla specifica), come posso controllare a livello di codice che la mia callback dell'applicazione funzioni, prima di chiamare l'altra app?la mia app risponderà a uno schema di URL?
7
A
risposta
12
Questa è la mia soluzione attuale:
- (BOOL) respondsToUrl:url
{
BOOL schemeIsInPlist = NO; // find out if the sceme is in the plist file.
NSBundle* mainBundle = [NSBundle mainBundle];
NSArray* cfBundleURLTypes = [mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"];
if ([cfBundleURLTypes isKindOfClass:[NSArray class]] && [cfBundleURLTypes lastObject]) {
NSDictionary* cfBundleURLTypes0 = [cfBundleURLTypes objectAtIndex:0];
if ([cfBundleURLTypes0 isKindOfClass:[NSDictionary class]]) {
NSArray* cfBundleURLSchemes = [cfBundleURLTypes0 objectForKey:@"CFBundleURLSchemes"];
if ([cfBundleURLSchemes isKindOfClass:[NSArray class]]) {
for (NSString* scheme in cfBundleURLSchemes) {
if ([scheme isKindOfClass:[NSString class]] && [url hasPrefix:scheme]) {
schemeIsInPlist = YES;
break;
}
}
}
}
}
BOOL canOpenUrl = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString: url]];
return schemeIsInPlist && canOpenUrl;
}
La limitazione è che stiamo verificando che questa applicazione registrato per il programma e alcuni applicazione risponde a tale URL.
AFAIK ciò non garantisce che l'applicazione sia il rispondente effettivo per tale schema (nel caso in cui un'altra app sia stata registrata per tale schema).
Da quello che ho provato, sembra che iOS apra la prima app installata per ogni schema di URL unico.
0
Ecco come ho risolto a Swift:
var plistPath = NSBundle.mainBundle().pathForResource("Info", ofType: "plist")
var urlStuff = NSMutableDictionary(contentsOfFile: plistPath!)
var urlType = NSDictionary(objectsAndKeys: "com.appprefix.AppName", "CFBundleURLName", NSArray(object: "fb123456789"), "CFBundleURLSchemes")
urlStuff?.setObject(NSArray(object: urlType), forKey: "CFBundleURLTypes")
urlStuff?.writeToFile(plistPath!, atomically: true)
0
Una soluzione più semplice:
+ (BOOL)isBundleURL:(NSURL *)url
{
NSArray *urlTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"];
NSArray *urlSchemes = [urlTypes.firstObject objectForKey:@"CFBundleURLSchemes"];
return [urlSchemes containsObject:url.scheme];
}
+ (BOOL)respondsToURL:(NSURL *)url
{
return [self isBundleURL:url] && [[UIApplication sharedApplication] canOpenURL:url];
}
Problemi correlati
- 1. Utilizzo di uno schema URL in XCTestCase
- 2. Invia link a Facebook incluso schema URL app - iOS 6
- 3. Come registrare uno schema di URL di apertura di app personalizzate con Xcode 4?
- 4. Schema URL simile a Gmail
- 5. Uno schema a stella è uno schema denormalizzato?
- 6. schema URL personalizzato per la condivisione di URL in Facebook iPhone nativa App
- 7. Esiste uno schema json di schema json?
- 8. Come posso abbreviare un URL con uno schema personalizzato?
- 9. Schema URL: Apri app o Appstore dalla posta
- 10. App Android: come leggere i parametri get da uno schema di URL personalizzato?
- 11. Maniglia URL http con la mia app (se installato)
- 12. Come gestisco uno schema URL personalizzato in PhoneGap per un avvio a freddo?
- 13. Lunghezza schema URL iOS
- 14. Schema URL per app che non è installato
- 15. Schema URL iOS lento
- 16. Aggiunta di variabili "virtuali" a uno schema di mangusta?
- 17. modo di modellare una relazione uno-a-uno nello schema?
- 18. NSLog rallenterà la mia app?
- 19. Come gestire uno schema URL personalizzato in Webkit GTK?
- 20. Posso interrompere Android dall'uccidere la mia app?
- 21. Schema URL YouTube tvOS
- 22. Problema dopo aver inviato la mia app a TestFlight
- 23. Aggiungere uno schema XML a Visual Studio
- 24. Schema URL "Apri Impostazioni" ios
- 25. Directory.GetFiles() non funziona con uno schema di "."
- 26. Schema URL Apple Music
- 27. Schema URL Android: intent.getData() == null (PhoneGap)
- 28. ha uno schema JSON
- 29. C'è uno schema di iphone URL per avviare una web app in modalità standalone da un collegamento
- 30. schema di emulazione di iphone URL per la telefonata
Ah, ora ho capito un po 'meglio. Non c'è modo di sapere con certezza prima di aprire un URL cosa succederà quando apri quell'URL. Non esiste un'interfaccia LaunchServices su iOS per la query. –
Ho deciso di accettare la mia risposta poiché sembra che questo sia il miglior metodo disponibile (anche se non è affidabile al 100%). –