ios - utm_source - Inicie la aplicación utilizando la URL, pero OpenUrl no se llama
utm_source google play utm_medium organic (5)
He implementado un esquema de URL y lo uso para pasar datos a mi aplicación llamando al método. El código completo se muestra a continuación.
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
// Check the calling application Bundle ID
if ([[url scheme] isEqualToString:@"yuvitime"])
{
NSLog(@"URL scheme:%@", [url scheme]);
NSString * yuvitimeRequestValue = [url query];
NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
[notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];
return YES;
}
else
return NO;
}
Si mi aplicación está en el fondo, todo funciona bien. Cuando hace clic en una URL, la aplicación vuelve a Foreground y la URL se maneja como se codificó en la función anterior.
Sin embargo, si la aplicación finaliza (la aplicación aún no se ha iniciado), al hacer clic en la URL, solo se inicia la aplicación sin llamar a la función de manejo que se muestra arriba.
Después de buscar, el mejor resultado que consigo es este
aplicación: WillFinishLaunchingWithOptions: cuando se le pide que abra una URL, el resultado de retorno de este método se combina con el resultado de la devolución de la application:didFinishLaunchingWithOptions:
método para determinar si se debe manejar una URL. Si cualquiera de los métodos devuelve NO, el sistema no llama a la application:openURL:options
: method. Si no implementa uno de los métodos, solo se considera el valor de retorno del método implementado.
- application: didFinishLaunchingWithOptions: este método representa su última oportunidad de procesar cualquier clave en el diccionario de launchOptions. Si no evaluó las claves en su application:willFinishLaunchingWithOptions:
método application:willFinishLaunchingWithOptions:
debe application:willFinishLaunchingWithOptions:
en este método y proporcionar una respuesta adecuada. Los objetos que no son el delegado de la aplicación pueden acceder a los mismos valores del diccionario launchOptions observando la notificación denominada UIApplicationDidFinishLaunchingNotification
y accediendo al diccionario de información de usuario de la notificación. Esa notificación se envía poco después de que este método vuelve. El resultado de retorno de este método se combina con el resultado de retorno de la application:willFinishLaunchingWithOptions:
método para determinar si se debe manejar una URL. Si cualquiera de los métodos devuelve NO, la URL no se maneja. Si no implementa uno de los métodos, solo se considera el valor de retorno del método implementado.
A pesar de la explicación, todavía no sé cómo hacerlo y no pude encontrar nada más concreto en línea.
Gracias
Saludos
Creo que hay una mejor respuesta ahora como,
-
application:handleOpenURL:
-
application:openURL:sourceApplication:annotation:
Ambos están en desuso en ios 9. La sugerencia de Apple es:
Use
application:openURL:options:
lugar.
application:openURL:options:
tiene un comportamiento diferente al de los anteriores, ya que se ejecutará en caso de que la aplicación se encuentre en segundo plano o se inicie .
Por lo tanto, necesita manejar la apertura de URL solo dentro de ella. como abajo:
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options {
// Check the calling application Bundle ID
if ([[url scheme] isEqualToString:@"yuvitime"])
{
NSLog(@"URL scheme:%@", [url scheme]);
NSString * yuvitimeRequestValue = [url query];
NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
[notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];
return YES;
}
else
return NO;
}
Estoy de acuerdo con Kaloyan, "handleOpenURL" nunca se llama en el lanzamiento de la aplicación. Por lo tanto, debe verificar la URL en "launchOptions" en didFinishLaunchingWithOptions.
SIN EMBARGO
Adopté la misma solución que el código de ejemplo de Apple para QuickActions (3D Touch). Mantengo la URL al inicio en una variable y la manejo en applicationDidBecomeActive:
@interface MyAppDelegate ()
@property (nonatomic, strong) NSURL *launchedURL;
@end
@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.launchedURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
...
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if (self.launchedURL) {
[self openLink:self.launchedURL];
self.launchedURL = nil;
}
}
- (BOOL) application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSURL *openUrl = url;
if (!openUrl)
{
return NO;
}
return [self openLink:openUrl];
}
- (BOOL)openLink:(NSURL *)urlLink
{
...
}
@end
Hola, cuando la aplicación no se inicia antes, el método "handleOpenURL" nunca se llama. Tiene que marcar "launchOptions" en didFinishLaunchingWithOptions para el objeto con la clave "UIApplicationLaunchOptionsURLKey"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
//call function to handle the url like in handleURL, but do not call handleURL directly
}
Para iOS 10, use
func application(_ app: UIApplication,
open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
Swift 2.x
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
if (url.scheme == "yuvitime") {
print("URL scheme:/(url.scheme)")
let yuvitimeRequestValue = url.query!
let userInfor = [
"YuvitimeRequest" : yuvitimeRequestValue
]
let notificationCentre = NSNotificationCenter.defaultCenter()
notificationCentre.postNotificationName("URLSCHEMEACTIVATEDNOTIFICATION", object: self, userInfo: userInfor)
return true
}
else {
return false
}
}