昨天提交的ios app審核又被拒了,原因是因為app有提供三方微信登錄,而沒有提供蘋果登錄。蘋果就不爽了,就拒絕,那么就只有按要求接入蘋果登錄了。
根據蘋果審核指南要求,如果 app 使用第三方或社交登錄服務 (例如,Facebook 登錄、Google 登錄、通過 Twitter 登錄、通過 LinkedIn 登錄、通過 Amazon 登錄或微信登錄) 來對其進行設置或驗證這個 app 的用戶主帳戶,則該 app 必須同時提供“通過 Apple 登錄”作為同等選項。詳情參考:App Store 審核指南 - 通過 Apple 登錄
HBuilderX 自 2.4.7+ 版本開始支持 Sign in with Apple (蘋果登錄),蘋果登錄是 iOS13 新增加的功能,當你的應用使用了第三方登錄比如微信登錄,同時也需要集成蘋果登錄,否則提交AppStore審核會被拒絕。
一、使用蘋果登錄的教程
使用蘋果登錄首先需要在蘋果開發者后台開啟 App 的 Sign In with Apple 服務
注:只有發布Appstore的應用才能使用蘋果登錄。企業版開發者賬號不支持
Sign In with Apple(企業版開發者賬號指的是用於企業內部分發App,不能用於發布 App Store 的賬號,也就是價格為 299$ 的賬號)
1、登錄到蘋果開發者后台 ,編輯對應的 Identifier 勾選 Sign In with Apple 服務並保存

2、勾選或取消服務,會導致之前的 profile 描述文件失效,不需要新建,只要點擊 Edit 重新編輯對應的 profile文件,然后保存下載使用新的profile文件即可

3、在 HBuilderX 編輯項目的 manifest.json ,在 App SDK配置中找到蘋果登錄,並勾選。

注意:測試蘋果登錄服務,需要提交雲打包或提交自定義基座打包,只有添加了蘋果登錄服務提交打包才會將蘋果登錄模塊打進安裝包,否則調不到相關方法
二、登錄按鈕樣式
蘋果對登錄按鈕樣式有要求,請按照蘋果要求統一設置登錄按鈕的樣式,否則審核可能會被拒絕。
需要注意的是:
- 按鈕必須在顯著的位置(避免滑動屏幕才能看到)
- 登錄按鈕有三種外觀:白色,帶有黑色輪廓線的白色和黑色,其他設計可能會影響審核;
- 按鈕圓角范圍及按鈕最小尺寸也有要求;
- 具體規則請參考蘋果 官方文檔
下面是原生端默認的幾種按鈕樣式供大家參考(width:130pt, height:30pt, corner radius: 6pt)

三、示例代碼 (詳細 api 請查閱 plus.oauth 文檔)
注意:因為是 iOS13+ 系統才支持蘋果登錄,所以建議在App的界面入口判斷下,只有 iOS13 才顯示Apple登錄的選項
1、uni-app示例
uni.login({ provider: 'apple', success: function (loginRes) { // 登錄成功
uni.getUserInfo({ provider: 'apple', success() { // 獲取用戶信息成功
} }) }, fail: function (err) { // 登錄失敗
} });
uni-app返回參數如下:
{ "openId": "000945.95452b**2f3b.0336", "fullName": { "familyName": "**", "giveName": "**", "givenName": "**" }, "email": "11**93@qq.com", "authorizationCode": "c9f248f**NmxxQ", "identityToken": "eyJraWQ**JleHC**Q", "realUserStatus": 2 }
2、5+App示例 (可以在 uniapp 中直接調用5+API)
注意:因為是 iOS13+ 系統才支持蘋果登錄,所以在 iOS13 以下設備調用 plus.oauth.getServices 不會返回蘋果登錄對應的 service 對象
var appleOauth = null; plus.oauth.getServices(function(services) { for (var i in services) { var service = services[i]; // 獲取蘋果授權登錄對象,蘋果授權登錄id 為 'apple' iOS13以下系統,不會返回蘋果登錄對應的 service
if (service.id == 'apple') { appleOauth = service; break; } } appleOauth.login( function(oauth){ // 授權成功,蘋果授權返回的信息在 oauth.target.appleInfo 中
}, function(err) { // 授權失敗 error
}, { // 默認只會請求用戶名字信息,如需請求用戶郵箱信息,需要設置 scope: 'email'
scope: 'email' }) }, function(err) { // 獲取 services 失敗
})
5+ api 返回參數說明:
注意:這里是 5+ api 返回的數據,uni 接口對 5+api 做了封裝,以實際返回結果為准
(1)appleInfo
| 屬性 | 類型 | 說明 |
|---|---|---|
| user | String | 蘋果用戶唯一標識符 |
| state | String | 驗證信息狀態 |
| String | 用戶共享的可選電子郵件 | |
| fullName | Object | 用戶共享的可選全名 |
| authorizationCode | String | 驗證數據 |
| identityToken | String | Web令牌(JWT) |
| realUserStatus | Number | 標識用戶是否為真實的人 0:當前平台不支持,忽略該值;1:無法確認;2:用戶真實性非常高 |
| scope | String | 返回信息作用域 |
(2)fullName
| 屬性 | 類型 | 說明 |
|---|---|---|
| namePrefix | String | 名字前綴,頭銜、敬稱 |
| givenName | String | 名字 |
| middleName | String | 中間名 |
| familyName | String | 姓 |
| nameSuffix | String | 名字后綴,學位、榮譽 |
| nickName | String | 昵稱 |
(3)授權失敗 code 說明
| code | 說明 |
|---|---|
| 1000 | 未知錯誤 |
| 1001 | 取消授權 |
| 1002 | 返回值無效 |
| 1003 | 請求未處理 |
| 1004 | 授權失敗 |
四、最后提交雲打包或自定義基座打包進行功能測試
注意事項:
1、只有首次彈出登錄授權框時才會有用戶名及email的項(email需要配置 scope: 'email' ),並且用戶可以刪除或編輯用戶名或隱藏用戶郵箱,如果用戶刪除了用戶名授權成功后fullname字段也會為空;
2、授權成功后再次調用登錄接口會先校驗上次授權是否依然有效,如有效,直接回調成功並返回上次授權成功時的數據。
注意,此校驗不會校驗identityToken是否過期,需要用戶自行處理;
如果想每次都彈出授權框獲取新的identityToken等信息,需要先調用'logout()',然后在調用登錄接口就會彈出授權框,注意這時授權框內不會在出現用戶名及郵箱,登錄成功后這兩個字段會為空,需要拿到 authorizationCode,identityToken 后傳給服務器,然后和蘋果服務器驗證可獲取用戶名稱等信息,具體請自行查閱文檔;
如果想在授權框中再次出現用戶名或郵箱。需要在: 系統設置->AppleID->密碼與安全性->使用Apple ID 的 App 里面取消授權,然后再調用登錄接口;
