Answers:
正如Kevin指出的那样,URL方案是在应用程序之间进行通信的唯一方法。因此,不,不可能启动任意应用程序。
但是可以启动任何注册URL方案的应用程序,无论是Apple的,您的应用程序还是其他开发者的应用程序。这些文档在这里:
至于启动手机,看起来您的tel:
链接需要至少三位数字才能启动手机。因此,您不能不拨打电话就直接进入应用程序。
我发现编写一个可以打开另一个应用程序的应用程序很容易。
假设我们有两个名为FirstApp
和的应用程序SecondApp
。当我们打开FirstApp时,我们希望能够通过单击一个按钮来打开SecondApp。解决方案是:
在SecondApp中
转到SecondApp的plist文件,您需要添加带有字符串iOSDevTips的URL方案(当然,您可以编写另一个字符串。由您自己决定)。
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。
Info.plist
的FirstApp
。然后添加您的应用要打开的方案,在这种情况下,Item 0
应为iOSDevTips
LSApplicationQueriesSchemes
到其Info.plist中才能打开SecondApp。
lee的答案对于8之前的iOS绝对正确。
在iOS 9+中,您必须在LSApplicationQueriesSchemes键(字符串数组)下的Info.plist中将您的应用要查询的所有URL方案列入白名单:
在斯威夫特
以防万一有人在寻找快速的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)
}
为了让您从另一个应用程序打开,您需要在两个应用程序中进行更改。下面是使用的步骤夫特3与iOS的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方案注册的新版本。
这是一个从另一个应用程序中启动应用程序的很好的教程:
iOS SDK:使用URL方案
而且,无法启动任意应用程序,但是可以注册本地URL方案的本机应用程序。
为此,我们需要在两个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®istered=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浏览器中
尝试以下代码将帮助您从应用程序启动应用程序
注意:用实际的应用程序名称替换名称幻想
NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];
您只能启动已注册URL方案的应用程序。然后就像您通过使用sms:打开SMS应用程序一样,您将能够使用其URL方案打开该应用程序。
在名为LaunchMe的文档中有一个很好的例子来演示这一点。
截至 2017年11月6日的LaunchMe示例代码。
我也在前一阵子尝试过(使用Identifier启动iPhone应用程序),但是绝对没有DOCUMENTED方法可以做到这一点。:)
在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
}
}