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

是否可以从另一个应用程序 比如说 在我的应用程序,如果我想要用户按下一个按钮,并启动到电话应用程序(关闭当前的应用程序,打开电话应用程序)中启动任意的 iPhone 应用程序。

这可能吗?我知道这可以做电话与电话网址链接,但我想只是有电话应用程序启动没有拨打任何具体的号码。

230621 次浏览

不,它不是。除了文档化的 URL 处理程序,没有办法与/启动另一个应用程序进行通信。

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

但是,可以启动任何注册 URL 方案的应用程序,无论是苹果的、你的还是其他开发者的。医生来了:

定义应用程序的自定义 URL 方案

至于推出手机,看起来你的 tel:链接需要至少有三个数字之前,手机将推出。所以你不能不打电话就直接进入应用程序。

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

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

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

下面是从另一个应用程序中启动应用程序的一个很好的教程:
IOS SDK: 使用 URL 方案
而且,不可能启动任意应用程序,而是启动注册了 网址计划的本机应用程序。

我前一段时间也尝试过这种方法(使用标识符启动 iPhone 应用程序) ,但是肯定没有文档记录的方法来做到这一点。 :)

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

让我们假设我们有两个应用程序称为 FirstAppSecondApp。当我们打开 FirstApp 时,我们希望能够通过单击一个按钮来打开 Second App。解决办法是:

  1. 在第二应用程序中

    转到 SecondApp 的 plist 文件,您需要添加一个带有字符串 IOSDevTips iOSDevTips网址计划(当然您可以编写另一个 string.it’s up to you)。

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 中的按钮时,它应该会打开 Second App。

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

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

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

对于8岁以前的 iOS 系统来说,Lee 的回答是绝对正确的。

在 iOS9 + 中,你必须在 Info.plist 中的 LSApplicationQueriesScheme 键(一个字符串数组)下面列出你的 App 想要查询的任何 URL 方案:

enter image description here

在斯威夫特

以防有人想要快速复制粘贴。

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

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

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

为了让您从另一个应用程序打开您的应用程序,您需要对两个应用程序都进行更改。下面是使用 Swift 3IOS10更新的步骤:

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

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

enter image description here

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

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

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

enter image description here

实现打开应用程序的操作

现在一切都设置好了,所以可以在打开其他应用程序的主应用程序中编写代码了。这应该是这样的:

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 安装) ,这些更改需要一个新版本。如果你想打开一个已经发布到苹果应用商店的应用程序,那么你需要先上传一个新版本,其中包括你的 URL 方案注册。

为了实现这一点,我们需要在两个应用程序中添加几行代码

应用程序 A: 您想从其他应用程序打开的应用程序。 < strong > (Source)

应用程序 B : 从应用程序 B 你想打开 应用程序 A < strong > (目标)

应用程序 A的密码

在 < strong > AppA 的列表中添加几个标记 打开应用程序 A 和过去在 XML 下面的 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 代码-

如果只想打开没有任何输入参数的应用程序 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];


}
}

如果要将参数从 应用程序 B传递到 应用程序 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 浏览器上打开应用程序,只需键入 链接://?

在 Swift 4.1和 Xcode 9.4.1中

我有两个应用程序1) PageViewControllerexample 和2) Generateexample。现在,我想用 PageViewControllerExampleapp 打开“代表示例”应用程序。当我在 PageViewControllerSample 中单击 open 按钮时,将会打开“委派示例”应用程序。

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

第一步

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

enter image description here

第二步

在 PageViewControllerexampleappopen.plist 文件中添加此代码

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

现在,我们可以在 PageViewControllerSample 中单击按钮时打开“代表示例”应用程序。

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

关于这个话题的一个附带说明..。

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

在这个讨论 苹果提到,对于一个应用程序的特定版本,你只能查询 canOpenUrl有限的次数和 在50个未申报方案的呼吁之后将会失败。我还看到,如果协议被添加,一旦你已经进入这个失败的状态,它仍然会失败。

意识到这一点,可能对某些人有用。