APP跳轉 及iOS10跳轉在設置頁面

APP的跳轉: 通過[ [UIApplication sharedApplication] openURL:url]這種方法來實現的。

而APP之間傳遞數據接收是在AppDelegate里:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { }

方法里。




從APP跳轉至設置頁面

界面搭建:

通過storyBoard直接拖個按鈕 及 其響應事件


storyBoard創建按鈕


按鈕點擊響應事件:

- (IBAction)buttonTouch:(UIButton *)sender { }



iOS10之前的方法

當然可以直接跳轉到設置()頁面:
在“*- (IBAction)buttonTouch:(UIButton )sender { }”里面加上:

[[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] ];


環境: iPhone5s ( iOS8.1 )

效果:

iOS8 直接跳轉到設置(總)頁面

環境: iPhone6s ( iOS10.0.1 )

效果:iOS10以上 會跳轉 但是失敗,到了桌面上


會跳轉 但是失敗


“App-Prefs:root”操作 (請看文章 最后面)

貌似還有個方法:(在App內,需在前增加"App-")

  [[UIApplication sharedApplication] openURL:url參數  options:options字典參數  completionHandler:^(BOOL success) {
    
}];

自己按照網上說法:字典傳一個空字典“@{ }”,還是沒能實現iOS 10上跳轉至設置頁面的操作!?????? 最后使用了私有API實現的

道歉心聲:
對不起!!各位之前看我文章的小伙伴們!
由于自己技藝不精,加之當時項目很趕! 就沒能仔細研究(其實也不用仔細????????????),就使用了私有API!

其實“App-Prefs:root=Bluetooth”是可以實現跳轉的!!





URL Schemes

官方文檔:點擊進入
一篇中文介紹文章推薦:http://sspai.com/31500

  • URL,我們都很清楚,http://www.apple.com 就是個 URL,我們也叫它鏈接或網址;
  • Schemes,表示的是一個 URL 中的一個位置——最初始的位置,即 ://之前的那段字符。比如 http://www.apple.com 這個網址的 Schemes 是 “http”。

查找基本 URL Schemes:
越獄和不越獄本質上用的是同一種辦法,只是越獄以后可以直接從 iOS 查看 URL。
基本 URL Schemes 的查找方法可以通過 App 中的 info.plist 來查詢,分為越獄不越獄的方法,二者原理一樣!不細述了~

URL Scheme 就是實現跳轉URL協議的名稱(可以多個)。
而APP的跳轉就需要設置“URL Schemes”來實現:

添加“URL Types”,設置其“URL Schemes”

其中之后URL對象,會根據URL Scheme內容來創建!


在“- (IBAction)buttonTouch:(UIButton *)sender { }”里面加上:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=MUSIC"] ];


環境: iPhone5s ( iOS8.1 )

效果:

iOS8 跳轉到 音樂設置界面



在“- (IBAction)buttonTouch:(UIButton *)sender { }”里面加上:

 NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];

// 最好加上   ??判斷條件??
if ([ [UIApplication sharedApplication] canOpenURL:url])
{   // 看是否 允許跳轉
    [[UIApplication sharedApplication] openURL:url];
    
}


環境: iPhone5s ( iOS8.1 )

效果:

iOS8 跳轉到WiFi設置界面



????以下指令 分別跳轉到 對應頁面:(自己只翻譯一些 其他就自己去做了啦~~嘿嘿)

  prefs:root=General&path=About
 prefs:root=General&path=ACCESSIBILITY
 prefs:root=AIRPLANE_MODE
 prefs:root=General&path=AUTOLOCK
 prefs:root=General&path=USAGE/CELLULAR_USAGE
 prefs:root=Brightness    //打開Brightness(亮度)設置界面
 prefs:root=Bluetooth    //打開藍牙設置
 prefs:root=General&path=DATE_AND_TIME    //日期與時間設置
 prefs:root=FACETIME    //打開FaceTime設置
 prefs:root=General    //打開通用設置
 prefs:root=General&path=Keyboard    //打開鍵盤設置
 prefs:root=CASTLE    //打開iClound設置
 prefs:root=CASTLE&path=STORAGE_AND_BACKUP    //打開iCloud下的儲存空間
 prefs:root=General&path=INTERNATIONAL    //打開通用下的語言和地區設置
 prefs:root=LOCATION_SERVICES    //打開隱私下的定位服務
 prefs:root=ACCOUNT_SETTINGS
 prefs:root=MUSIC    //打開設置下的音樂
 prefs:root=MUSIC&path=EQ    //打開音樂下的均衡器
 prefs:root=MUSIC&path=VolumeLimit  //打開音樂下的音量
 prefs:root=General&path=Network    //打開通用下的網絡
 prefs:root=NIKE_PLUS_IPOD    
 prefs:root=NOTES    //打開設置下的備忘錄設置
 prefs:root=NOTIFICATIONS_ID    //打開設置下的通知設置
 prefs:root=Phone    //打開電話設置
 prefs:root=Photos    //打開設置下照片和相機設置
 prefs:root=General&path=ManagedConfigurationList    //打開通用下的描述文件
 prefs:root=General&path=Reset    //打開通用下的還原設置
 prefs:root=Sounds&path=Ringtone
 prefs:root=Safari    //打開設置下的safari設置
 prefs:root=General&path=Assistant    //打開siri不成功
 prefs:root=Sounds    //打開設置下的聲音設置
 prefs:root=General&path=SOFTWARE_UPDATE_LINK    //打開通用下的軟件更新
 prefs:root=STORE    //打開通用下的iTounes Store和App Store設置
 prefs:root=TWITTER    //打開設置下的twitter設置
 prefs:root=FACEBOOK    //打開設置下的Facebook設置
 prefs:root=General&path=USAGE    //打開通用下的用量
 prefs:root=VIDEO    
 prefs:root=General&path=Network/VPN        //打開通用下的vpn設置
 prefs:root=Wallpaper    //打開設置下的墻紙設置
 prefs:root=WIFI    //打開wifi設置
 prefs:root=INTERNET_TETHERING    






而在iOS10以上的系統,則不會 以上面的響應跳轉方法
且會報如下錯誤信息:

 -canOpenURL: failed for URL: "prefs:root=WIFI" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"







iOS10之后的方法:

(??不推薦??) 1.MobileCoreServices.framework 里的私有API


在iOS10之后,蘋果對APP權限問題更加重視!這時候要實現跳轉,就需要使用“MobileCoreServices.framework”里的私有API了。(我自己目前只找到這個辦法。。。)

其主要是使用了這個方法:

- (BOOL)openSensitiveURL:(id)arg1 withOptions:(id)arg2;



MobileCoreServices.frameworkAPI里面的查看“LSApplicationWorkspace.h”的URL地址:
https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/MobileCoreServices.framework/LSApplicationWorkspace.h


下載好“iOS10-Runtime-Headers”整個文件,還有其他功能自己可以慢慢使用!!
“iOS10-Runtime”的地址:https://github.com/JaviSoto/iOS10-Runtime-Headers


使用時,只需要往工程里拖入“MobileCoreServices.framework”就行了!

拖入 私有API成功 后 !多出的鏈接庫


iOS10的系統URL Scheme改成了首字母大寫,使用小寫的方式會無法打開。





網上說法 :
要先在 info.plist的LSApplicationQueriesSchemes項中添加一個Prefs的URL Schemes。

Plist文件設置【一】

Plist文件設置【二】

??最后發現不用設置Plist文件也實現了跳轉。
(可能是之前配置了“URL Types”的原因吧!??????還希望懂的朋友 指點一下!!!??????)
之前配置的“URL Types”






在“- (IBAction)buttonTouch:(UIButton *)sender { }”里面加上:

//注意??首字母改成了 ??大寫,prefs->Prefs
NSURL*right_url=[NSURL URLWithString:@"Prefs:root=Bluetooth"];
Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");

[[LSApplicationWorkspace performSelector:@selector(defaultWorkspace)] performSelector:@selector(openSensitiveURL:withOptions:) withObject:right_url withObject:nil];


環境: iPhone5s ( iOS8.1 )

效果:
iOS8 對私有API 并無任何反應

iOS8 對私有API無反應



環境: iPhone6s ( iOS10.0.1 )

效果:
卡頓是因為自己打了斷點,不要誤解了是使用了 私有API的問題~ ????

iOS10以上成功跳轉



??注意??:由于 使用私有API的APP 無法通過App Store審核。可以嘗試把私有類名和selector字符串混淆一下,繞過審核!!!!!

如下是用??ASCII混淆??的方法:

- (UIView *)statusBarView {
        UIView *statusBar = nil;
        NSData *data = [NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9];
        NSString *key = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
        id object = [UIApplication sharedApplication];
        if ([object respondsToSelector:NSSelectorFromString(key)]) {
            statusBar = [object valueForKey:key];
        }
        return statusBar;
    }


當然不建議使用私有API !! 由于其不可靠性,也許某天蘋果就可能直接把它移除了。
使用步驟:先判斷系統的版本,再考慮是否使用私有API



但是在iOS10以上,我找不到其他方法跳轉了!!希望有知道的朋友指點一下!!文章有什么紕漏之處,還望指出!(本話是當時寫的!現在回頭,啪啪打臉~~??)

(道歉心聲:之前一直沒空回過頭來復查本文!對之前的小伙伴表示抱歉!!
并真心謝謝那些評論的朋友們!!
)




??(推薦)2.App-Prefs:root??

iOS10支持的所有跳轉如下:(測試系統:10.0.1)
非常抱歉,之前自己走了彎路!!完全可以不使用私有API的!
????????????????????????????????????????????????????????

跳轉的URL寫法:
設置頁面 App-Prefs:root
(之前在那個設置頁面,就跳轉到相應的設置頁面)


無線局域網 App-Prefs:root=WIFI
藍牙 App-Prefs:root=Bluetooth
蜂窩移動網絡 App-Prefs:root=MOBILE_DATA_SETTINGS_ID
個人熱點 App-Prefs:root=INTERNET_TETHERING
運營商 App-Prefs:root=Carrier
通知 App-Prefs:root=NOTIFICATIONS_ID
通用 App-Prefs:root=General
通用-關于本機 App-Prefs:root=General&path=About
通用-鍵盤 App-Prefs:root=General&path=Keyboard
通用-輔助功能 App-Prefs:root=General&path=ACCESSIBILITY
通用-語言與地區 App-Prefs:root=General&path=INTERNATIONAL
通用-還原 App-Prefs:root=Reset
墻紙 App-Prefs:root=Wallpaper
Siri App-Prefs:root=SIRI
隱私 App-Prefs:root=Privacy
Safari App-Prefs:root=SAFARI
音樂 App-Prefs:root=MUSIC
音樂-均衡器 App-Prefs:root=MUSIC&path=com.apple.Music:EQ
照片與相機 App-Prefs:root=Photos
FaceTime App-Prefs:root=FACETIME


使用例子:

#define iOS10 ([[UIDevice currentDevice].systemVersion doubleValue] >= 10.0)
 //宏定義,判斷是否是 iOS10.0以上


NSString * urlStr = @"App-Prefs:root=Bluetooth";
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlStr]]) {
        if (iOS10) {
            //iOS10.0以上  使用的操作
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStr] options:@{} completionHandler:nil];
        } else 
        {
            //iOS10.0以下  使用的操作
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStr]];
        }
    }

//iOS10.0以上 ,使用的操作方法
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");

效果:

跳轉效果展示(環境:iPhone 6s、iOS 10.0.1)






最后示范一下**iPhone6s( iOS10.0.1 ) 對 各種方法 **的響應:

iOS10對各方法打斷點


1.不響應

  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=MUSIC"] ];


2.不滿足

 [[UIApplication sharedApplication] canOpenURL:url]

條件,故不會進入 if條件語句里

3.對私有API 才響應了。



當然也可以來來回回切換~~ 好無聊??????






應用之間的跳轉

在第一個APP中,做如下操作:
1.在info.plist文件中的“Information Property List”下添加一項:“URL types” ;
2.點開“URL types”下的“item 0”,再點開“item 0”,再將“item 0”下的URL identifier改為“URL Schemes” ;
3.點開“URL Schemes”下的“item 0”,在它后面添加“skipToOne”(“skipToOne”為第一個APP的跳轉標識,其實道理同 設置頁面 的跳轉

Plist配置


在第二個APP中,在需要跳轉到第一個APP的地方,添加以下代碼:

NSString *URLString = @"skipToOne://";
NSURL * url = [NSURL URLWithString:URLString];
[[UIapplication sharedApplication] openURL:url];

重新運行第二個APP,并且觸發跳轉到第一個APP的事件,就完成APP之間的跳轉了。





APP間的傳值

一. 首先實現APP間跳轉 的功能。

二. 之前跳轉功能的代碼,只需要稍作修改。

找到

NSString *aString = @"skipToOne://"

在上面這行代碼中的(skipOne://)后面,添加如下信息:

NSString *aString =[NSString stringWithFormat:@"skipToOne://username=%@&age=%@", @"goyohol", @"18"];


三. 在第一個APP的APPDelegate中:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    NSString *urlStr = [url absoluteString];  //轉化為 完整的url字符串 
    NSLog(@"%@",urlStr);

    return YES;
}

這樣就獲取到了urlStr字符串,之后就是自己根據需要的數據對里面的字符串進行處理。

以前項目有用到的!之后有空加上示例吧!!也不知道iOS 10之后有沒改過!!只知道iOS 10之后,APP不能跳轉到設置頁面!






Tips---使用“[[UIApplication sharedApplication] openURL: ]”其他功能:

撥打電話、發送郵件等等……

1.調用 電話(phone) 撥號

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://800888"]]; 
// 撥打電話時,不出現??確認框

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://800888"]]; 
// 撥打電話時,彈出??確認框


2.調用 自帶Mail

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@yourName.com"]]; 
//mailto后加自己賬戶


3.調用自帶 瀏覽器safari

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.apple.com"]]; 
// 填上 所要進入的網站即可


4.調用短信 SMS

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://10086"]]; 


5.調用 app Store

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://"]]; 


6.調用 iBook

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-books://"]]; 


7.調用 Map

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"maps://"]]; 


8.調用 Facetime ? 自己賬戶

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"facetime://"]]; 注意后面加上faceTime的賬號如:goyohol@qq.com


以下是常用APP的URL Schemes:
 “QQ”的url是 mqq:// 
 “微信”是 weixin:// 
 “淘寶”是 taobao:// 
 “點評”是 dianping://     dianping://search 
 “微博”是 sinaweibo:// 
 “名片全能王”是 camcard:// 
 “weico微博”是 weico:// 
 “支付寶”是 alipay:// 
 “豆瓣fm”是 doubanradio:// 
 “微盤”是 sinavdisk:// 
 “網易公開課”是 ntesopen://
 “美團”是 i**:// 
 “京東”是 openapp.jdmoble:// 
 “人人”是 renren:// 
 “我查查”是 wcc:// 
 “1號店”是 wccbyihaodian:// 
 “有道詞典”是 yddictproapp:// 
 “知乎”是 zhihu://
 “優酷”是  youku://


初次跳轉,會給予提示



??展示:跳轉至淘寶

NSString * urlString = @"taobao://";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString] ];

效果:

跳轉至 淘寶



以下為ipad版URL Schemes:

 ZAKER :【zakeripad://】
 mdict:【mdict://】
 京東hd:【openApp.jdiPad://】
 易迅:【wx6964eb0b10aa369b://】;【icson://】;【wap2app://】;【com51buyiPad://】;【sinaweibosso.2217266362://】;【yixunipad://】;
 wunderlist:【fb208559595824260://】;【wunderlist://】;
 1password:【db-0bcm217bz8olcxj://】;
 支付寶:【alipay://】;
 亞馬遜:【fb115829135094686://】;
 查找朋友:【grenada://】;【findmyfriends://】;【fmf1://】;
 查找iphone:【fmip1://】;
 homestyler:【fb110202249127916://】;
 百度旅游hd:【sinaweibosso.3772466956://】;
 百度視頻hd:【BaiduVideoiPad://】;【baiduvideoipadapp://】;
 百度相冊hd:【BaiDuCloudAlbumHD://】;
 百度音樂hd:【tencent100518384://】;【QQ05FDC9F0://】;【wxdeda8b7428c87b0b://】;【sinaweibosso.4257500584://】;【BaiduMusicHD://】;
 百度瀏覽器hd:【bdbrowser://】;
 百度文庫hd:【bdwenku://】;
 百度地圖hd:【sinaweibosso.675661989://】;
 百度云:【tencent100312028://】;
 一個one:【clover-one://】;
 launchpro:【launch://】;【launchpro://】;【launchpro-light://】;【launchpro-dial://】;【launchpro-tweet://】;【launchpro-brightness://】;【launchpro-messaging://】;【launchpro-email://】;【launchpro-dropbox://】;【launchpro-clipboard://】;【launchpro-facebook://】;【launchpro-sinaweibo://】;【launch-textexpander://】;【db-23algz5zbfx3ocs://】;【launchipad://】;
 當當hd:【dangdanghd://】;【ddhd://】;
 大眾點評hd:【dianpinghd://】;
 多看閱讀:【duokan-reader://】;
 藝龍旅行hd:【elongiPad://】;
 圈點hd:【skitch://】;
 食記hd:【wxb9a9141190826bd8://】;
 印象筆記hd:【enx://】;
 popAgraph:【popagraphtumblr://】;
 dropbox:【db-auth://】;【dbapi-1://】;【dbapi-2://】;【dbapi-3://】;【fb210019893730://】;
 goodreader:【ghttp://】;【ghttps://】;【grhttp://】;【grhttps://】;【giwhttp://】;【giwhttps://】;【gropen://】;【com.goodreader.sendtogr://】;
 houzz:【fb166981393359376://】;
 ifttt:【ifttt://】;
 名片全能王hd:【camcard://】;【fb444471182246461hdfull://】;【CamCardHDOpenAPI://】;
 萬年歷:【wx5f3a0d4653cd3485://】;
 拉手團購hd:【LaShouGroupHDPay://】;
 美團hd:【i**://】;
 evermemo:【evermemo://】;
 網易云課堂:【wangyiyunketang://】;
 網易公開課:【ntesopen://】;
 訂票助手2:【trainassistfree://】;
 pcalc lite:【pcalc://】;
 愛奇藝視頻:【QIYIHD-iPad://】;
 documents:【fb435446596521711://】;
 三國kill:【sgk://】;
 知乎日報hd:【wb2812384762://】;【wb801442902://】;【wx81bd672c6e11bad0://】;【QQ05FE6368://】;【tencent100557672://】;【pocketapp89757://】;
 扇貝新聞:【shanbaynews://】;
 扇貝單詞:【shanbay://】;
 扇貝單詞hd:【shanbaywordshd://】;
 扇貝煉句:【wx6cf98af31a47ba29://】;
 百詞斬:[wxce5d9e837051d623://】;
 微盤:【sinaweibosso.2938478327://】;【sinavdisksso.2938478327://】;
 新浪公開課:【wxa376b1970423b610://】;
 skype:【skype://】;
 什么值得買hd:【wxed08b6c4003b1fd5://】;
 搜狐視頻hd:【sohu-SViPad://】;【sohuvideohd://】;【wx91d741cfa16379bc://】;
 teamviewer:【teamviewer8://】;
 格志:【griddiary://】;【sumi-interactive://】;【db-d7wn1aiwz2ck3tj://】;
 淘寶hd:【taobao://】;【itaobao://】;【taobaohd://】;【wx25e5e60c1e9fcd97://】;【sinaweibosso.346252009://】;【zhuzhancaipiao4ipad://】;【laiwangc6e34c6bf://】;
 天貓:【tmall://】;
 騰訊視頻hd:【tenvideohd://】;【tenvideo2://】;
 qq通訊錄:【tencentappqqpim://】;
 qq:【mqqflyticket://】;
 微信:【weixin://】;【fb290293790992170://】;【wechat://】;
 同步推正版HD:【tbtui://】;【tuihd://】;
 航旅縱橫pro:【sinaweibosso.umetrip://】;【umetrippro://】;
 mathpad:【myscriptmathpad://】;
 下廚房:【wxd80665a1fc1bf282://】;
 無忌論壇:【wb801384327://】;【wxe932dc78276c3c24://】;【wb1315970163://】;
 雅虎天氣!:【yweather://】;
 一號店:【ipadstore://】;
 優酷hd:【youkuhd://】;
 知乎日報:【wx841a6aace4a1dca4://】;
 知乎:【zhihu://】;
 diesel facts:【dk.publishonline.dieselfacts.china://】;【dps.9aebe5a79fb04d9abddf77d97c6794dc://】;
 歐陸詞典pro:【eudic://】;
 拓詞:【towordsp://】;
 瘦身旅程:【sina.5253876156240b2daf015c9d://】;
 詞ci:【wx599b00cd734bd4a9://】;






關于iOS10之后,使用“App-Prefs:root”的技巧是現在才知道!
(在App內,需在前增加"App-")

對之前的看我文章的小伙伴表示抱歉!!(2017.06.15)














goyohol's essay

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容