ios10 - 关于iOS 10,跳转系统设置问题
天蓬老师
天蓬老师 2017-04-18 09:48:49
0
10
446

iOS 10 更新以后,发现以前跳转系统应用的方法无效了。(已解决:参考 https://github.com/sushushu/i...)

-(void)toWIFI {
    
    NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];

    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        
        [[UIApplication sharedApplication] openURL:url]; // iOS 9 的跳转
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];// iOS 10 的跳转方式
    }
}

    

iOS 9的时候[[UIApplication sharedApplication] openURL:url]; 这个方法正常跳转,到了iOS 10的时候这个方法就不能用了。官方API如下:

- (BOOL)openURL:(NSURL*)url NS_DEPRECATED_IOS(2_0, 10_0, "Please use openURL:options:completionHandler: instead") NS_EXTENSION_UNAVAILABLE_IOS("");
- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);
    // Options are specified in the section below for openURL options. An empty options dictionary will result in the same
    // behavior as the older openURL call, aside from the fact that this is asynchronous and calls the completion handler rather
    // than returning a result.
    // The completion handler is called on the main queue.
    - (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");  

请问我该如何使用新的API
- (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS(""); 或者说这个options我该传什么进去(经测试,传空字典是没有用的)?

万分感谢。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(10)
PHPzhong

放棄吧,iOS 10 不允許跳到任何系統設定。

Peter_Zhu

針對iOS10不跳轉問題,其實iOS提供了一套未公開方法。但審核是一個問題,不過我們可以想辦法繞過審核。

NSString * defaultWork = [self getDefaultWork];
NSString * bluetoothMethod = [self getBluetoothMethod];        
NSURL*url=[NSURL URLWithString:@"Prefs:root=Bluetooth"];
Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");
[[LSApplicationWorkspace  performSelector:NSSelectorFromString(defaultWork)]   performSelector:NSSelectorFromString(bluetoothMethod) withObject:url     withObject:nil];

利用ASCII值進行組裝組合方法。這樣可繞過審核。

-(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;
}

-(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;
}

上面是進入藍牙介面的方法。也可以有其他的頁面可以跳轉。設定頁面是@"@"Prefs:root=TETHERING",wifi是@"Prefs:root=WIFI"。注意Prefs的P是大寫。
這麼寫也有弊端,如果蘋果的未公開方法一旦修改。我們必須重新進行修改。

Ty80

你沒有設定應用的url Scheme吧

PHPzhong

在ios10裡面這樣寫,群組裡一個大神教的
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

刘奇

兄弟我知道了哈哈我終於找到解決方法了

pragma mark -- openURL 選項 --

// openURL:options:CompletionHandler 的選項:僅當它是有效的通用鏈接並且配置了應用程序來打開它時才打開URL
// 如果沒有配置應用程序,或者用戶禁用使用它來打開鏈接,則完成使用NO
UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionUniversalLinksOnly NS_AVAILABLE_IOS(10_0);

呼叫處理程序
伊谢尔伦

[[UIApplication sharedApplication] openURL:url options:@{UIApplicationOpenURLOptionUniversalLinksOnly:@""}completionHandler:nil ];

左手右手慢动作

雷雷

刘奇

遇到相同的問題,請問您解決了嗎?

小葫芦

請問您解決了嗎

大家讲道理

麻煩問下樓主,如何解決的?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板