"prefs:root=" non-public URL scheme 被拒修改

重新上線一個老項目,只做了一些UI修改,其余大部分內容沒有變化,但是由于項目的年齡擺在那里,對順利上線不是特別有信心。
2018.08.31上線,09.02被拒,郵件中提及
"prefs:root=" non-public URL scheme
私有API的使用。其實修改這個錯誤挺容易的,根據(jù)App Store 審核指南中2.5.1 描述:

App 僅可使用公共 API,并且必須在當前發(fā)布的 OS 上運行。進一步了解公共 APIs (英文)。及時更新您的 app,在未來的操作系統(tǒng)版本中不再支持的任何過時功能、框架或技術皆應被淘汰。App 使用的 API 和框架應該是為了實現(xiàn)預期用途,并在 app 描述中說明集成詳情。例如,HomeKit 框架應提供家居自動化服務,HealthKit 則應該用于保持健康和健身目的,并集成在“健康”app 中。

"prefs:root="一系列跳轉設置URL都屬于私有API,在蘋果機器審核期間,只要代碼中存在就會被拒。這句話很重要,我們介紹這些API純屬介紹,不建議使用,當然,如果想使用又想避免被拒,也是有辦法,不急,這些在下面有介紹,慢慢看。

1、prefs:root(App-Prefs:root)

在iOS8 ~iOS10之前的版本都是可以使用此API進行跳轉(當然,上架的話,審核大概率還是會被拒,在這里僅僅討論版本使用問題)
以跳轉至App相機權限為例:

NSURL *privacyUrl = [NSURL URLWithString:@"prefs:root=Privacy&path=PHOTOS"];
if ([[UIApplication sharedApplication] canOpenURL:privacyUrl]) {
     if (@available(iOS 10.0, *)) {
         [[UIApplication sharedApplication] openURL:privacyUrl options:@{} completionHandler:nil];
     }else{
         [[UIApplication sharedApplication] openURL:privacyUrl];
    }
}

iOS8

成功跳轉(iOS8.1 5s)

進入設置--隱私-- 照片

照片.png

iOS9~iOS10

需要在Info -> URL Types中新增一個Schemes,URL Schemes中填寫 prefs

URL Types.png

成功跳轉(iOS9.1 5s)

其中iOS10以上應該使用

// 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("");

跳轉的URL的對應的字符串常用的如下:

(兩個寫法 App-Prefs:root=Xxx&path=XXXX 或者 prefs:root= Xxx&path=XXX)

名稱 字符串
通用 prefs:root=General
隱私-照相機 prefs:root=Privacy&path=CAMERA
隱私-健康 prefs:root=Privacy&path=HEALTH
通用-鍵盤 prefs:root=General&path=KEYBOARD
... ....

針對通用和隱私(General、Privacy)的話,這個鏈接的寫法很容易,你將設備語言設置為英語,進入Settings,看到頁面,一級頁面為root(首字母大小),點擊進入之后為path(全部大寫)


Settings.png

其余的大同小異,只有名稱是否大小寫的區(qū)分,通用與隱私中已經可以包含大部分的功能。

舉幾個其余的:
(兩個寫法 App-Prefs:root=&path= 或者 prefs:root=&path=)

名稱 字符串
地圖 prefs:root=MAPS
藍牙 prefs:root= Bluetooth
... ....
iOS11中其實也可以使用這種方法進行跳轉,但字符串的寫法必須只能是App-Prefs:root=,但是在iOS11對私有API是做了限制,所以之前的寫法都只能跳轉到Settings首頁(如果Settings在后臺模式的話,就展示當前所在的頁面),無法進入path所指頁面
iOS11.png

2、UIApplicationOpenSettingsURLString

推薦寫法,同時是支持iOS8以上版本

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL: url]) {
     if (@available(iOS 10.0, *)) {
         [[UIApplication sharedApplication] openURL: url options:@{} completionHandler:nil];
     }else{
         [[UIApplication sharedApplication] openURL: url];
    }
}

進入的是App對應的權限界面


App權限設置.png

其實寫了這么多,如果當前需求僅僅是需要相機和相冊等權限的開啟,直接使用第二種即可,跳轉和審核都可以。

(PS:可能存在UIApplicationOpenSettingsURLString跳轉到Settings首頁的情況,這種是發(fā)生在應用沒有請求任何權限授予,包括相機、定位等,這樣子Settings中不會出現(xiàn)該App的選項。一般不會出現(xiàn)這種情況,寫Demo的出現(xiàn)過,這邊提及下)

鐵頭娃 仍使用私有API方法

情況多數(shù)出現(xiàn)在使用藍牙的App設備下
兩個方法 :1、跳轉的私有API字符串用服務端返回;2、ASCII值進行拼裝組合方法

//以藍牙 App-Prefs:root=Bluetooth 為例
- (NSString *)getBluetoothMethod{
    NSData *dataOne = [NSData dataWithBytes:(unsigned char[]){0x41,0x70,0x70,0x2d,0x50,0x72,0x65,0x66,0x73,0x3a,0x72,0x6f,0x6f,0x74,0x3d,0x42,0x6c,0x75,0x65,0x74,0x6f,0x6f,0x74,0x68} length:24];
    
    NSString *method = [[NSString alloc] initWithData:dataOne encoding:NSASCIIStringEncoding];
    return method;
}

ASCII值轉換可以前往在線編碼器
兩個方法都是避免代碼中出現(xiàn)prefs:root=或者App-Prefs:root,繞過機器審核。
但是,但是,但是,終究是取巧而且iOS11還是不行?? 所以 這塊上,在iOS11上,多數(shù)App都是提示用戶手動去設置打開

WI-FI萬能助手.PNG

寫的不對的地方麻煩指出,希望大家指出??!
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容