从另一个(iPhone)启动应用程序

时间:2009-01-07 03:41:48

标签: ios iphone deep-linking openurl

是否有可能从另一个应用程序中启动任意iPhone应用程序?例如 在我的应用程序中,如果我希望用户按下按钮并启动到手机应用程序中(关闭当前应用,打开手机应用程序)

这可能吗?我知道可以使用tel URL链接拨打电话,但我想改为启动Phone应用而不拨打任何特定号码。

14 个答案:

答案 0 :(得分:77)

Kevin指出,URL Schemes是应用程序之间通信的唯一方式。所以,不,不可能推出任意应用程序。

但是,可以启动任何注册URL方案的应用程序,无论是Apple的,还是其他开发者。文档在这里:

Communicating with Other Applications

至于启动手机,看起来您的tel:链接需要至少三位数才能启动手机。所以你不能只是拨打一个号码进入应用程序。

答案 1 :(得分:71)

我发现编写一个可以打开另一个应用程序的应用程序很容易。

我们假设我们有两个名为FirstAppSecondApp的应用。当我们打开FirstApp时,我们希望能够通过单击按钮打开SecondApp。这样做的解决方案是:

  1. 在SecondApp中

    转到SecondApp的plist文件,您需要添加 URL Schemes ,其中包含字符串 iOSDevTips (当然您可以编写另一个字符串。\ n' s由你决定。)

  2. enter image description here

    2 。在FirstApp

    使用以下操作创建一个按钮:

    - (void)buttonPressed:(UIButton *)button
    {
      NSString *customURL = @"iOSDevTips://";
    
      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];
      }
    
    }
    

    那就是它。现在,当您可以单击FirstApp中的按钮时,它应该打开SecondApp。

答案 2 :(得分:24)

对于8之前的iOS,lee答案绝对正确。

在iOS 9中,您必须将您的应用程序想要在LSApplicationQueriesSchemes键(字符串数组)下的Info.plist中查询的任何URL方案列入白名单:

enter image description here

答案 3 :(得分:15)

在Swift中

只是想找人快速复制并粘贴

if let url = NSURL(string: "app://") where UIApplication.sharedApplication().canOpenURL(url) {
            UIApplication.sharedApplication().openURL(url)
} else if let itunesUrl = NSURL(string: "https://itunes.apple.com/itunes-link-to-app") where UIApplication.sharedApplication().canOpenURL(itunesUrl) {
            UIApplication.sharedApplication().openURL(itunesUrl)      
}

答案 4 :(得分:11)

为了让您从另一个应用程序打开您的应用程序,您需要在两个应用程序中进行更改。以下是 Swift 3 iOS 10 更新的步骤:

<强> 1。注册您要打开的应用程序

通过定义应用程序的自定义和唯一URL方案来更新Info.plist

enter image description here

请注意,您的方案名称应该是唯一的,否则如果您的设备上安装了另一个具有相同URL方案名称的应用程序,那么将确定运行时哪个应用程序打开。

<强> 2。在主应用程序中包含以前的URL方案

您需要指定希望应用能够与canOpenURL:类的UIApplication方法一起使用的网址方案。因此,打开主应用程序的Info.plist并将其他应用程序的URL方案添加到LSApplicationQueriesSchemes(在iOS 9.0中引入)

enter image description here

第3。实施打开您的应用程序的操作

现在一切都已设置完毕,因此您可以在主应用程序中编写代码来打开其他应用程序。这应该是这样的:

let appURLScheme = "MyAppToOpen://"

guard let appURL = URL(string: appURLScheme) else {
    return
}

if UIApplication.shared.canOpenURL(appURL) {

    if #available(iOS 10.0, *) {
        UIApplication.shared.open(appURL)
    }
    else {
        UIApplication.shared.openURL(appURL)
    }
}
else {
    // Here you can handle the case when your other application cannot be opened for any reason.
}

请注意,如果您希望打开现有应用程序(从AppStore安装),则这些更改需要新版本。如果您要打开已经发布到Apple AppStore的应用程序,则需要先上传包含URL方案注册的新版本。

答案 5 :(得分:10)

这是从另一个应用程序中启动应用程序的好教程:
iOS SDK: Working with URL Schemes
并且,无法启动任意应用程序,但是注册URL Schemes的本机应用程序。

答案 6 :(得分:7)

您只能启动已注册网址方案的应用。然后,就像您使用短信:打开短信应用程序一样,您将能够使用他们的URL方案打开应用程序。

在名为LaunchMe的文档中有一个很好的例子可以证明这一点。

LaunchMe sample code截至2017年11月6日。

答案 7 :(得分:7)

为实现这一目标,我们需要在App

中添加几行代码

应用A:您要从其他应用中打开哪个。的(来源)

应用B :从应用B中您想要打开应用A (目的地)

代码 App A

App A 的Plist中添加几个标签 在XML下面打开App List A和过去的Plist源

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.TestApp</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testApp.linking</string>
        </array>
    </dict>
</array>

应用A 的应用代表中 - 在此处获取回叫

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// You we get the call back here when App B will try to Open 
// sourceApplication will have the bundle ID of the App B
// [url query] will provide you the whole URL 
// [url query] with the help of this you can also pass the value from App B and get that value here 
}

现在来到应用B代码 -

如果您只想在没有任何输入参数的情况下打开App A

-(IBAction)openApp_A:(id)sender{

    if(![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"testApp.linking://?"]]){
         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"App is not available!" message:nil delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];

        }
}

如果您想将参数从 App B 传递到 App A ,请使用以下代码

-(IBAction)openApp_A:(id)sender{
    if(![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"testApp.linking://?userName=abe&registered=1&Password=123abc"]]){
         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"App is not available!" message:nil delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];

        }
}

注意:您也可以在Safari浏览器中输入 testApp.linking://?打开应用

答案 8 :(得分:6)

尝试以下代码将帮助您从应用程序启动应用程序

注意:将名称fantacy替换为实际应用程序名称

NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];

答案 9 :(得分:3)

不,不是。除了记录的URL处理程序之外,没有办法与/启动另一个应用程序。

答案 10 :(得分:2)

我前一段时间也试过这个(Launch iPhone Application with Identifier),但肯定没有文档化的方法来做到这一点。 :)

答案 11 :(得分:1)

在Swift 4.1和Xcode 9.4.1中

我有两个应用程序1)PageViewControllerExample和2)DelegateExample。现在,我想用PageViewControllerExample应用程序打开DelegateExample应用程序。当我单击PageViewControllerExample中的“打开”按钮时,将打开DelegateExample应用程序。

为此,我们需要在两个应用程序的.plist文件中进行一些更改。

第1步

在DelegateExample应用程序中,打开.plist文件,然后添加URL类型和URL方案。在这里,我们需要添加所需的名称,例如“ myapp”。

enter image description here

第2步

在PageViewControllerExample应用程序中,打开.plist文件并添加此代码

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>myapp</string>
</array>

现在,当我们单击PageViewControllerExample中的按钮时,我们可以打开DelegateExample应用程序。

//In PageViewControllerExample create IBAction
@IBAction func openapp(_ sender: UIButton) {

    let customURL = URL(string: "myapp://")
    if UIApplication.shared.canOpenURL(customURL!) {

        //let systemVersion = UIDevice.current.systemVersion//Get OS version
        //if Double(systemVersion)! >= 10.0 {//10 or above versions
            //print(systemVersion)
            //UIApplication.shared.open(customURL!, options: [:], completionHandler: nil)
        //} else {
            //UIApplication.shared.openURL(customURL!)
        //}

        //OR

        if #available(iOS 10.0, *) {
            UIApplication.shared.open(customURL!, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(customURL!)
        }
    } else {
         //Print alert here
    }
}

答案 12 :(得分:0)

Swift 3快速粘贴版本的@ villy393回答:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}

答案 13 :(得分:0)

有关此主题的旁注...

未注册协议的请求限制为50。

In this discussion苹果公司提到,对于特定版本的应用程序,您只能查询canOpenUrl有限次,并且在50次未声明的调用之后将失败。我还看到,如果一旦进入此失败状态后添加了协议,它仍然会失败。

请注意这一点,可能对某人有用。