Khởi chạy một ứng dụng từ bên trong (iPhone)


170

Có thể khởi chạy bất kỳ ứng dụng iPhone tùy ý nào từ bên trong một ứng dụng khác không?, Ví dụ trong ứng dụng của tôi nếu tôi muốn người dùng nhấn nút và khởi chạy ngay vào ứng dụng Điện thoại (đóng ứng dụng hiện tại, mở ứng dụng Điện thoại) .

điều này sẽ có thể? Tôi biết điều này có thể được thực hiện để thực hiện các cuộc gọi điện thoại bằng liên kết URL tel, nhưng tôi muốn thay vào đó chỉ cần khởi chạy ứng dụng Điện thoại mà không cần quay số cụ thể.

Câu trả lời:


80

Như Kevin chỉ ra, Lược đồ URL là cách duy nhất để giao tiếp giữa các ứng dụng. Vì vậy, không, không thể khởi chạy các ứng dụng tùy ý.

Nhưng có thể khởi chạy bất kỳ ứng dụng nào đăng ký Lược đồ URL, cho dù đó là Apple, của bạn hay nhà phát triển khác. Các tài liệu ở đây:

Giao tiếp với các ứng dụng khác

Đối với việc khởi chạy điện thoại, có vẻ như tel:liên kết của bạn cần có ít nhất ba chữ số trước khi điện thoại khởi chạy. Vì vậy, bạn không thể thả vào ứng dụng mà không quay số.


8
Bạn có thể kiểm tra xem ứng dụng đang được đề cập có được cài đặt hay không bằng cách sử dụng UIApplication's - (BOOL) canOpenURL: (NSURL *) url
Willster

1
Điều gì xảy ra nếu 2 ứng dụng đăng ký cùng một trình xử lý url và sau đó url được gọi? Tôi biết trong Android bạn sẽ được trình bày với một danh sách để bạn có thể chọn cái nào trong hai cái bạn muốn chạy. Làm thế nào để ios xử lý này?
eggie5

3
Lưu ý: Nếu có nhiều hơn một đăng ký ứng dụng của bên thứ ba xử lý cùng một lược đồ URL, hiện tại không có quy trình xác định ứng dụng nào sẽ được cung cấp cho lược đồ đó. Tham chiếu: developer.apple.com/l
Library / ios /

2
Đây là liên kết được cập nhật trong đó đề cập đến ghi chú về hơn một ứng dụng của bên thứ ba đăng ký để xử lý cùng một lược đồ URL: Apple Docs
Sindri Jóelsson

Hết ngày nữa rồi. Liên kết được cập nhật: developer.apple.com/documentation/uikit/
Kẻ

78

Tôi thấy rằng thật dễ dàng để viết một ứng dụng có thể mở một ứng dụng khác.

Giả sử rằng chúng ta có hai ứng dụng được gọi FirstAppSecondApp. Khi chúng tôi mở FirstApp, chúng tôi muốn có thể mở SecondApp bằng cách nhấp vào nút. Giải pháp để làm điều này là:

  1. Trong ứng dụng thứ hai

    Chuyển đến tệp plist của SecondApp và bạn cần thêm Lược đồ URL bằng chuỗi iOSDevTips (tất nhiên bạn có thể viết một chuỗi khác. Tùy thuộc vào bạn).

nhập mô tả hình ảnh ở đây

2. Trong ứng dụng đầu tiên

Tạo một nút với hành động dưới đây:

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

}

Đó là nó. Bây giờ khi bạn có thể nhấp vào nút trong FirstApp, nó sẽ mở SecondApp.


2
Bạn có thể xem phần giải thích đầy đủ tại đây iosdevelopertips.com/cocoa/ từ
youssman

1
@Lee Tôi đang theo dõi bài đăng của bạn, safari có thể mở ứng dụng nhưng một ứng dụng khác không mở (phương pháp nhấn nút) khối khác được thực thi, vấn đề gì bạn có thể vui lòng giúp tôi
srinivas n

Xin vui lòng cho tôi biết thêm chi tiết về vấn đề của bạn
lee

1
Những người không thể có được điều này để làm việc, thêm một mảng các chuỗi có tên là 'LSApplicationQueriesSchemes' trong Info.plistcủa FirstApp. Sau đó, thêm các chương trình mà ứng dụng của bạn muốn mở, trong trường hợp này Item 0sẽ làiOSDevTips

1
Xem thêm câu trả lời của KIO bên dưới ( stackoverflow.com/a/33763449/394969 ). FirstApp cần thêm LSApplicationQueriesSchemesvào Info.plist của nó để có thể mở SecondApp.
John Erck

28

Câu trả lời lee hoàn toàn chính xác cho iOS trước 8.

Trong iOS 9+, bạn phải lập danh sách trắng bất kỳ lược đồ URL nào mà Ứng dụng của bạn muốn truy vấn trong Info.plist trong khóa LSApplicationQueriesScheme (một chuỗi các chuỗi):

nhập mô tả hình ảnh ở đây


2
Câu trả lời tốt nhất nên là sự hợp nhất giữa @KIO và villy393
Gustavo Barbosa

19

Trong Swift

Chỉ trong trường hợp ai đó đang tìm kiếm một bản sao Swift nhanh chóng và dán.

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

Để cho phép bạn mở ứng dụng của mình từ ứng dụng khác, bạn sẽ cần thay đổi trong cả hai ứng dụng. Dưới đây là các bước sử dụng Swift 3 với bản cập nhật iOS 10 :

1. Đăng ký ứng dụng của bạn mà bạn muốn mở

Cập nhật Info.plistbằng cách xác định Lược đồ URL tùy chỉnh và duy nhất của ứng dụng của bạn.

nhập mô tả hình ảnh ở đây

Lưu ý rằng tên lược đồ của bạn phải là duy nhất, nếu không, nếu bạn có một ứng dụng khác có cùng tên lược đồ URL được cài đặt trên thiết bị của mình, thì đây sẽ được xác định thời gian chạy mà cái nào được mở.

2. Bao gồm lược đồ URL trước đó trong ứng dụng chính của bạn

Bạn sẽ cần chỉ định lược đồ URL mà bạn muốn ứng dụng có thể sử dụng với canOpenURL:phương thức của UIApplicationlớp. Vì vậy, hãy mở ứng dụng chính Info.plistvà thêm lược đồ URL của ứng dụng khác vào LSApplicationQueriesSchemes. (Được giới thiệu trong iOS 9.0)

nhập mô tả hình ảnh ở đây

3. Thực hiện hành động mở ứng dụng của bạn

Bây giờ mọi thứ đã được thiết lập, vì vậy bạn rất tốt để viết mã của mình trong ứng dụng chính mở ứng dụng khác của bạn. Cái này sẽ trông giống như thế này:

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

Lưu ý rằng những thay đổi này yêu cầu một bản phát hành mới nếu bạn muốn ứng dụng hiện tại của mình (được cài đặt từ AppStore) mở. Nếu bạn muốn mở một ứng dụng mà bạn đã phát hành lên Apple AppStore, thì trước tiên bạn cần tải lên phiên bản mới bao gồm đăng ký lược đồ URL của bạn.


1
Đây là câu trả lời đúng. Tôi nhận thấy rằng chỉ thêm "LSApplicationQueriesScheme" không hoạt động, "Lược đồ URL" cũng cần được thêm vào trong info.plist.
Shailesh


9

Để đạt được điều này, chúng ta cần thêm một vài dòng Mã trong cả hai ứng dụng

Ứng dụng A: Bạn muốn mở từ Ứng dụng khác. (Nguồn)

Ứng dụng B : Từ Ứng dụng B, bạn muốn mở Ứng dụng A (Đích đến)

Mã cho ứng dụng A

Thêm một vài thẻ vào Plist of App A Nguồn mở của ứng dụng A và quá khứ bên dưới XML

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

Trong ứng dụng đại biểu của Ứng dụng A - Nhận gọi lại tại đây

- (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ây giờ đến mã ứng dụng B -

Nếu bạn chỉ muốn mở Ứng dụng A mà không có bất kỳ tham số đầu vào nào

-(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];

        }
}

Nếu bạn muốn chuyển tham số từ Ứng dụng B sang Ứng dụng A thì hãy sử dụng Mã bên dưới

-(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];

        }
}

Lưu ý: Bạn cũng có thể mở Ứng dụng chỉ bằng cách gõ testApp.linking: //? trên trình duyệt safari


7

Hãy thử đoạn mã sau sẽ giúp bạn Khởi chạy một ứng dụng từ ứng dụng của bạn

Lưu ý: Thay thế tên tưởng tượng bằng tên ứng dụng thực tế

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

7

Bạn chỉ có thể khởi chạy các ứng dụng đã đăng ký lược đồ URL. Sau đó, giống như bạn mở ứng dụng SMS bằng cách sử dụng sms:, bạn sẽ có thể mở ứng dụng bằng sơ đồ URL của họ.

Có một ví dụ rất hay có sẵn trong các tài liệu có tên LaunchMe chứng minh điều này.

Mã mẫu LaunchMe kể từ ngày 6 tháng 11 năm 2017.


Cập nhật câu trả lời. Hy vọng rằng sẽ giúp
mấtInTransit

Cảm ơn; có khi nào, bạn có thuộc phòng chat của Nhà phát triển iOS không?
Eenvincible

4

Không, không phải vậy. Bên cạnh các trình xử lý URL được ghi lại, không có cách nào để liên lạc / khởi chạy một ứng dụng khác.


3

Tôi cũng đã thử cách này một thời gian trước đây ( Khởi chạy ứng dụng iPhone với Mã định danh ), nhưng chắc chắn không có cách nào TÀI LIỆU để làm điều này. :)


2
Nó được ghi lại ... Kiểm tra tài liệu của Apple. developer.apple.com/l
Library / IOs / # document / iPhone / từ

1
Tôi biết rằng các lược đồ URL là có thể, nhưng những gì tôi đã hỏi trong câu hỏi của mình và những gì Jeff đã hỏi, là làm thế nào để mở Ứng dụng không hỗ trợ các lược đồ url ...
foebe

3

Trong Swift 4.1 và Xcode 9.4.1

Tôi có hai ứng dụng 1) PageViewControllExample và 2) DelegateExample. Bây giờ tôi muốn mở ứng dụng DelegateExample bằng ứng dụng PageViewControllExample. Khi tôi nhấp vào nút mở trong PageViewControllExample, ứng dụng DelegateExample sẽ được mở.

Để làm điều này, chúng ta cần thực hiện một số thay đổi trong tệp .plist cho cả hai ứng dụng.

Bước 1

Trong ứng dụng DelegateExample mở tệp .plist và thêm Loại URL và Lược đồ URL. Ở đây chúng ta cần thêm tên yêu cầu của chúng tôi như "myapp".

nhập mô tả hình ảnh ở đây

Bước 2

Trong ứng dụng PageViewControllExample mở tệp .plist và thêm mã này

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

Bây giờ chúng ta có thể mở ứng dụng DelegateExample khi chúng ta nhấp vào nút trong PageViewControllExample.

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

Tuyệt vời, nó giúp. Bây giờ làm thế nào để chuyển đối số từ ứng dụng nguồn sang ứng dụng đích?
Vigneswaran

2

Một ghi chú bên lề về chủ đề này ...

Có giới hạn 50 yêu cầu cho các giao thức không được đăng ký.

Trong cuộc thảo luận này, apple đề cập rằng đối với một phiên bản cụ thể của một ứng dụng, bạn chỉ có thể truy vấn canOpenUrlsố lần giới hạn và sẽ thất bại sau 50 cuộc gọi cho các kế hoạch không được khai báo . Tôi cũng đã thấy rằng nếu giao thức được thêm vào khi bạn đã vào trạng thái lỗi này thì nó vẫn sẽ thất bại.

Hãy nhận ra điều này, có thể hữu ích cho một ai đó.


0

Swift 3 phiên bản nhanh và dán của câu trả lời @ villy393 cho:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.