博客> APP调用Custom URL Scheme
APP调用Custom URL Scheme
2017-10-20 12:55 评论:0 阅读:844 tianya2416
白名单 Scheme app唤醒

Custom URL scheme 的好处就是,你可以在其它程序中通过这个url打开应用程序。如A应用程序注册了一个url scheme:BProject, 那么就在可以浏览器中就可以通过打开你的应用程序A。

Android

首先在AndroidManifast.xml要被指定Scheme的Activity下设置如下参数

<intent>  
  <category android:name="android.intent.category.DEFAULT"></category>  
  <action android:name="android.intent.action.VIEW"></action>  
  <data android:scheme="mgtv"></data>  
</intent>  

这样即指定了接收Uri的Scheme为 mgtv 且 Action为View的Intent。

利用如下Intent调用Activity

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("mgtv://?action=play&data=12345")));

或在浏览器中调用A链接打开

<a href="mgtv://?action=play&data=12345">打开你的应用程序</a>

在接收的Activity中使用如下代码获得数据

//获得Scheme名称  
this.getIntent().getScheme();
//获得Uri全部路径
this.getIntent().getDataString();

iOS

Scheme 配置

 1.png

在其他应用里就可以用以下语句启动你的app

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"BProject://"]];
当然你也可以  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"AProject://"]];

在自定义了 URL scheme 的应用中,app delegate 必须实现以下方法:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
                                       sourceApplication:(NSString *)sourceApplication
                                              annotation:(id)annotation

例如,假设我们使用以下的 URL scheme,我们可以像这样创建一个 URL:

NSString *customURL = @"BProject://?action=play&data=12345"; 在 web 开发中,字符串 ?action=play&data=12345 被称作查询询串(query string)。

在被调用(设置了自定义 URL)的应用的 app delegate 中,获取参数的代码如下:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
                                       sourceApplication:(NSString *)sourceApplication
                                              annotation:(id)annotation
{
  NSLog(@"Calling Application Bundle ID: %@", sourceApplication);
  NSLog(@"URL scheme:%@", [url scheme]);
  NSLog(@"URL query: %@", [url query]);

  return YES;
}

以上代码在应用被调用时的输出为:

Calling Application Bundle ID: com.hunantv.app
URL scheme:BProject
URL query: action=play&data=12345

额外功能

如果你想启动一个页面那么,此时要考虑你的应用是否已经启动,可以如下判断使用:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url  
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{  
    NSString *handleUrl = [url absoluteString];  
    if ([handleUrl isEqualToString:@"BProject://callsuccess"]) {  
        return YES;  
    }else{  
        UINavigationController *vc = (UINavigationController *)_window.rootViewController;  
        if (vc == nil) {  
            PathViewController *controller = [[PathViewController alloc] initWithNibName:@"PathViewController" bundle:nil];  

            self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  
            self.mUINavigationController = [[UINavigationController alloc] init];  

            [self.mUINavigationController pushViewController:controller animated:YES];  
            [self.window addSubview:self.mUINavigationController.view];  

            // Override point for customization after application launch.  
            self.window.backgroundColor = [UIColor whiteColor];  
            [self.window makeKeyAndVisible];  
        }  
        return YES;  
    }
  }

也就是把appdelegate里面的didFinishLaunchingWithOptions初始化app的代码拷贝进去。此时会启动PathViewController这个页面。然后在这个页面里面可以添加一个返回按钮来返回到调用APP。

再次 在TestAAPp里面使用URl Scheme调起你的APP

- (void)buttonPressed:(UIButton *)button
{
  NSString *customURL = @"BProject://play/12345";

  if ([[UIApplication sharedApplication]
    canOpenURL:[NSURL URLWithString:customURL]])
  {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
  }
  else
  {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"
                          message:[NSString stringWithFormat:
                            @"No custom URL defined for %@", customURL]
                          delegate:self cancelButtonTitle:@"Ok"
                          otherButtonTitles:nil];
    [alert show];
  }
}

注意

如果你是iOS9系统,由于iOS9为了安全提出了白名单概念,你必须在TestAAPp的info.plist里面配置以下信息

 9A5339A5-9E6F-42EC-BCCB-D333D85BE5D8.png

白名单上限只有50个。

其他

iOS与Android在这儿有点小区别,在iOS中如果系统注册了url scheme且安装了那个应用程序,通过上面那种网页的方式就可以启动应用程序,如果没有注册或没有安装那个应用程序,就没有任何效果(你注册的url scheme不能是http://xxx 这样的)。

在Android系统中注册了url scheme且安装了那个应用程序,通过上面那种网页的方式就可以启动应用程序,如果没有注册或没有安装那个应用程序,就没有任何效果;如果注册了是http://xxx这样的,就会弹了一个对话框让你选,是打开网页还是程序。

iOS中不能注册http://xxx这样的url scheme,而Android是可以的。

收藏
0
sina weixin mail 回到顶部