NowWebThemeable protocol - iOS

  • Release version: Zurich
  • Updated July 31, 2025
  • 2 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of NowWebThemeable protocol - iOS

    TheNowWebThemeableprotocol in the ServiceNow Mobile SDK for iOS enables you to customize the color scheme of web pages rendered inside native web views on your ServiceNow instance. This allows you to maintain consistent branding and visual style across both native and web content within your mobile app.

    Show full answer Show less

    Key Features

    • NowWebThemeable Protocol: Requires implementing a color property conforming to NowWebColoring, which defines the colors used in the web view.
    • NowWebColoring Protocol: Extends the base NowUIColoring protocol, which provides default color variables for theming.
    • Defining Colors: You can define your web colors using either the default Mobile SDK colors or customize them by implementing your own NowUIColoring conforming struct.
    • Composing Themes: Create a theme struct (e.g., CarrascoWebTheme) that conforms to NowWebThemeable by assigning your color definitions to the color property.
    • Applying Themes: Instantiate your theme and pass it when creating a web view controller via NowWebService.makeWebViewController, ensuring the web content uses your specified color scheme.

    How to Use

    • Define a color struct conforming to NowUIColoring to specify default or custom colors.
    • Create a theme struct conforming to NowWebThemeable that includes your color definitions.
    • Instantiate the theme with your color struct.
    • Pass the theme instance to makeWebViewController method of NowWebService when loading web content.

    Benefits for ServiceNow Customers

    By leveraging the NowWebThemeable protocol, ServiceNow customers can ensure their mobile applications have a unified and branded user interface. This improves user experience by aligning web content colors with native app themes, simplifying maintenance of consistent brand visuals across platforms.

    The NowWebThemeable protocol provides properties that enable you to override the colors used within web pages hosted on your ServiceNow instance in a native web view.

    public protocol NowWebThemeable {
        var color: NowWebColoring { get }
    }

    The NowWebColoring protocol contains NowUIColoring. This property is used to reference default color variables that NowWebThemeable can use.

    For additional information on how to theme the UI, see Use NowUIColoring to theme NowWebTheme and NowChatTheme in the Mobile SDK Developer Guide - iOS.

    Define WebColors using default colors

    /// Sample structure for using default colors that come with Mobile SDK.
    struct WebColors: NowUIColoring {
    }

    Define WebColors using custom colors

    /// Use custom colors with light theme
    struct WebColors: NowUIColoring {
        private var defaultTheme: NowWebDefaultTheme { NowWebDefaultTheme(nowUITheme: NowUIDefaultTheme())
        }
        
        var brand: UIColor { lightBrand }
        var primary: UIColor { lightPrimary }
        var textPrimary: UIColor { lightTextPrimary }
        var screenHeaderText: UIColor { lightScreenHeaderText }
        var screenHeaderBackground: UIColor { lightScreenHeaderBackground }
        var textActionable: UIColor { lightTextActionable }
        var alertCritical0: UIColor { lightAlertCritical0 }
        var alertCritical3: UIColor { lightAlertCritical3 }
        var alertPositive0: UIColor { lightAlertPositive0 }
        var alertPositive3: UIColor { lightAlertPositive3 }
        var alertLow0: UIColor { lightAlertLow0 }
        var alertWarning0: UIColor { lightAlertWarning0 }
        var backgroundPrimary: UIColor { lightBackgroundPrimary }
        
        // Light Colors
        var lightBrand: UIColor { defaultTheme.color.brand }
        var lightPrimary: UIColor { defaultTheme.color.primary }
        var lightTextPrimary: UIColor { defaultTheme.color.textPrimary }
        var lightScreenHeaderText: UIColor { defaultTheme.color.screenHeaderText }
        var lightScreenHeaderBackground: UIColor { defaultTheme.color.screenHeaderBackground }
        var lightTextActionable: UIColor { defaultTheme.color.textActionble }
        var lightAlertCritical0: UIColor { defaultTheme.color.alertCritical0 }
        var lightAlertCritical3: UIColor { defaultTheme.color.alertCritical3 }
        var lightAlertPositive0: UIColor { defaultTheme.color.alertPositive0 }
        var lightAlertPositive3: UIColor { defaultTheme.color.alertPositive3 }
        var lightAlertLow0: UIColor { defaultTheme.color.alertLow0 }
        var lightAlertWarning0: UIColor { defaultTheme.color.alertWarning0 }
        var lightBackgroundPrimary: UIColor { defaultTheme.color.backgroundPrimary }
    }

    Define WebTheme structure with NowWebThemeable protocol

    struct CarrascoWebTheme: NowWebThemeable {
        var color: NowWebColoring
        
        struct Color: NowWebColoring {
            var nowUIColor: NowUIColoring
        
            var alertPositive0: UIColor
            var alertPositive3: UIColor
            var alertLow0: UIColor
            var alertWarning0: UIColor
            var backgroundPrimary: UIColor
            
            init(inputs: WebColors) {
                nowUIColor = ThemeColor(inputs)
                
                alertPositive0 = inputs.alertPositive0
                alertPositive3 = inputs.alertPositive3
                alertLow0 = inputs.alertLow0
                alertWarning0 = inputs.alertWarning0
                backgroundPrimary = inputs.backgroundPrimary
            }
        }
        
        public init(webColors: WebColors) {
            color = Color(inputs: webColors)
        }
    }
    

    Instantiate a WebTheme object by passing WebColor as input

    let webTheme = CarrascoWebTheme(webColors: WebColors())

    Pass a WebTheme object to NowWebService.makeWebViewController

    func webViewController(for url: URL, delegate: NowWebViewControllerDelegate) -> NowWebViewController? {
      guard let webService = webService else {
        debugPrint("Web service not initialized")
        return nil
      }
      let result = webService.makeWebViewController(for: url, delegate: delegate, theme: CarrascoWebTheme(webColors: WebColors()) )
        
      switch result {
      case .success(let viewController):
        return viewController
      case .failure(let error):
        debugPrint("Web view creation failed with error: \(error.localizedDescription)")
      }
      return nil
    }