IOS應用程序間相互跳轉 與 傳值

閱讀本文以前建議參考:<Communicating with Other App程序間通訊[翻譯]>
在IOS中,實如今app1中打開app2,方法以下:
1,在app2中註冊一個URL Schemes
註冊的方法很簡單,在XXX-info.plist文件中新增一個URL types數組元素,取一個名字,好比"tekuba_net".或者在工程的-TARGETS-Info,中找到URL Types添加一個URL Schemes,名爲"tekuba_net".
2,在app1中打開app2
在app1中適當的位置執行:[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@「tekuba_net://"]]便可。
在app2中實現appDelegate中實現兩個方法:
(1)在IOS4.2或者以後的版本,使用application:openURL:sourceApplication:annotation;
(2)在IOS4.1或者更早期的版本使用application:handleOpenURL:
(3)使用 application:willFinishLaunchingWithOptions: 或application:didFinishLaunchingWithOptions:方法接收URL信息並決定是否打開它。若是返回NO,您的應用的 URL處理不會被喚醒.有待確認
另外使用:[[UIApplication sharedApplication] openURL:url]方法中的url的格式不固定,只要知足tekuba_net://這種格式就行,好比tekuba_net://argument?=1等,而在app2中的application:openURL:sourceApplication:annotation代理中能夠獲取該url信息,所以能夠約定一種格式的url來進行應用間傳參。
轉載請註明來自特酷吧,本文地址:http://www.tekuba.net/program/305/php

 

 

 

 

 

 

 

1、調用系統應用html

 
 
一、調用app store界面方法
在實際開發中,每每要推薦本身其餘應用和推薦本身的收費軟件,那麼咱們就須要在程序中直接鏈接到app store的相應頁面。
 
實際上的作法很簡單,使用的仍是UIApplication類的OpenURL方法: 
 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"程序的相應鏈接"]];
 
 
 
 
一、調用其它應用的方法
1)調用 自帶mail

 
 
[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"mailto://admin@hzlzh.com"]];
 
 
2)調用 電話phone

 
[[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"tel://8008808888"]];

 
 
3)調用 SMS
 

[[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];

 
4)調用自帶 瀏覽器 safari
 

[[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"http://www.hzlzh.com"]];
 
5)調用 Remote
 

[[UIApplicationsharedApplication] openURL:[NSURL URLWithString:@"remote://fff"]];
 
 
 
 

 

 
 
2、調用本身開發的應用
 
 
1)在plist文件中,註冊對外接口
 
    在xcode group&files 裏面,展開 resources選擇<app>info.plist
 
   鼠標右擊information property list ,而後從列表中選擇URL types 
 
    右擊 add row 添加一個對象(item)右擊item add row  
 
    從列表中選擇 URL  Schemes 再右擊添加一個對象(item1)
 
    將item1得值設置爲:myapp
 
    這個myapp就是對外接口,其它應用能夠經過它,調用該應用
 
   plist以下圖所示:
 
  \
 
2)調用方法
 
   在你須要調用上面註冊過對外接口的應用中,添加下面代碼便可:   
 
 
  NSURL *url  = [NSURL URLWithString:@"myapp:"];
 
  [[UIApplication sharedApplication] openURL:url];
 
 
 
 
  經過上述兩個步驟,你能夠在你的應用中,讓用戶打開你的其它應用。
 
  若是加參數的話,最好寫成@"myapp://.........",就比如http請求的「http」換成@「myapp」.
 
 
 
 
3)處理URL請求
 
應用程序委託在application:handleOpenURL:方法中處理傳遞給應用程序的URL請求。若是您已經爲本身的應用程序註冊了定製的URL模式,則務必在委託中實現這個方法。
 
基於定製模式的URL採用的協議是請求服務的應用程序可以理解的。URL中包含一些註冊模式的應用程序指望獲得的信息,這些信息是該程序在處理或響應URL請求時須要的。傳遞給application:handleOpenURL:方法的NSURL對象表示的是Cocoa Touch框架中的URL。NSURL遵循RFC 1808規範,該類中包含一些方法,用於返回RFC 1808定義的各個URL要素,包括用戶名、密碼、請求、片段、和參數字符串。與您註冊的定製模式相對應的「協議」可使用這些URL要素來傳遞各類信息。
 
在程序清單1-2顯示的application:handleOpenURL:方法實現中,傳入的URL對象在其請求和片段部分帶有具體應用程序的信息。應用程序委託抽出這些信息—在這個例子中,是指一個to-do任務的名稱和到期日—並根據這些信息建立應用程序的模型對象。
 
[plain]
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {  
    if ([[url scheme] isEqualToString:@"myapp"]) {  
        //處理連接  
          
        return YES;  
    }  
      
    return NO;  
}  
 
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    if ([[url scheme] isEqualToString:@"myapp"]) {
        //處理連接
        
        return YES;
    }
    
    return NO;
}
請務必對傳入的URL輸入進行驗證。若是您但願瞭解如何避免URL處理的相關問題,請參見安全編碼指南文檔中的驗證輸入部分。若是要了解蘋果定義的URL模式,請參見蘋果的URL模式參考
 
 
第二種處理URL請求方法
[cpp]
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
{  
    //被其餘應用調用   
    NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];  
    if(url) {//作出相應的判斷   
        if ([[url scheme] isEqualToString:@"myapp"]) {  
            //處理連接   
        }  
    }  
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  
    // Override point for customization after application launch.   
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];  
    self.window.rootViewController = self.viewController;  
    [self.window makeKeyAndVisible];  
    return YES;  
}  
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //被其餘應用調用
    NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
    if(url) {//作出相應的判斷
        if ([[url scheme] isEqualToString:@"myapp"]) {
            //處理連接
        }
    }
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}說明:iOS 程序啓動時總會調用application:didFinishLaunchingWithOptions:,其中第二個參數launchOptions爲NSDictionary類型的對象,裏面存儲有此程序啓動的緣由。
 
launchOptions中的可能鍵值見UIApplication Class Reference的Launch Options Keys節 。
 
若用戶直接啓動,lauchOptions內無數據;
若由其餘應用程序經過openURL:啓動,則UIApplicationLaunchOptionsURLKey對應的對象爲啓動URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey對應啓動的源應用程序的bundle ID (NSString);
若由本地通知啓動,則UIApplicationLaunchOptionsLocalNotificationKey對應的是爲啓動應用程序的的本地通知對象(UILocalNotification);
若由遠程通知啓動,則UIApplicationLaunchOptionsRemoteNotificationKey對應的是啓動應用程序的的遠程通知信息userInfo(NSDictionary);
其餘key還有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
UIApplicationLaunchOptionsNewsstandDownloadsKey。
參考:http://blog.csdn.net/tiger119/article/details/7949004
 
 
4).快速測試外部調用
1.回到Home屏幕,啓動Safari(在iPhone仿真器上,在菜單上選擇Hardware->Home命令就能夠回到Home屏幕)。
2.在Safari的地址欄中,鍵入使用定製模式的URL,即「myapp:」,加參數的話則爲「myapp://........」
3.確認您的應用程序是否啓動,以及應用程序委託是否收到application:handleOpenURL:消息。
 
3、官方原理講解
 
 
和其它應用程序進行通信
若是一個應用程序支持一些已知類型的URL,您就能夠經過對應的URL模式和該程序進行通信。然而,在大多數狀況下,URL只是用於簡單地啓動一個應用程序並顯示一些和調用方有關的信息。舉例來講,對於一個用於管理地址信息的應用程序,您就能夠在發送給它的URL中包含一個Maps程序能夠處理的地址,以便顯示相應的位置。這個級別的通信爲用戶創造一個集成度高得多的環境,減小應用程序從新實現設備上其它程序已經實現的功能的必要性。
蘋果內置支持http、mailto、tel、和sms這些URL模式,還支持基於http的、指向Maps、YouTube、和iPod程序的URL。應用程序也能夠本身註冊定製的URL模式。您的應用程序能夠和其它應用程序通信,具體方法是用正確格式的內容建立一個NSURL對象,而後將它傳給共享UIApplication對象openURL:方法。openURL:方法會啓動註冊接收該URL類型的應用程序,並將URL傳給它。當用戶最終退出該應用程序時,系統一般會從新啓動您的應用程序,但並不老是這樣。系統會考慮用戶在URL處理程序中的動做及在用戶看來返回您的應用程序是否合理,而後作出決定。
 
下面的代碼片段展現了一個程序如何請求另外一個程序提供的服務(假定這個例子中的「todolist」是由應用程序註冊的定製模式):
 
NSURL *myURL = [NSURL URLWithString:@"todolist://www.acme.com?Quarterly%20Report#200806231300"]; 
[[UIApplication sharedApplication] openURL:myURL]; 
 
要提示:若是您的URL類型包含的模式和蘋果定義的同樣,則啓動的是蘋果提供的程序,而不是您的程序。若是有多個第三方的應用程序註冊處理一樣的URL模式,則該類型的URL由哪一個程序處理是沒重要提示:若是您的URL類型包含的模式和蘋果定義的同樣,則啓動的是蘋果提供的程序,而不是您的程序。若是有多個第三方的應用程序註冊處理一樣的URL模式,則該類型的URL由哪一個程序處理是沒有定義的。 
 
若是您的應用程序定義了本身的URL模式,則應該實現對該模式進行處理的方法,具體信息在「實現定製的URL模式」部分中進行描述。有關係統支持的URL處理,包括如何處理URL的格式,請參見蘋果的URL模式參考。
 
 
 
 
實現定製的URL模式
您能夠爲本身的應用程序註冊包含定製模式的URL類型。定製的URL模式是第三方應用程序和其它程序及系統進行交互的機制。經過定製的URL模式,應用程序能夠將本身的服務提供給其它程序。
 
 
 
 
註冊定製的URL模式
在爲您的應用程序註冊URL類型時,必須指定CFBundleURLTypes屬性的子屬性,咱們已經在「信息屬性列表」部分中介紹過這個屬性了。CFBundleURLTypes屬性是應用程序的Info.plist文件中的一個字典數組,每一個字典負責定義一個應用程序支持的URL類型。表1-6描述了CFBundleURLTypes字典的鍵和值。
 
 
 
 
表1-6  CFBundleURLTypes屬性的鍵和值 鍵
 值
 
CFBundleURLName
 這是個字符串,表示URL類型的抽象名。爲了確保其惟一性,建議您使用反向DNS風格的標識,好比com.acme.myscheme。
 
這裏提供的URL類型名是一個指向本地化字符串的鍵,該字符串位於本地化語言包子目錄中的InfoPlist.strings文件中。本地化字符串是人類可識別的URL類型名稱,用相應的語言來表示。
 
CFBundleURLSchemes
 這是個URL模式的數組,表示歸屬於這個URL類型的URL。每一個模式都是一個字符串。屬於指定URL類型的URL都帶有它們的模式組件。
 
 
圖1-7顯示了一個正在用內置的Xcode編輯器編輯的Info.plist文件。在這個圖中,左列中的URL類型入口至關於您直接加入到Info.plist文件的CFBundleURLTypes鍵。相似地,「URL identifier」和「URL Schemes」入口至關於CFBundleURLName和CFBundleURLSchemes鍵。
 
在Info.plist文件中定義一個定製的URL模式
 
 
 
 
您在對CFBundleURLTypes屬性進行定義,從而註冊帶有定製模式的URL類型以後,能夠經過下面的方式來進行測試:
 
連編、安裝、和運行您的應用程序。
 
回到Home屏幕,啓動Safari(在iPhone仿真器上,在菜單上選擇Hardware > Home命令就能夠回到Home屏幕)。
 
在Safari的地址欄中,鍵入使用定製模式的URL。
 
確認您的應用程序是否啓動,以及應用程序委託是否收到application:handleOpenURL:消息。

 

 

 

 

 

 

 

首先從Safari跳到APP數組

既然要想跳到你指定的APP,那麼就須要在你的APP中定義一個特殊的標示,也就是一個URL協議。xcode

定義URL協議的以下圖  TARGETS ——> info ——>URL Types——>添加一個URL協議瀏覽器

如圖 其中 URL Schemes 字段就是你這個APP的特殊標示,而 indentifier 字段是這個URL協議的標示。(一個APP能夠擁有多個URL協議)安全

下面的兩個字段可爲空。最後再運行一下你的APP。app

接下來就是見證奇蹟的時刻了框架

打開你模擬器中的Safari瀏覽器,在輸入在地址欄輸入: appABC://  編輯器

而後回車,結果就是你想要的。(是否是很簡單?)ide

有時候你可能須要在從Safari跳回到APP時傳一些參數,那麼又有什麼方法能夠接收這些參數呢?

在appdelegate.m文件中寫下以下方法

這個方法是系統自動調用的方法,意思是:若是APP是經過openURL打開的自動調用此方法。而參數 url 就是打開APP的特定的URL。 也就是上面的  appABC://  ,可是怎麼經過這個方法傳參呢?

答案就在URL中,你能夠在  appABC:// 後面加上任何你想要的字符參數,例如appABC://name:wanglei//name:lilei

至於如何把這些參數給解析出來,就看你怎麼處理了。

下面是  APP(A)跳轉APP(B)

前面說了他們之間的原理是同樣的,從Safari跳到APP是經過打開特定的URL,那麼從 APP(A)跳轉APP(B)是否是也要打開特定的URL呢?

答案是確定的,那麼怎麼打開這個特定的URL呢,其實在UIApplication裏面有這麼一個方法openURL,以下

[[UIApplication shareApplication] openURL:url]

參數URL爲APP(B)特定的URL協議所表示的URL(後面會附上demo)

至於對參數的處理同上

 

 

 

 

 

 

 

 

兩個APP之間的跳轉是經過[[UIApplication sharedApplication] openURL:url]這種方式來實現的。

1.首先設置第一個APP的url地址

mamicode.com,碼迷

2.接着設置第二個APP的url地址

mamicode.com,碼迷

 

3.須要跳轉的時候

NSString *urlString = [NSString stringWithFormat:@"AppJumpSecond://%@",textField.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];

我這裏將textField的文字也傳過去

一樣的,在第二個頁面也是如此

NSString *urlString = [NSString stringWithFormat:@"AppJumpFirst://%@",textField.text];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];

這樣就能相互跳轉了

4.處理傳過去的數據

在上面傳了textField的數據,接收時在AppDelegate的

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation方法裏。

在AppDelegate裏設置屬性

@property (nonatomic, strongRootViewController *rvc;

在didFinishLaunchingWithOptions方法裏添加

self.rvc = [[RootViewController alloc] init];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self.rvc];
self.window.rootViewController = nc;

添加代碼塊

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    self.rvc.textField.text = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return YES;
}

使得textField顯示另外一個頁面傳過來的數據。

 

 

下面是APP(A)與APP(B)相互跳到轉的demo

 

http://download.csdn.net/detail/u012884714/7679105

 

 

 

目標應用程序:
打開info.plist,添加一項URL types
展開URL types,再展開Item1,將Item1下的URL identifier修改成URL Scheme
展開URL Scheme,將Item1的內容修改成myapp
其餘程序可經過myapp://訪問此自定義URL
 
要跳轉至myapp的應用程序:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myapp://"]];

 

 

 

 

iOS開發拓展篇—應用之間的跳轉和數據傳

說明:本文介紹app如何打開另外一個app,而且傳遞數據。

1、簡單說明

新建兩個應用,分別爲應用A和應用B.

實現要求:在appA的頁面中點擊對應的按鈕,可以打開appB這個應用。

1.新建兩個應用,分別爲A和B.

   

2.設置應用B的url。

3.在應用A中編寫打開app的代碼

點擊以後,會跳轉到新的控制器。

注意:打開應用B的過程當中,B有兩種狀態。

第一種狀態:B並無啓動,那麼會啓動B。並調用下面的方法。

第二種狀態:此時B已經啓動了,可是在後臺運行,這個時候不會調用該方法。

 

二:說明

若是一個應用被另一個應用打開,那麼會調用下面的代理方法,且在該方法中能夠實現兩個應用之間數據的傳遞。

代碼說明:

複製代碼
 1 #import "YYAppDelegate.h"
 2 
 3 @implementation YYAppDelegate
 4 
 5 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 6 {
 7     NSLog(@"didFinishLaunchingWithOptions---B");
 8     return YES;
 9 }
10 
11 //當一個應用程序被其餘程序打開的時候會調用這個方法,在該方法中能夠實現兩個應用程序間的數據局傳遞
12 -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
13 {
14     NSLog(@"%@",url);
15     NSLog(@"%@",sourceApplication);
16     return YES;
17 }
複製代碼
相關文章
相關標籤/搜索