เปิดแอพจากภายใน (iPhone)


170

มันเป็นไปได้ที่จะเปิดตัวแอพลิเคชัน iPhone ใด ๆ โดยพลการจากภายในแอปอื่น ?, ตัวอย่าง ในการประยุกต์ใช้ของฉันถ้าฉันต้องการให้ผู้ใช้กดปุ่มและการเปิดตัวแก่ลง app โทรศัพท์ (ใกล้ app ปัจจุบันเปิดแอปโทรศัพท์)

สิ่งนี้จะเป็นไปได้ไหม ฉันรู้ว่าสิ่งนี้สามารถทำได้สำหรับการโทรศัพท์ด้วยลิงก์ tel URL แต่ฉันต้องการเพียงแค่เปิดใช้แอพ Phone โดยไม่ต้องกดหมายเลขใด ๆ

คำตอบ:


80

เควินชี้ให้เห็นว่ารูปแบบ URL เป็นวิธีเดียวที่จะสื่อสารระหว่างแอพ ดังนั้นไม่เป็นไปไม่ได้ที่จะเปิดแอพตามอำเภอใจ

แต่เป็นไปได้ที่จะเปิดแอพใด ๆ ที่ลงทะเบียน Scheme ของ URL ไม่ว่าจะเป็นของ Apple, ของคุณหรือของนักพัฒนาคนอื่น เอกสารอยู่ที่นี่:

การสื่อสารกับแอปพลิเคชันอื่น

สำหรับการเปิดตัวโทรศัพท์นั้นดูเหมือนว่าtel:ลิงค์ของคุณจะต้องมีตัวเลขอย่างน้อยสามหลักก่อนที่จะมีการเปิดตัวโทรศัพท์ ดังนั้นคุณไม่สามารถวางลงในแอพได้โดยไม่ต้องกดหมายเลข


8
คุณสามารถตรวจสอบว่ามีการติดตั้งแอปพลิเคชันที่มีปัญหาโดยใช้ UIApplication's - (BOOL) canOpenURL: (NSURL *) url หรือไม่
Willster

1
จะเกิดอะไรขึ้นถ้า 2 แอปลงทะเบียนตัวจัดการ url เดียวกันแล้วจึงเรียก url ฉันรู้ว่าใน Android คุณจะพบกับรายการเพื่อให้คุณสามารถเลือกหนึ่งในสองที่คุณต้องการเรียกใช้ ios จัดการกับสิ่งนี้อย่างไร
eggie5

3
หมายเหตุ: หากแอปของบุคคลที่สามมากกว่าหนึ่งรายที่ลงทะเบียนจัดการกับชุดรูปแบบ URL เดียวกันขณะนี้ยังไม่มีกระบวนการพิจารณาว่าแอปใดจะได้รับชุดรูปแบบนั้น Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur

2
นี่คือลิงก์ที่อัปเดตซึ่งกล่าวถึงบันทึกย่อเกี่ยวกับแอปของบุคคลที่สามที่ลงทะเบียนเพื่อจัดการกับรูปแบบ URL เดียวกัน: Apple Docs
Sindri Jóelsson

ล้าสมัยอีกครั้ง อัปเดตลิงค์: developer.apple.com/documentation/uikit/…
เดฟโนทเทจ

78

ฉันพบว่ามันง่ายที่จะเขียนแอพที่สามารถเปิดแอพอื่นได้

สมมติว่าเรามีสองปพลิเคชันที่เรียกว่าและFirstApp SecondAppเมื่อเราเปิด FirstApp เราต้องการให้สามารถเปิด SecondApp ได้โดยคลิกที่ปุ่ม วิธีแก้ปัญหาคือ:

  1. ใน SecondApp

    ไปที่ไฟล์ plist ของ SecondApp และคุณต้องเพิ่มแบบแผน URLด้วยสตริงiOSDevTips (แน่นอนว่าคุณสามารถเขียนสตริงอื่นได้ขึ้นอยู่กับคุณ)

ป้อนคำอธิบายรูปภาพที่นี่

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
@ เหมือนฉันกำลังติดตามโพสต์ของคุณซาฟารีสามารถเปิดแอปพลิเคชันได้ แต่แอปอื่นที่ไม่เปิด (วิธีกดปุ่ม) บล็อกอื่นถูกเรียกใช้งานปัญหาที่คุณโปรดช่วยฉันได้คือ
srinivas n

โปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับปัญหาของคุณ
lee

1
คนที่ไม่สามารถได้รับนี้ในการทำงานเพิ่มอาร์เรย์ของสตริงที่มีชื่อว่า 'LSApplicationQueriesSchemes ในของInfo.plist FirstAppจากนั้นเพิ่มรูปแบบที่แอปของคุณต้องการเปิดในกรณีนี้Item 0จะเป็นiOSDevTips

1
ดูคำตอบของ KIO ด้านล่าง ( stackoverflow.com/a/33763449/394969 ) FirstApp ต้องเพิ่มLSApplicationQueriesSchemesไปที่ Info.plist เพื่อให้สามารถเปิด SecondApp ได้
John Erck

28

คำตอบที่ถูกต้องสำหรับ iOS ก่อน 8

ใน iOS 9+ คุณต้องยกเว้นรายการ URL ใด ๆ ที่แอพของคุณต้องการสอบถามใน Info.plist ภายใต้คีย์ LSApplicationQueriesSchemes (อาร์เรย์ของสตริง):

ป้อนคำอธิบายรูปภาพที่นี่


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

เพื่อให้คุณเปิดแอปพลิเคชันของคุณจากอีกแอปหนึ่งคุณจะต้องทำการเปลี่ยนแปลงทั้งสองแอปพลิเคชัน นี่คือขั้นตอนที่ใช้Swift 3กับการอัปเดตiOS 10 :

1. ลงทะเบียนแอปพลิเคชันที่คุณต้องการเปิด

อัปเดตInfo.plistโดยกำหนด URL ที่กำหนดเองและไม่ซ้ำกันของโครงการ

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่าชื่อชุดรูปแบบของคุณควรไม่ซ้ำกันมิฉะนั้นถ้าคุณมีแอปพลิเคชันอื่นที่มีชื่อชุดรูปแบบ URL เดียวกันติดตั้งบนอุปกรณ์ของคุณแล้วจะมีการกำหนดรันไทม์ที่จะได้รับการเปิด

2. รวมรูปแบบ URL ก่อนหน้าในแอปพลิเคชันหลักของคุณ

คุณจะต้องระบุรูปแบบ URL ที่คุณต้องการให้แอปสามารถใช้กับcanOpenURL:วิธีการ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 ของคุณ


1
นี่คือคำตอบที่ถูกต้อง ฉันสังเกตเห็นว่าการเพิ่มเฉพาะ "LSApplicationQueriesSchemes" ไม่ทำงานต้องเพิ่ม "Scheme URL" ใน info.plist ด้วย
Shailesh

11

นี่คือการสอนที่ดีสำหรับการเปิดตัวแอพลิเคชันจากภายในแอปอื่น:
iOS SDK: การทำงานกับแบบแผน URL
และมันเป็นไปไม่ได้ที่จะเปิดตัวแอพลิเคชันโดยพลการ แต่แอพพลิเคชันซึ่งจดทะเบียนแบบแผน URL


9

เพื่อให้บรรลุถึงสิ่งนี้เราจำเป็นต้องเพิ่ม Code ในสองแอพ

แอพ A:คุณต้องการเปิดจากแอพอื่น (ที่มา)

แอพ B : จากแอพ B คุณต้องการเปิดแอพ A (ปลายทาง)

รหัสสำหรับแอพ A

เพิ่มแท็กเล็ก ๆ น้อย ๆ ลงใน Plist of App A Open Plist Source ของ App A และ Past ด้านล่าง XML

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

หากคุณต้องการเปิดแอพที่ไม่มีพารามิเตอร์อินพุต

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

        }
}

หมายเหตุ: คุณสามารถเปิดแอปได้ด้วยการพิมพ์testApp.linking: //? บนเบราว์เซอร์ซาฟารี


7

ลองรหัสต่อไปนี้จะช่วยให้คุณเปิดแอปพลิเคชันจากแอปพลิเคชันของคุณ

หมายเหตุ: แทนที่ชื่อ fantacy ด้วยชื่อแอปพลิเคชันจริง

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 ซึ่งแสดงให้เห็นสิ่งนี้

โค้ดตัวอย่าง LaunchMeณ วันที่ 6 พ.ย. 2560


อัปเดตคำตอบ หวังว่าจะช่วย
lostInTransit

ขอบคุณ; โดยบังเอิญคุณอยู่ในห้องแชทครอบครัวนักพัฒนา iOS หรือไม่?
Eenvincible


3

ฉันเคยลองทำเช่นนี้มาก่อนแล้ว ( เปิดตัวแอปพลิเคชัน iPhone ด้วยตัวระบุ ) แต่ไม่มีวิธีการทำเอกสารนี้แน่นอน :)


2
มีการบันทึกไว้ ... ตรวจสอบเอกสารของ Apple developer.apple.com/library/IOs/#documentation/iPhone/…
Moszi

1
ฉันรู้ว่ารูปแบบ URL เป็นไปได้ แต่สิ่งที่ฉันถามในคำถามของฉันและสิ่งที่ Jeff ถามคือวิธีเปิดแอปที่ไม่รองรับรูปแบบ URL ...
foebe

3

ใน Swift 4.1 และ Xcode 9.4.1

ฉันมีสองแอพ 1) PageViewControllerExample และ 2) DelegateExample ตอนนี้ฉันต้องการเปิดแอป DelegateExample ด้วยแอพ PageViewControllerExample เมื่อฉันคลิกปุ่มเปิดใน PageViewControllerExample แอป DelegateExample จะเปิดขึ้น

สำหรับสิ่งนี้เราต้องทำการเปลี่ยนแปลงบางอย่างในไฟล์. plist สำหรับทั้งแอพ

ขั้นตอนที่ 1

ในแอป DelegateExample ให้เปิดไฟล์. plist และเพิ่มประเภท URL และแผนการ URL ที่นี่เราจำเป็นต้องเพิ่มชื่อที่ต้องการเช่น "myapp"

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 2

ในแอพ PageViewControllerExample ให้เปิดไฟล์. plist และเพิ่มรหัสนี้

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

ตอนนี้เราสามารถเปิดแอป DelegateExample เมื่อเราคลิกปุ่มใน PageViewControllerExample

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

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)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.