iOS應用程式開發之應用間的跳轉(用著等第三方分享登陸),ios跳轉
一、簡介
最實際項目開發中,我們難免會遇到需要從一個應用跳轉到另一個應用的情況。比如分享,實際就是一種應用間的跳轉。但是有時候我們需要實現自己的兩個應用間的跳轉,以便可以推廣我們其他的應用。這個時候我們需要使用UIApplication的openURL:的方法
二、配置
️註冊自訂的URL
首先被啟動的應用需要向iPhone註冊一個自訂URL協議。這是在你的專案檔夾的info.plist檔案進行的
1. 右鍵,選擇“Add Row”, Key值選擇“URL types”
2. 開啟“Item 0″,然後為該key增加一個URL identifier。可以是任何值,但建議用“反網域名稱”(例如 “com.open.url”)。
3. 在“Item 0”下再加一行。
4. 選擇“URL Schemes” 作為Key。
5. 輸入你的URL協議名 (例如“openurl1://” 應寫做“openurl”)。如果有必要,你可以在這裡加入多個協議。
圖解:
️代碼部分(在另外的程式中)
- (void)viewDidLoad{ [super viewDidLoad]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame = CGRectMake(100, 100, 120, 50); [btn setTitle:@"測試123" forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; btn.titleLabel.font = [UIFont systemFontOfSize:14.0]; [btn setBackgroundColor:[UIColor redColor]];; [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn];}- (void)btnClick{ NSURL * myURL_APP_A = [NSURL URLWithString:@"openurl1://"]; if ([[UIApplication sharedApplication] canOpenURL:myURL_APP_A]) { NSLog(@"canOpenURL"); [[UIApplication sharedApplication] openURL:myURL_APP_A]; }}
三、判斷應用的啟動方式
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
通過AppDelegate裡面的回調方法,可以確定應用的啟動方式。launchOptions包含了我們需要的參數
說明:當應用程式啟動時執行,應用程式啟動入口。只在應用程式啟動時執行一次。application參數用來擷取應用程式的狀態、變數等,值得注意的是字典參數:(NSDictionary *)launchOptions,該參數儲存程式啟動的原因。
1.若使用者直接啟動,lauchOptions內無資料;
2.若由其他應用程式通過openURL:啟動,則UIApplicationLaunchOptionsURLKey對應的對象為啟動URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey對應啟動的源應用程式的bundle ID (NSString);
3.若由本地通知啟動,則UIApplicationLaunchOptionsLocalNotificationKey對應的是為啟動應用程式的的本地通知對象(UILocalNotification);
4.若由遠程通知啟動,則UIApplicationLaunchOptionsRemoteNotificationKey對應的是啟動應用程式的的遠程通知資訊userInfo(NSDictionary);
其他key還有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,
UIApplicationLaunchOptionsNewsstandDownloadsKey。 如果要在啟動時,做出一些區分,那就需要在下面的代碼做處理。 比如:應用可以被某個其它應用調起(作為該應用的子應用),要實現單點登入,那就需要在啟動代碼的地方做出合理的驗證,並跳過登入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ NSLog(@"%@", launchOptions); NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]; if(url){} NSString *bundleId = [launchOptions objectForKey:UIApplicationLaunchOptionsSourceApplicationKey]; if(bundleId){} UILocalNotification * localNotify = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; if(localNotify){} NSDictionary * userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if(userInfo){} return YES;}
最後補充一點,在開發中iOS 9 以上會出現canOpenURL: failed for URL: "ABC://app/*******/" - error: "This app is not allowed to query for scheme ABC"的錯誤,
由於IOS加入對使用者隱私以及禁止掃描系統資訊的控制,目前通過canOpenURL的方法來判斷使用者是否安裝特定app,則會出現-canOpenURL: failed for URL: "ABC://app/*******/" - error: "This app is not allowed to query for scheme ABC"的錯誤,
同時也返回NO,直接通過openUrl也是沒有反應。具體原因可以參考文章:Quick Take on iOS 9 URL Scheme Changes。
修改起來很簡單,只需要在plist中加入ABC的白名單即可,如:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>ABC</string>
</array>