• 通过注册的URL Scheme向目标APP传递参数


    通过注册的URL Scheme向目标APP传递参数

    通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义URL来传递参数了。

    昨天我们在AppDelegate调用了UIApplicationDelegate的代理方法:

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL*)url
    {
        // 接受传过来的参数
        NSString *text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"
                                               message:text
                                              delegate:nil
                                     cancelButtonTitle:@"OK"
                                     otherButtonTitles:nil];
        [alertView show];
        return YES;
    }
    

    我们来看看苹果给这个方法的注释:

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
    

    这个方法在未来将被废弃,可以用application:openURL:sourceApplication:annotation:来代替。

    URL传参格式

    昨天我们在iOSStrongDemo注册的URL Scheme还记得是什么吗?你应该还有印象的就是iOS开发的ID:iOSDevTip

    假设我们想要传递两个参数分别是名字name和手机号phone,格式如下:

    iOSDevTip://?name=ligang&phone=13888888888
    

    有没有似曾相识的感觉。我们用get方式请求一个接口是不是就是这样的。

    被启动的APP处理传过来的参数

    - (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation
    {
        NSLog(@"sourceApplication: %@", sourceApplication);
        NSLog(@"URL scheme:%@", [url scheme]);
        NSLog(@"URL query: %@", [url query]);
    
        // 接受传过来的参数
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"
                                                            message:[url query]
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];
    
        return YES;
    }
    

    当APP被启动是,会调用代理方法application:openURL:sourceApplication:annotation:。参数URL就是启动APP的URL,参数sourceApplication就是来源APP的Bundle ID。

    我们依然通过Safari来测试,在Safari的地址栏中输入:iOSDevTip://?name=ligang&phone=13888888888

    scheme1

    即可打开APP,看看参数是否传递过来:

    scheme2

    最后我们看一下打印:

    2015-07-15 22:38:25.655 iOSStrongDemo[9983:2894855] sourceApplication: com.apple.mobilesafari
    2015-07-15 22:38:28.664 iOSStrongDemo[9983:2894855] URL scheme:iosdevtip
    2015-07-15 22:38:28.665 iOSStrongDemo[9983:2894855] URL query: name=ligang&phone=13888888888
    

    sourceApplication打印出来是com.apple.mobilesafari,从这里可以看出来,是从Safari启动我们的APP的。

    我们虽然自定义了URL Scheme,但是我们不能阻止别人通过自定义的URL Scheme来打开我们的应用。怎么解决呢?

    我们可以指定相应的sourceApplication,也就是相应的Bundle ID,通过Bundle ID来决定是否可以打开我们的APP:

    - (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation
    {
        NSLog(@"sourceApplication: %@", sourceApplication);
        NSLog(@"URL scheme:%@", [url scheme]);
        NSLog(@"URL query: %@", [url query]);
    
        if ([sourceApplication isEqualToString:@"com.3Sixty.CallCustomURL"]){
            // 接受传过来的参数
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开啦"
                                                                message:[url query]
                                                               delegate:nil
                                                      cancelButtonTitle:@"OK"
                                                      otherButtonTitles:nil];
            [alertView show];
    
            return YES;
        }else{
            return NO;
        }
    
    }
    

    这样我们就可以通过Bundle ID来决定是否允许打开我们的APP,demo下载地址:iOSStrongDemo

     

    本文出处刚刚在线:http://www.superqq.com/blog/2015/07/15/tong-guo-url-schemechuan-di-can-shu/

  • 相关阅读:
    简述虚拟打印功能的实现方法。
    什么是spool系统,什么是预输入,什么是缓输出?
    什么是虚拟设备技术,什么是虚拟设备,如何进行虚拟设备分配?
    什么是共享设备,对共享设备如何分配?
    什么是独占设备,对独占设备如何分配?
    对I/O设备分配的一般策略是什么?
    maven+nexus setting.xml配置(收藏)
    MySQL自动化安装(双主多从读写分离)
    Shell常用操作
    shell中的比较语句
  • 原文地址:https://www.cnblogs.com/easyToCode/p/5196888.html
Copyright © 2020-2023  润新知