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


170

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

这可能吗?我知道可以使用tel URL链接拨打电话,但是我想只启动Phone应用程序而无需拨打任何特定号码。

Answers:


80

正如Kevin指出的那样,URL方案是在应用程序之间进行通信的唯一方法。因此,不,不可能启动任意应用程序。

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

与其他应用程序通信

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


8
(NSURL *)网址: -你可以查看是否有问题的应用程序使用的UIApplication的安装(BOOL)canOpenURL
Willster

1
如果2个应用程序注册相同的URL处理程序,然后调用该URL,会发生什么情况?我知道在Android中,您会看到一个带有列表的列表,因此您可以选择要运行的两个列表中的哪个。ios如何处理呢?
eggie5 2011年

3
注意:如果注册了多个第三方应用程序来处理相同的URL方案,则当前没有确定哪个应用程序将获得该方案的过程。参考文献:developer.apple.com/library/ios/#documentation/iPhone/...
未来的危机

2
这是更新的链接,其中提到有关多个第三方应用程序注册以处理相同URL方案的说明:Apple Docs
SindriJóelsson18年


78

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

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

  1. 在SecondApp中

    转到SecondApp的plist文件,您需要添加带有字符串iOSDevTipsURL方案(当然,您可以编写另一个字符串。由您自己决定)。

在此处输入图片说明

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
你可以在这里看到完整的解释iosdevelopertips.com/cocoa/...
youssman

1
@Lee我正在关注您的帖子,safari可以打开该应用程序,但另一个应用程序无法打开(按下按钮的方法),否则将执行块,请问有什么问题可以帮助我
srinivas n

请给我更多有关您的问题的详细信息
李(Lee)

1
人们谁也无法得到这个工作,加上字符串数组名为“LSApplicationQueriesSchemes” Info.plistFirstApp。然后添加您的应用要打开的方案,在这种情况下,Item 0应为iOSDevTips

1
另请参见下面的KIO答案(stackoverflow.com/a/33763449/394969)。FirstApp需要添加LSApplicationQueriesSchemes到其Info.plist中才能打开SecondApp。
约翰·埃克

28

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

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

在此处输入图片说明


2
最好的答案应该是@KIO和villy393之间的合并
Gustavo Barbosa

19

在斯威夫特

以防万一有人在寻找快速的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)      
}

13

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

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

更新Info.plist定义应用程序的定制和独特的URL方案。

在此处输入图片说明

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

2.在主应用程序中包括以前的URL方案

您需要指定您希望应用程序能够与该类的canOpenURL:方法一起使用的URL方案UIApplication。因此,打开主应用Info.plist程序的URL并将其他应用程序的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方案注册的新版本。


1
这是正确的答案。我注意到,仅添加“ LSApplicationQueriesSchemes”无效,“ URL方案”也需要添加到info.plist中。
Shailesh


9

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

应用程序A:要从另一个应用程序打开的应用程序。(资源)

应用B:要从应用B中打开应用A (目标)

应用程式A程式

App A的Plist中添加一些标签,App A的 Open Plist源以及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://?来打开App 在Safari浏览器中


7

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

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

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

7

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

在名为LaunchMe的文档中有一个很好的例子来演示这一点。

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


更新的答案。希望能
有所

谢谢; 您有机会加入iOS开发者家庭聊天室吗?
Eenvincible

4

不,这不对。除了已记录的URL处理程序外,无法与其他应用进行通信/启动。



3

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

很好,有帮助。现在如何将参数从源应用程序传递到目标应用程序?
Vigneswaran A

2

有关此主题的旁注...

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

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

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


0

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

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.