iOS:管理 REST 端点的简单方法

2023-12-15

我们基于 REST 的应用程序可用于在多个内部环境上进行测试,每个内部环境都有不同的 REST 端点。有没有一种简单的方法可以在 iOS (Swift 3) 应用程序中设置环境级别配置?我见过一些方法,但它们似乎都非常复杂。


这是当我们有多个端点时我的做事方法。我曾经做过一个ConfigurationManager类是这样的

斯威夫特 3.0 代码

import Foundation
import UIKit

let kEnvironmentsPlist:NSString? = "Environments"
let kConfigurationKey:NSString? = "ActiveConfiguration"
let kAPIEndpointKey:NSString? = "APIEndPoint"
let kLoggingEnabledKey:NSString? = "LoggingEnabled"
let kAnalyticsTrackingEnabled:NSString? = "AnalyticsTrackingEnabled"

class ConfigurationManager:NSObject {

    var environment : NSDictionary?

    //Singleton Method

    static let sharedInstance: ConfigurationManager = {
        let instance = ConfigurationManager()
        // setup code
        return instance
    }()

    override init() {
        super.init()
        initialize()
    }

    // Private method

    func initialize ()   {

        var environments: NSDictionary?
        if let envsPlistPath = Bundle.main.path(forResource: "Environments", ofType: "plist") {
            environments = NSDictionary(contentsOfFile: envsPlistPath)
        }
        self.environment = environments!.object(forKey: currentConfiguration()) as? NSDictionary
        if self.environment == nil {
            assertionFailure(NSLocalizedString("Unable to load application configuration", comment: "Unable to load application configuration"))
        }
    }

    // CurrentConfiguration

    func currentConfiguration () -> String   {
        let configuration = Bundle.main.infoDictionary?[kConfigurationKey! as String] as? String
        return configuration!
    }

    // APIEndpoint

    func APIEndpoint () -> String  {
        let configuration = self.environment![kAPIEndpointKey!]
        return (configuration)! as! String
    }

    // isLoggingEnabled

    func isLoggingEnabled () -> Bool  {

        let configuration = self.environment![kLoggingEnabledKey!]
        return (configuration)! as! Bool
    }

    // isAnalyticsTrackingEnabled

    func isAnalyticsTrackingEnabled () -> String  {

        let configuration = self.environment![kAnalyticsTrackingEnabled!]
        return (configuration)! as! String
    }

    func applicationName()->String{
        let bundleDict = Bundle.main.infoDictionary! as NSDictionary
        return bundleDict.object(forKey: "CFBundleName") as! String
    }
}

In Project--> Info根据您的需要添加一些新配置。

enter image description here

我已经添加了Staging and QA作为额外的端点。通常我用来将暂存设置为发布配置,并将 QA 设置为调试。所以它看起来像:

enter image description here

现在去Targets -> 构建设置并添加一个用户定义的设置

enter image description here

给出用户定义的名称,例如活动配置.

enter image description here

添加一个名为ActiveConfiguration in info.plist变量名称为$(ACTIVE_CONFIGURATION)与给出的相同用户定义的设置 with a $在一开始的时候。我们将键的名称命名为ActiveConfiguration因为我们在我们的应用程序中使用相同的名称ConfigurationManager.swift类为kConfigurationKey.

let kConfigurationKey:NSString? = "ActiveConfiguration"

您可以根据您的命名约定进行定义。

它看起来像:

enter image description here

现在在ConfigurationManager我正在寻找一条路径Environments.plist file.

我只会做一个Environments.plist像这样的文件:

enter image description here

该文件的实际描述来源是

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Development</key>
    <dict>
        <key>APIEndPoint</key>
        <string>https://dev</string>
        <key>LoggingEnabled</key>
        <true/>
        <key>AnalyticsTrackingEnabled</key>
        <true/>
        <key>Flurry</key>
        <dict>
            <key>FlurryApplicationID</key>
            <string></string>
            <key>FlurryApplicationSecret</key>
            <string></string>
        </dict>
        <key>Facebook</key>
        <dict>
            <key>FacebookAppID</key>
            <string></string>
            <key>FacebookAppSecret</key>
            <string></string>
        </dict>
    </dict>
    <key>QA</key>
    <dict>
        <key>APIEndPoint</key>
        <string>https://qa</string>
        <key>LoggingEnabled</key>
        <true/>
        <key>AnalyticsTrackingEnabled</key>
        <true/>
        <key>Flurry</key>
        <dict>
            <key>FlurryApplicationID</key>
            <string></string>
            <key>FlurryApplicationSecret</key>
            <string></string>
        </dict>
        <key>Facebook</key>
        <dict>
            <key>FacebookAppID</key>
            <string></string>
            <key>FacebookAppSecret</key>
            <string></string>
        </dict>
    </dict>
    <key>Staging</key>
    <dict>
        <key>APIEndPoint</key>
        <string>https://staging</string>
        <key>LoggingEnabled</key>
        <false/>
        <key>AnalyticsTrackingEnabled</key>
        <true/>
        <key>Flurry</key>
        <dict>
            <key>FlurryApplicationID</key>
            <string></string>
            <key>FlurryApplicationSecret</key>
            <string></string>
        </dict>
        <key>Facebook</key>
        <dict>
            <key>FacebookAppID</key>
            <string>840474532726958</string>
            <key>FacebookAppSecret</key>
            <string></string>
        </dict>
    </dict>
    <key>Production</key>
    <dict>
        <key>APIEndPoint</key>
        <string>https://production</string>
        <key>LoggingEnabled</key>
        <true/>
        <key>AnalyticsTrackingEnabled</key>
        <true/>
        <key>Flurry</key>
        <dict>
            <key>FlurryApplicationID</key>
            <string></string>
            <key>FlurryApplicationSecret</key>
            <string></string>
        </dict>
        <key>Facebook</key>
        <dict>
            <key>FacebookAppID</key>
            <string></string>
            <key>FacebookAppSecret</key>
            <string></string>
        </dict>
    </dict>
</dict>
</plist>

现在我们可以出发了。现在你只需打电话

ConfigurationManager.sharedInstance.APIEndpoint()

为您各自的终点。

现在您只需从编辑方案中更改方案即可完成并更改构建配置 in info.

enter image description here

enter image description here

这不仅管理API端点还包括其他事项,例如是否为相应端点或不同端点的 Facebook 不同 ID 启用分析或跟踪。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS:管理 REST 端点的简单方法 的相关文章

  • 错误消息:您输入的捆绑包 ID 已被使用

    我正在尝试发布一个 iPhone 应用程序 这不是第一个 我过去已经发表过其他的 因此 我在第一个和第二个表单中输入了所需的信息 然后填写了第三个大表单 您还可以在其中上传图标和屏幕截图 好吧 我在上传屏幕截图之前按下了 保存 按钮 因为我
  • Swift:设置协议的可选属性

    如何设置协议的可选属性 例如 UITextInputTraits 有许多可选的读 写属性 当我尝试以下操作时 出现编译错误 无法分配给 textInputTraits 中的 keyboardType func initializeTextI
  • 有没有办法在 Firebase 中等待查询完成?

    我正在使用 TableView 在 Viewcontroller 中的 iOS 应用程序中进行查询 我想确保在继续加载 TableView 之前我的查询已经返回 有没有办法保证查询已经完成 None
  • 在 iOS 7 中 viewForHeaderInSection 部分是从 1 开始而不是从 0 开始

    我正在处理UITableView在我的项目中 这个项目是在 Xcode 4 5 中创建的 现在我正在使用 Xcode 5 所以我的问题是何时在 iOS 6 中运行我的项目 viewForHeaderInSection方法部分从 0 开始没问
  • Xamarin - 错误:dsymutil 退出,代码为 72

    最近升级到 VS for Mac 8 10 21 在构建应用程序时 我得到 Xamarin Shared targets 3 3 Error dsymutil exited with code 72 这是 Xcode 13 3 的情况 完整
  • REST 将多个输入传递给 GET 方法

    我在 RAD 中部署了一个简单的基于 REST 的应用程序 使用以下方式访问简单的 URLhttp localhost
  • iOS 7 tabBar 横线,如何去掉?

    Apple 在 iOS 7 中的 tabBar 上添加了一条细线 该线应该在 tabBar 和 UI 之间起到阴影或淡入淡出的作用 由于我使用的是定制的 tabBar 这条线非常令人恼火 你如何删除它 请告诉我这是可能的 否则我需要重新设计
  • 我的 UICollectionView 无法使用 Swift 平滑滚动

    我有一个CollectionView它使单元出队取决于message类型 例如 文本 图像 我遇到的问题是当我向上 向下滚动时滚动确实很不稳定 因此用户体验不是很好 这仅在第一次加载单元格时发生 之后滚动就会平滑 我有什么想法可以解决这个问
  • SwiftUI:隐藏键盘但显示光标

    我想使用自定义按钮将文本输入到TextField 但仍显示并移动光标 有没有办法隐藏默认键盘 同时仍然显示光标 我希望有这样的事情 TextField text text keyboardType none 这是它目前的样子 您可以使用UI
  • 未知异常和崩溃

    当我尝试快速滚动表格视图或从远程重新加载数据时 我的应用程序崩溃了 当我先进行远程获取然后滚动表格视图时 一切似乎都工作正常 我不知道下面的崩溃日志意味着什么 它只是有时工作正常 有时崩溃 Incident Identifier 710A1
  • 在 Postman 中连接 ECONNREFUSED

    我试图通过邮递员测试我的 REST API 但收到以下错误 这是我编写的第一个 REST API 我对邮差很陌生 所以不确定我做错了什么 下面是我尝试使用此 URL 在邮递员中调用的代码 我在 URL 中传递两个日期参数 https loc
  • 关闭捕获上下文 Swift

    当我尝试更改闭包中的变量时出现此错误 A C function pointer cannot be formed from a closure that captures context 是否有解决方法或者仍然可以更改闭包内的变量 My C
  • 使用 UITabBarController 时覆盖整个屏幕的视图?

    我想在 UITabBarController 设置中在整个屏幕上覆盖 HUD 样式的透明图形 执行此操作的按钮位于第一个选项卡的屏幕 FirstViewController 中 并且覆盖层也应该覆盖选项卡 这可能吗 您可以将新视图直接附加到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 通过 Button Swift 中的标签发送行和部分

    我里面有这个cellForRowAtIndexPath cell plusBut tag indexPath row cell plusBut addTarget self action plusHit forControlEvents U
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 诊断和仪器均缺少“僵尸”选项

    运行 Xcode 4 0 2 Zombie 选项丢失 其他 SO 帖子建议找到它的两个地方 Product gt Run looks like this Product gt Profile looks like this 奇怪的是 我之前
  • 致命错误:在 Swift 中解包可选值时意外发现 nil

    所以我试图获取 Swift 中输入字段的文本 这就是我得到的 class ViewController UIViewController IBOutlet var passwordField UITextField IBOutlet var
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • R - 在每个数据帧行上应用 lm

    我正在尝试在数据框的两列之间对每一行应用简单的线性回归 经过一番研究 我觉得我已经差不多了 但我的功能仍然不起作用 请看一下 set seed 1 DF lt data frame A rnorm 50 100 3 B rnorm 50 1
  • 仅在运行测试时出现 DexIndexOverflowException

    我可以在调试和发布变体中成功构建并运行我的 Android 应用程序 没有任何问题 然而 当我尝试运行新的单元测试 我以前从未进行过 时 我得到了可怕的结果DexIndexOverflowException 我猜测ProGuard没有与我的
  • 如何将这个elasticsearch函数分数查询转换为java API

    如何将下面的ES查询转换为Java API 我正在使用弹性搜索2 3 3 GET schema name search from 0 size 200 query function score query match all boost 5
  • 如何使用 boost::property_tree 解析带有数组根的 JSON

    如何使用 Boost PropertyTree 从以数组为根节点的 JSON 中获取数据 ID cc7c3e83 9b94 4fb2 aaa3 9da458c976f7 Type VM 数组元素只是属性树中带有名为 的键的值 for aut
  • 在Java中显示数字的前n位

    当用户确定 n 时 我很难创建一种显示数字前 n 位的方法 例如 用户输入整数 1234567 和若干位数以显示 3 然后该方法输出 123 我有一个想法如何显示第一个数字 long number 52345678 long prefix
  • C# - 使用 webbrowser 控件将字符串传递到网页中的文本框

    有没有办法在使用网络浏览器控件时获取字符串的值并将其传递到网页内的文本框 HtmlDocument doc this webBrowser1 Document doc GetElementById myId SetAttribute Val
  • ImageIO.read 返回 NULL,没有错误

    尽管文件看起来很好找到 但以下代码似乎不起作用 images new BufferedImage 32 FileInputStream fis null for int i 0 i lt 32 i File file new File ti
  • Rscript 在本地构建中指向不正确的 R 版本

    我最近在Linux Redhat服务器上安装了本地版本的R 3 1 0 如下 from R 3 1 0 directory configure prefix pwd make make install 此外 我还更新了 bashrc 中的
  • 简单的喜欢/不喜欢文本按钮 - 添加 ajax 等

    我正在尝试用 PHP 制作一个非常简单的 Like Unlike 按钮 页面不刷新 我知道有无数关于这方面的教程 但因为我对 ajax 和 jquery 完全陌生 所以我不知道如何实现它们 代码的哪一部分在哪个文件中执行等 我有一个用户 I
  • 正则表达式防止尾随空格和额外空格

    现在我有一个正则表达式可以防止用户输入任何特殊字符 唯一允许的字符是 A 到 Z 0 到 9 或空格 我想改进这个正则表达式以防止出现以下情况 无前导 训练空格 如果用户在条目之前或之后键入一个或多个空格 则不允许 不允许使用双空格 如果用
  • 将 Yaml 中的列表映射到 Spring Boot 中的对象列表

    在我的 Spring Boot 应用程序中 我有 application yaml 配置文件 其中包含以下内容 我想将其作为带有通道配置列表的配置对象注入 available payment channels list xyz 123 ch
  • 在 Xdebug v3 中,如果我在单步调试时更改断点,我会得到 nginx 502 Bad Gateway

    我在 Docker 中运行 PHP 7 4 我能够很好地进行单步调试 但是 与 Xdebug v2 不同 如果我在单步调试时添加断点或删除断点 我会从 nginx 收到 502 Bad Gateway 消息 并且单步调试会话就会终止 我是否
  • 给定一组区间,找出有多少个区间包含一个点

    假设给你一组 N 个区间 表示为左右坐标 和 M 个点 对于每个点 P 算法应该找到 P 所属的区间数 这是我的算法 1 将区间的左 右坐标分别放入 left 和 right 数组中 2 左 排序 与 右 同时交换条目 3 给定一个点 P
  • OpenJDK 和 Adoptium/AdoptOpenJDK 之间的区别

    由于最近Oracle Java SE 支持路线图由于政策更新 特别是 2019 年 3 月之后 Oracle 的 free 版本更新结束 我一直在寻找 Oracle Java 的替代方案 我发现 OpenJDK 是一个开源替代品 我发现采用
  • 从 System.Drawing.Image 在文件系统上创建新图像?

    好吧 我很抱歉 这可能是一个菜鸟问题 但我有点卡住了 所以我正在做的 在我的 asp net 应用程序上 是从文件系统加载图像 System Drawing Image tempImage tempImage System Drawing
  • 如何在显示属性、名称字段中添加新行

    我正在开发 MVC3 应用程序 并使用数据属性作为屏幕上的显示名称字段 以下是一个代表性样本 Required Display Name Staff Id format 9999 StringLength 10 UIHint StaffId
  • Xcode 5“错误:无法执行‘codesign’(没有这样的文件或目录)”

    最近有人在以下位置发布了类似的问题无法执行 codesign 没有这样的文件或目录 然而 无论出于何种原因 它都收到了反对票 而不是有用的东西 因此 我将尝试自己发布此内容 并附上一些附加数据 希望某些 SO er 已经经历过此问题或只是知
  • React 嵌套映射/forEach 不起作用

    我正在开发一个 CMS 系统 其嵌套子菜单根据用户 自定义等而有所不同 为了解决这个问题 我在反应组件中放置了一个地图函数 根据文档 这种方法仅适用于一个嵌套地图功能 但显然不适用于第二个 这是我渲染子菜单所需的 有什么想法吗 render
  • 为什么我的声音使我的游戏在 Swift Spritekit 中出现滞后?

    当我的英雄节点收集硬币并且我的游戏中出现这个小问题时 我会听到这种声音效果 它不像其他游戏那样流畅 收集硬币时会发出声音 我究竟做错了什么 这是我的声音代码 class GameScene SKScene SKPhysicsContactD
  • iOS:管理 REST 端点的简单方法

    我们基于 REST 的应用程序可用于在多个内部环境上进行测试 每个内部环境都有不同的 REST 端点 有没有一种简单的方法可以在 iOS Swift 3 应用程序中设置环境级别配置 我见过一些方法 但它们似乎都非常复杂 这是当我们有多个端点