IOS文章收集iOS开发iOS Developer

ios app跳转各种系统界面或应用

2017-08-18  本文已影响533人  贪吃的猫cx

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

NSString* defaultWork = [self getDefaultWork];

NSString* bluetoothMethod = [self getBluetoothMethod];

Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");

[[LSApplicationWorkspace  performSelector:NSSelectorFromString(defaultWork)]  performSelector:NSSelectorFromString(bluetoothMethod) withObject:url withObject:nil];

-(NSString *) getDefaultWork{

NSData *dataOne = [NSData dataWithBytes:(unsigned char []){0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x57,0x6f,0x72,0x6b,0x73,0x70,0x61,0x63,0x65} length:16];

NSString *method = [[NSString alloc] initWithData:dataOne encoding:NSASCIIStringEncoding];

return method; //defaultWorkspace

}

-(NSString *) getBluetoothMethod{

NSData *dataOne = [NSData dataWithBytes:(unsigned char []){0x6f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x6e, 0x73, 0x69,0x74, 0x69,0x76,0x65,0x55,0x52,0x4c} length:16];

NSString *keyone = [[NSString alloc] initWithData:dataOne encoding:NSASCIIStringEncoding];

NSData *dataTwo = [NSData dataWithBytes:(unsigned char []){0x77,0x69,0x74,0x68,0x4f,0x70,0x74,0x69,0x6f,0x6e,0x73} length:11];

NSString *keytwo = [[NSString alloc] initWithData:dataTwo encoding:NSASCIIStringEncoding];

NSString *method = [NSString stringWithFormat:@"%@%@%@%@",keyone,@":",keytwo,@":"];

return method; //openSensitiveURL:withOptions:

}

环境: 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 *)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-")

作者:goyohol

链接:http://www.jianshu.com/p/20ce7f846f75

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读