177

Is it possible to launch any arbitrary iPhone application from within another app?, For example in my application if I want the user to push a button and launch right into the Phone app (close the current app, open the Phone app).

would this be possible? I know this can be done for making phone calls with the tel URL link, but I want to instead just have the Phone app launch without dialing any specific number.

4

14 回答 14

82

正如 Kevin 所指出的,URL 方案是应用程序之间通信的唯一方式。所以,不,不可能启动任意应用程序。

但是可以启动任何注册 URL Scheme 的应用程序,无论是 Apple 的、您的或其他开发人员的。文档在这里:

为您的应用定义自定义 URL 方案

至于启动手机,看起来您的tel:链接至少需要三位数才能启动手机。因此,您不能不拨打号码就直接进入应用程序。

于 2009-01-07T05:35:38.453 回答
79

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

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

  1. 在 SecondApp

    进入SecondApp的plist文件,你需要添加一个带有字符串iOSDevTips的URL Schemes(当然你可以写另一个字符串,这取决于你)。

在此处输入图像描述

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。

于 2014-06-04T09:31:42.033 回答
30

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

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

在此处输入图像描述

于 2015-11-17T17:35:31.283 回答
23

在斯威夫特

以防万一有人正在寻找快速的 Swift 复制和粘贴。

if let url = URL(string: "app://"), UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else if let itunesUrl = URL(string: appLink), UIApplication.shared.canOpenURL(itunesUrl) {
            UIApplication.shared.open(itunesUrl, options: [:], completionHandler: nil)
        }
于 2016-01-19T13:30:50.017 回答
15

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

1.注册您要打开的应用程序

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

在此处输入图像描述

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

2. 在您的主应用程序中包含之前的 URL 方案

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

在此处输入图像描述

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 方案注册的新版本。

于 2017-05-25T08:07:13.457 回答
11

这是从另一个应用程序中启动应用程序的一个很好的教程:
iOS SDK:使用 URL Schemes
而且,不能启动任意应用程序,但可以启动注册了URL Schemes的本机应用程序。

于 2011-12-26T11:04:24.817 回答
9

为此,我们需要在两个 App 中添加几行代码

应用 A:您想从另一个应用打开的应用。(资源)

App B : 从 App B 你想打开App A (Destination)

应用程序 A 的代码

在 App A的 Plist 中添加几个标签打开App A 的 Plist Source 和 XML 下面的 Past

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

在 App A的 App 代表中- 在此处获取回调

- (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 
}

现在来到App 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];

        }
}

注意:您也可以通过键入testApp.linking://? 在 Safari 浏览器上

于 2017-07-19T11:09:11.890 回答
8

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

注意:将名称幻想替换为实际的应用程序名称

NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];
于 2014-09-04T13:54:52.447 回答
7

您只能启动已注册 URL 方案的应用程序。然后就像您使用 sms: 打开 SMS 应用程序一样,您将能够使用其 URL 方案打开该应用程序。

在名为 LaunchMe 的文档中有一个非常好的示例,它演示了这一点。

截至 2017 年 11 月 6 日的LaunchMe 示例代码

于 2009-01-07T11:43:10.987 回答
4

不,这不对。除了记录在案的 URL 处理程序之外,没有办法与/启动另一个应用程序进行通信。

于 2009-01-07T04:59:54.420 回答
4

在 Swift 4.1 和 Xcode 9.4.1

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

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

步骤1

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

在此处输入图像描述

第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
    }
}
于 2018-07-19T08:04:28.057 回答
3

不久前我也尝试过(使用标识符启动 iPhone 应用程序),但绝对没有文档化的方法可以做到这一点。:)

于 2011-12-26T22:03:43.500 回答
2

关于这个主题的旁注......

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

在这个讨论中,苹果提到对于特定版本的应用程序,您只能查询canOpenUrl有限的次数,并且在 50 次未声明的方案调用后将失败。我还看到,如果在您进入此失败状态后添加协议,它仍然会失败。

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

于 2019-07-01T14:28:24.860 回答
1

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

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
于 2017-05-03T12:34:57.327 回答