दूसरे (iPhone) से एक ऐप लॉन्च करें


170

क्या किसी अन्य ऐप के भीतर से किसी भी मनमाने iPhone एप्लिकेशन को लॉन्च करना संभव है?, उदाहरण के लिए मेरे आवेदन में अगर मैं चाहता हूं कि उपयोगकर्ता बटन दबाए और फोन ऐप में सही लॉन्च करें (वर्तमान ऐप बंद करें, फोन ऐप खोलें)

क्या यह संभव होगा? मुझे पता है कि यह टेल यूआरएल लिंक के साथ फोन कॉल करने के लिए किया जा सकता है, लेकिन मैं इसके बजाय केवल किसी विशिष्ट नंबर को डायल किए बिना फोन ऐप लॉन्च करना चाहता हूं।

जवाबों:


80

जैसा कि केविन बताते हैं, URL योजनाएं ऐप्स के बीच संवाद करने का एकमात्र तरीका है। तो, नहीं, यह मनमाना ऐप लॉन्च करना संभव नहीं है।

लेकिन किसी भी ऐप को लॉन्च करना संभव है जो एक यूआरएल स्कीम को पंजीकृत करता है, चाहे वह ऐप्पल, आपका या किसी अन्य डेवलपर का हो। डॉक्स यहां हैं:

अन्य अनुप्रयोगों के साथ संचार

फोन को लॉन्च करने के लिए, ऐसा लगता है कि आपके tel:लिंक को फोन लॉन्च करने से पहले कम से कम तीन अंकों की आवश्यकता होगी। तो आप बस एक नंबर डायल किए बिना ऐप में ड्रॉप नहीं कर सकते।


8
आप जाँच सकते हैं कि क्या प्रश्न में आवेदन UIApplication - (BOOL) canOpenURL का उपयोग करके स्थापित किया गया है: (NSURL *) url
Willster

1
यदि 2 ऐप्स समान url हैंडलर को पंजीकृत करते हैं और फिर url कहा जाता है? मुझे पता है कि एंड्रॉइड में आपको w / एक सूची प्रस्तुत की जाएगी ताकि आप चुन सकें कि आप दोनों में से किसको चलाना चाहते हैं। आईओएस इसे कैसे संभालती है?
eggie5

3
नोट: यदि एक से अधिक तृतीय-पक्ष ऐप एक ही URL योजना को संभालने के लिए रजिस्टर करते हैं, तो वर्तमान में यह निर्धारित करने के लिए कोई प्रक्रिया नहीं है कि कौन सी ऐप उस योजना को दी जाएगी। Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur

2
यह अद्यतन लिंक है जिसमें एक ही URL-स्कीम को संभालने के लिए पंजीकृत एक से अधिक थर्ड पार्टी ऐप के बारे में नोट का उल्लेख है: Apple डॉक्स
सिंदरी जोल्सन

फिर से आउट ऑफ डेट। अपडेटेड लिंक: developer.apple.com/documentation/uikit/…
डेव नट

78

मैंने पाया कि ऐसा ऐप लिखना आसान है जो दूसरा ऐप खोल सके।

मान लेते हैं कि हमारे पास दो ऐप हैं जिन्हें कॉल किया गया है FirstAppऔर SecondApp। जब हम FirstApp खोलते हैं, तो हम एक बटन पर क्लिक करके SecondApp को खोलने में सक्षम होना चाहते हैं। इसका समाधान यह है:

  1. सेकंडएप में

    SecondApp की प्लिस्ट फ़ाइल पर जाएं और आपको एक स्ट्रिंग iOSDevTips के साथ एक URL स्कीम जोड़ने की आवश्यकता है (निश्चित रूप से आप एक और string.it आप तक लिख सकते हैं)।

यहां छवि विवरण दर्ज करें

२। फर्स्टऐप में

नीचे की कार्रवाई के साथ एक बटन बनाएं:

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

}

बस। अब जब आप फर्स्टएप में बटन पर क्लिक कर सकते हैं तो उसे दूसरा एप खोलना चाहिए।


2
आप पूरी व्याख्या यहाँ देख सकते हैं iosdevelopertips.com/cocoa/…
youssman

1
@ मैं आपकी पोस्ट का अनुसरण कर रहा हूं, सफारी एप्लिकेशन को खोल सकता है लेकिन एक और ऐप नहीं खुला (बटन दबाया गया विधि) अन्यथा ब्लॉक निष्पादित किया जाता है, समस्या क्या है आप कृपया मेरी मदद कर सकते हैं
श्रीनिवास n

कृपया मुझे अपनी समस्या के बारे में कुछ और जानकारी दें
lee

1
जो लोग काम करने के लिए इस नहीं मिल सकता है, में 'LSApplicationQueriesSchemes' नामक तार की एक सरणी जोड़ने Info.plistकी FirstApp। फिर उन योजनाओं को जोड़ें जो आपका ऐप खोलना चाहते हैं, इस मामले मेंItem 0iOSDevTips

1
नीचे KIO का उत्तर भी देखें ( stackoverflow.com/a/33763449/394969 )। FirstApp को दूसरी InfoApp LSApplicationQueriesSchemesखोलने में सक्षम होने के लिए अपनी Info.plist में जोड़ना होगा।
जॉन एरक

28

8 से पहले iOS के लिए lee उत्तर बिल्कुल सही है।

IOS 9+ में आपको किसी भी URL स्कीम को श्वेतसूची में डालना होगा, जो आपके ऐप द्वारा Info.plist में LSApplicationQueriesSchemes कुंजी (स्ट्रिंग्स की एक सरणी) के तहत क्वेरी करना चाहता है:

यहां छवि विवरण दर्ज करें


2
सबसे अच्छा उत्तर @KIO और villy393 के बीच एक मर्ज होना चाहिए
गुस्तावो बारबोसा

19

स्विफ्ट में

बस मामले में किसी को एक त्वरित स्विफ्ट कॉपी और पेस्ट की तलाश थी।

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

आपको अपना आवेदन दूसरे से खोलने के लिए, आपको दोनों अनुप्रयोगों में परिवर्तन करने की आवश्यकता होगी। यहां iOS 10 अपडेट के साथ स्विफ्ट 3 का उपयोग करने के चरण दिए गए हैं :

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" जोड़ने से काम नहीं हुआ, "URL स्कीम" को भी info.plist में जोड़ना होगा।
शैलेश

11

यहां एक अन्य ऐप के भीतर से एप्लिकेशन लॉन्च करने के लिए एक अच्छा ट्यूटोरियल है:
आईओएस एसडीके: URL स्कीम के साथ काम करना
और, मनमाने ढंग से एप्लिकेशन लॉन्च करना संभव नहीं है, लेकिन उन मूल एप्लिकेशन, जिन्होंने URL स्कीम को पंजीकृत किया है ।


9

इसे प्राप्त करने के लिए हमें दोनों App में कोड की कुछ लाइन जोड़ने की आवश्यकता है

ऐप ए: जिसे आप दूसरे ऐप से खोलना चाहते हैं। (स्रोत)

App B : App B से आप App A (गंतव्य) खोलना चाहते हैं

ऐप ए के लिए कोड

App A के Plist में कुछ टैग जोड़ें, App A के Open Plist Source और 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 
}

अब आ रहा है बी बी कोड -

अगर आप बिना किसी इनपुट पैरामीटर के सिर्फ ऐप ए को खोलना चाहते हैं

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

        }
}

नोट: आप App को केवल testApp.linking के साथ भी खोल सकते हैं : //? सफारी ब्राउज़र पर


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 स्कीम का उपयोग करके ऐप खोल पाएंगे।

लॉन्चमे नामक डॉक्स में एक बहुत अच्छा उदाहरण उपलब्ध है जो इसे प्रदर्शित करता है।

6 नवंबर 2017 तक लॉन्चमे सैंपल कोड


अद्यतन उत्तर। आशा है कि मदद करता है
खोया

धन्यवाद; किसी भी संयोग से, क्या आप iOS डेवलपर फैमिली चैट रूम में हैं?
Eenvincible

4

नहीं यह नहीं। प्रलेखित URL हैंडलर्स के अलावा, किसी अन्य ऐप के साथ संचार / लॉन्च करने का कोई तरीका नहीं है।


3

मैंने कुछ समय पहले भी इसकी कोशिश की थी ( आइडेंटिफिकेशन के साथ iPhone एप्लिकेशन लॉन्च करें ), लेकिन निश्चित रूप से ऐसा करने के लिए कोई डॉक्यूमेंटेड तरीका नहीं है। :)


2
यह प्रलेखित है ... Apple दस्तावेज़ीकरण की जाँच करें। developer.apple.com/library/IOs/#documentation/iPhone/…
मोसजी

1
मुझे पता है कि URL योजनाएँ संभव हैं, लेकिन मैंने अपने प्रश्न में क्या पूछा था और जेफ़ ने क्या पूछा था, ऐसे ऐप्स कैसे खोलें जो url योजनाओं का समर्थन न करें ...
foebe

3

स्विफ्ट 4.1 और एक्सकोड 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
    }
}

महान, यह मदद करता है। अब सोर्स ऐप से डेस्टिनेशन ऐप तक का तर्क कैसे पास करें?
विग्नेश्वरन एक

2

इस विषय के बारे में एक नोट ...

प्रोटोकॉल के लिए 50 अनुरोध की सीमा है जो पंजीकृत नहीं हैं।

इस चर्चा में सेब का उल्लेख है कि एक ऐप के विशिष्ट संस्करण के लिए आप केवल canOpenUrlसीमित संख्या में क्वेरी कर सकते हैं और अघोषित योजनाओं के लिए 50 कॉल के बाद विफल हो जाएंगे। । मैंने यह भी देखा है कि यदि प्रोटोकॉल को एक बार जोड़ दिया जाता है, तो आप इस असफल स्थिति में प्रवेश कर जाते हैं तो भी यह विफल हो जाएगा।

इस बारे में अवगत रहें, किसी के लिए उपयोगी हो सकता है।


0

इसके लिए @ villy393 उत्तर का स्विफ्ट 3 त्वरित और पेस्ट संस्करण:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.