1. 程式人生 > >IOS 在一個應用裡開啟另一個應用 及其 兩個應用互相呼叫

IOS 在一個應用裡開啟另一個應用 及其 兩個應用互相呼叫

最近要在IOS中實現一個應用啟動另外一個應用的功能,搜了一些資料,使用UIApplication的openURL:的方法就能實現,現在整理和大家分享一下!

註冊自定義URL協議

首先被啟動的應用需要向iPhone註冊一個自定義URL協議。這是在你的專案資料夾的info.plist檔案進行的(就是你改變應用程式圖示的同一個檔案)。
Step1. 右鍵,選擇“Add Row”Step2. Key值選擇“URL types”
Step3. 開啟“Item 0″,然後為該key增加一個URL identifier。可以是任何值,但建議用“反域名”(例如 “com.fcplayer.testHello”)。
Step4. 在“Item 0”下再加一行。
Step5. 選擇“URL Schemes” 作為Key。
Step6. 輸入你的URL協議名 (例如“testHello://” 應寫做“testHello”)。如果有必要,你可以在這裡加入多個協議。
操作截圖如下:

訪問自定義URL

在主應用程式中通過訪問自定義URL啟動另外一個應用:

  1. NSURL * myURL_APP_A = [NSURL URLWithString:@"testHello://"];  
  2. if ([[UIApplication sharedApplication] canOpenURL:myURL_APP_A]) {  
  3.     NSLog(@"canOpenURL");  
  4.     [[UIApplication sharedApplication] openURL:myURL_APP_A];  
  5. }  

自定義處理URL

有些時候我們除了啟動還需向另外一個應用傳送引數,這是也可以通過自定義的URL來實現,如:

testHello://
testHello://com.fcplayer.testHello
testHello://config=1&abar=2

這時我們在被啟動應用中就必須進行自定義處理,在delegate中實現該訊息(Cocos2d加在AppDelegate中),例如:
- (BOOL)application:(UIApplication *)applicationhandleOpenURL:(NSURL*)url {   // Do something withthe url here }

通常,我們會從引數中解析出URL以便在檢視中顯示或者儲存到UserPreference。下面的例子把URL儲存為User Preference的url變數中或者打印出來:

  1. -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
  2. {  
  3.     if (!url) {  return NO; }  
  4.     NSString *URLString = [url absoluteString];  
  5.     NSLog(@"%@",URLString);  
  6.     //[[NSUserDefaults standardUserDefaults] setObject:URLString forKey:@"url"];
  7.     //[[NSUserDefaults standardUserDefaults] synchronize];
  8.     return YES;  
  9. }  

其他

基本上至此我們就已經實現一個應用程式中啟動另外一個應用的功能,但是為了是我們的程式碼更加強壯,我在網上又找了一段訪問程式碼,如下:

  1. // 檢查使用者是否配置了AppId
  2. // 有沒有準確配置Info的CFBundleURLSchemes欄位
  3. // 是不是可以正確開啟
  4. if (!kAppId) {  
  5.     UIAlertView *alertView = [[UIAlertView alloc]  
  6.                               initWithTitle:@"Setup Error"
  7.                               message:@"Missing app ID. You cannot run the app until you provide this in the code."
  8.                               delegate:self  
  9.                               cancelButtonTitle:@"OK"
  10.                               otherButtonTitles:nil,  
  11.                               nil];  
  12.     [alertView show];  
  13.     [alertView release];  
  14. else {  
  15.     // Now check that the URL scheme fb[app_id]://authorize is in the .plist and can
  16.     // be opened, doing a simple check without local app id factored in here
  17.     NSString *url = [NSString stringWithFormat:@"fb%@://authorize",kAppId];  
  18.     BOOL bSchemeInPlist = NO; // find out if the sceme is in the plist file.
  19.     NSArray* aBundleURLTypes = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"];  
  20.     if ([aBundleURLTypes isKindOfClass:[NSArray class]] &&  
  21.         ([aBundleURLTypes count] > 0)) {  
  22.         NSDictionary* aBundleURLTypes0 = [aBundleURLTypes objectAtIndex:0];  
  23.         if ([aBundleURLTypes0 isKindOfClass:[NSDictionary class]]) {  
  24.             NSArray* aBundleURLSchemes = [aBundleURLTypes0 objectForKey:@"CFBundleURLSchemes"];  
  25.             if ([aBundleURLSchemes isKindOfClass:[NSArray class]] &&  
  26.                 ([aBundleURLSchemes count] > 0)) {  
  27.                 NSString *scheme = [aBundleURLSchemes objectAtIndex:0];  
  28.                 if ([scheme isKindOfClass:[NSString class]] &&  
  29.                     [url hasPrefix:scheme]) {  
  30.                     bSchemeInPlist = YES;  
  31.                 }  
  32.             }  
  33.         }  
  34.     }  
  35.     // Check if the authorization callback will work
  36.     BOOL bCanOpenUrl = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString: url]];  
  37.     if (!bSchemeInPlist || !bCanOpenUrl) {  
  38.         UIAlertView *alertView = [[UIAlertView alloc]  
  39.                                   initWithTitle:@"Setup Error"
  40.                                   message:@"Invalid or missing URL scheme. You cannot run the app until you set up a valid URL scheme in your .plist."
  41.                                   delegate:self  
  42.                                   cancelButtonTitle:@"OK"
  43.                                   otherButtonTitles:nil,  
  44.                                   nil];  
  45.         [alertView show];  
  46.         [alertView release];  
  47.     }  
  48. }  

另外還有一段啟動其他應用的程式碼:

  1. -(IBAction)openMaps {//開啟地圖
  2.     // Where is Apple on the map anyway?
  3.     NSString* addressText = @”1 Infinite Loop, Cupertino, CA 95014″;  
  4.     // URL encode the spaces
  5.     addressText =  [addressText stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];  
  6.     NSString* urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", addressText];  
  7.     // lets throw this text on the log so we can view the url in the event we have an issue
  8.     NSLog(urlText);  
  9.     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];  
  10.     }  
  11.     -(IBAction)openEmail {//開啟mail
  12.     // Fire off an email to apple support
  13.     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://[email protected]"]];  
  14.     }  
  15.     -(IBAction)openPhone {//撥打電話
  16.     // Call Google 411
  17.     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];  
  18.     }  
  19.     -(IBAction)openSms {//開啟簡訊
  20.     // Text to Google SMS
  21.     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://466453"]];  
  22.     }  
  23.     -(IBAction)openBrowser {//開啟瀏覽器
  24.     // Lanuch any iPhone developers fav site
  25.     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunesconnect.apple.com"]];  
  26. }  
分類: IOS 273人閱讀 評論(1) 收藏 舉報

1、新建兩個專案:AppOne,AppTwo;

2、分別在其屬性列表中新增如下:

AppOwn:


AppTwo:


3、分別實現程式碼:

AppOwn的 viewController.m 中新增程式碼:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

NSURL *url  = [NSURLURLWithString:@"AppTwo:"];

if ([[UIApplicationsharedApplicationcanOpenURL:url])

    {

NSLog(@"canOpenURL");

        [[UIApplicationsharedApplicationopenURL:url];

    } else

    {

NSLog(@"can not OpenURL");

    }

}


AppTwn的 viewController.m 中新增程式碼:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

NSLog(@"touchesBegan");

NSURL *url  = [NSURLURLWithString:@"AppOne:"];

if ([[UIApplicationsharedApplicationcanOpenURL:url])

    {

NSLog(@"canOpenURL");

        [[UIApplicationsharedApplicationopenURL:url];

    } else

    {

NSLog(@"can not OpenURL");

    }

}


4、分別執行下兩個專案,然後無論把其中一個專案程序殺掉,或者使其進入休眠,都可以通過另一個專案來開啟另一個專案。


相關推薦

IOS一個應用開啟一個應用 及其 應用互相呼叫

最近要在IOS中實現一個應用啟動另外一個應用的功能,搜了一些資料,使用UIApplication的openURL:的方法就能實現,現在整理和大家分享一下! 註冊自定義URL協議 首先被啟動的應用需要向iPhone註冊一個自定義URL協議。這是在你的專案資料夾的info.plist檔案進行的(就是你改變應用程

IOS一個應用裏打開一個應用 及其 應用互相調用

程序 get cocos cat mark fin 屬性列表 RKE forkey 在IOS應用中打開另外一個應用的解決方案 最近要在IOS中實現一個應用啟動另外一個應用的功能,搜了一些資料,使用UIApplication的openURL:的方法就能實現,現在整理和大家分

c#在一個視窗中開啟一個視窗

1、今天功能需要,開啟新的視窗,這裡簡單記錄下2、實現機制,在主程式開啟第一個視窗,在第一個窗口裡面寫入觸發事件,開啟另一個視窗,並隱藏當前視窗3、實現程式碼段    建立兩個視窗 分別為  setParams 和 main    在主程式中預設開啟setParams視窗  

C# 中隱藏一個窗體後開啟一個窗體,使用Show()和Hide()方法

新建兩個窗體Form1 和Form2 ; Form1 中的按鈕 的單擊事件方法裡面的程式碼; Form2 fm2= new Form2(this); fm2.Show(); this.Hide(); Form2 窗體裡面的程式碼; Form1 fm1 = new Fo

C#在一個視窗中開啟一個視窗,同時關閉該視窗

C#程式設計時,經常會遇到處理兩個或多個視窗的問題。以登入視窗為例,當登入視窗登入驗證成功後,要進入主視窗,此時需要關閉登入視窗,這時候用this.close()是不可以的。因為Program.cs中          static void Main()        

js關閉一個視窗並開啟一個視窗

<!DOCTYPE html> <html><head><meta charset="UTF-8"><title></title><script type="text/javascript">

關於js物件中函式互相呼叫,其中一個為定時器宣告,定時器迴圈報錯問題(記錄一次嘗試新寫法的報錯經歷)附帶無縫輪播圖程式碼

先上之前的錯誤程式碼吧,注意計時器這個方法(是想把之前寫的的輪播圖演示重構一下) var obj = { sleepTime: 2000,//輪播延時 cont: 0,//第幾張 origin: document.getElementsByClassName('main-

關於js物件中函式互相呼叫,其中一個為定時器宣告,定時器迴圈報錯問題(記錄一次嘗試新寫法的報錯經歷)

先上之前的錯誤程式碼吧(是想把之前寫的的輪播圖demo重構一下) var obj = { sleepTime: 2000,//輪播延時 cont: 0,//第幾張 origin: document.getElementsByClassName('ma

VC開啟一個應用程式

要在應用程式中啟動其他的應用程式,有3個函式可以使用,下面我一一說說他們(我以開啟D:\Program Files\zeecalls\目錄下的zeecalls.exe應用程式為例): 1、Winexec 這個函式最簡單,只有兩個引數,原型如下: UINT WinExec(

iOS中如何撥出一個應用

        我們經常會遇到在一個應用裡面撥出另一個應用的需求,比如在文件裡面點選地址,呼叫safari來開啟網頁;比如在檔案瀏覽器裡面點選某種檔案,自動啟用一個應用來開啟檔案。         iOS裡面對於這樣的需求使用URL來實現,把其他的應用看成一種資源,本質上就

iOS一個app開啟一個app

第一步:對B操作(對B的info.plist中自定義url types) 注意, 這裡的URL Schemes必填, URL identifier選填。 另外,URL Schemes建議都小寫,由於之後接收到資料的時候,不區分大寫和小寫, 都是轉為小寫。 規定的格式是   URL Schemes://

APP內開啟一個APP(URL Scheme與openURL)【iOS開發】

目標 平常我們做iOS開發,會經常遇到開啟其他的APP的功能。本篇文章講的就是開啟別人的APP的一些知識。我們的目標是: 開啟別人的APP讓別人開啟我們的APPiOS9的適配問題使用URL Schemes傳遞資料 準備工作 建立一個名為OpenApp的工作空間,用來存放

android 在一個應用中啟動一個應用

在程式開發過程當中,常遇到需要啟動另一個應用程式的情況,比如在點選軟體的一個按鈕可以開啟地圖軟體。 如果既有包名又有主類的名字,那就好 辦了, 直接像下面就行: [html]  Intent intent = new Intent(Intent.ACTION_MAIN

iOS開發】開啟一個APP(URL Scheme與openURL)

目標平常我們做iOS開發,會經常遇到開啟其他的APP的功能。本篇文章講的就是開啟別人的APP的一些知識。我們的目標是:開啟別人的APP讓別人開啟我們的APPiOS9的適配問題使用URL Schemes傳遞資料準備工作建立一個名為OpenApp的工作空間,用來存放我們的兩個工程建立這個工作空間主要是為了讓我們後

微信小程式開發——開啟一個小程式

微信小程式開啟另一個小程式,有兩種方法:1.超連結;2.點選按鈕。 全域性配置: 跳轉到其他小程式,需要在當前小程式全域性配置中配置需要跳轉的小程式列表,程式碼如下: App.json { ... "navigateToMiniProgramAppIdList": [ "w

關於 C#呼叫一個C/C++dll庫執行時實現多應用(靜態變數區分) 的解決方法

需求         VS編寫了純C(windows)通訊庫,需要多例項(靜態變數標誌一個例項,達到互相靜態變數不干涉)。   當前問題         dll中使用了全域性static的標

(親測解決)每次開啟excel檔案都會出現視窗,一個是空白的sheet1,一個是自己的文件

轉載:https://blog.csdn.net/sinat_34104446/article/details/80210424 一、問題描述 每次開啟Excel(WPS、Office都會出現,當前版本是Office2016)檔案都會出現兩個視窗,一個是空白的sheet

c#一個視窗中載入一個視窗的方法

不囉嗦,直接上程式碼,主窗體用一個public_panel來放另一個窗體AntennaCheck(窗體名),放在任意的地方,可以用button觸發,也可以在載入主窗體的時候同時出現,有人或許會問,為什麼要增加一個窗體,懟他曰:程式碼號管理唄!            An

每次開啟excel檔案都會出現視窗,一個是空白的sheet1,一個是自己的文件

本地安裝完mysql之後,每次開啟excel檔案都會出現兩個視窗,一個是空白的sheet1。仔細回想了下,之前沒有這種問題,在網上找了篇文章,按照步驟操作之後居然真的解決了問題,特轉發以下。 https://blog.csdn.net/sinat_34104446/article/details

通過頁面點選呼叫開啟一個頁面的js

  //頁面跳轉     $("#btnMajorYarn").on("click", function () {         pageOpen(           &nbs