如何在iOS端为ArcGIS Runtime SDK嵌入用户凭证访问Portal?
解决方案
ArcGIS Runtime for iOS 通过 AGSAuthenticationManager 全局处理受保护资源的身份验证挑战,你可以通过以下两种方式实现自动注入用户名密码完成验证:
- 方案1:预注册Portal凭证(适合已知固定账号密码的场景,配置最简单)
提前给你的企业Portal地址注册凭证,原有地图加载逻辑无需修改,认证管理器会自动匹配请求提交凭证。
import ArcGIS // 需在加载地图前执行,建议放在App启动或对应页面初始化阶段 let portalRootURL = URL(string: "替换为你的企业Portal根地址,例如https://your-company-portal.com/arcgis")! // 账号密码建议从iOS钥匙串读取,不要硬编码明文存储 let portalCredential = AGSCredential(user: "你的用户名", password: "你的密码") AGSAuthenticationManager.shared().credentialCache.add(portalCredential, for: portalRootURL) // 原有加载地图的代码保持不变即可 let map = AGSMap(url: webmapURL) mapView.map = map mapView.touchDelegate = self mapView.setViewpoint(AGSViewpoint(latitude: 50.69295, longitude: -63.987547, scale: 2027.977411))
- 方案2:自定义挑战处理回调(适合需要动态获取账号密码、自定义错误提示的场景)
通过全局挑战处理闭包,拦截所有验证请求,按需返回凭证,适配更灵活的业务场景。
import ArcGIS // 在App启动阶段全局配置挑战处理逻辑 AGSAuthenticationManager.shared().challengeHandler = { challenge in // 只处理账号密码类型的验证挑战,其他类型(如OAuth、证书认证)可按业务需求扩展 guard challenge.type == .usernamePassword else { challenge.cancel() return } // 可在此处插入读取本地存储的账号、弹窗提示用户输入等自定义逻辑 let userCredential = AGSCredential(user: "用户名", password: "密码") // 提交凭证完成验证 challenge.continue(with: userCredential) } // 原有加载地图的代码保持不变即可 let map = AGSMap(url: webmapURL) mapView.map = map mapView.touchDelegate = self mapView.setViewpoint(AGSViewpoint(latitude: 50.69295, longitude: -63.987547, scale: 2027.977411))
注意事项:
- 禁止在代码中硬编码明文账号密码,建议将敏感信息存储在iOS钥匙串中,使用时动态读取
- 如果企业Portal使用自签名证书,需要提前在认证管理器中配置允许自签名证书,避免请求被系统安全策略拦截
- 提交过的凭证会被自动缓存到本地,有效期内无需重复提交
内容的提问来源于stack exchange,提问作者R.LI
相关产品推荐
相关产品推荐

