---
title: 'AppleDynamicFramework'
---

A provider containing information about an Apple dynamic framework.

## Members

* [binary](#binary)
* [cc\_info](#cc_info)
* [framework\_dirs](#framework_dirs)
* [framework\_files](#framework_files)
* [objc](#objc)
* [to\_json](#to_json)
* [to\_proto](#to_proto)

## binary

```
File AppleDynamicFramework.binary
```

The multi-architecture dylib binary of the dynamic framework. May be None if the rule providing the framework only specified framework imports.
May return `None`.

## cc\_info

```
CcInfo AppleDynamicFramework.cc_info
```

A provider which contains information about the transitive dependencies linked into the dynamic framework.

## framework\_dirs

```
depset AppleDynamicFramework.framework_dirs
```

The framework path names used as link inputs in order to link against the dynamic framework.

## framework\_files

```
depset AppleDynamicFramework.framework_files
```

The full set of files that should be included as inputs to link against the dynamic framework.

## objc

```
ObjcProvider AppleDynamicFramework.objc
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_objc_provider_remove_linking_info`. Use this flag to verify your code is compatible with its imminent removal.
A provider which contains information about the transitive dependencies linked into the dynamic framework.

## to\_json

```
string AppleDynamicFramework.to_json()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
Creates a JSON string from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs, a list of these types or a dictionary with string keys and values of these types. Quotes and new lines in strings are escaped. Examples:

```
struct(key=123).to_json()
# {"key":123}

struct(key=True).to_json()
# {"key":true}

struct(key=[1, 2, 3]).to_json()
# {"key":[1,2,3]}

struct(key='text').to_json()
# {"key":"text"}

struct(key=struct(inner_key='text')).to_json()
# {"key":{"inner_key":"text"}}

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()
# {"key":[{"inner_key":1},{"inner_key":2}]}

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()
# {"key":{"inner_key":{"inner_inner_key":"text"}}}
```

.

Deprecated: instead, use json.encode(x) or json.encode\_indent(x), which work for values other than structs and do not pollute the struct field namespace.

## to\_proto

```
string AppleDynamicFramework.to_proto()
```

**Deprecated**. This API is deprecated and will be removed soon. Please do not depend on it. It is *disabled* with `---incompatible_struct_has_no_methods`. Use this flag to verify your code is compatible with its imminent removal.
Creates a text message from the struct parameter. This method only works if all struct elements (recursively) are strings, ints, booleans, other structs or dicts or lists of these types. Quotes and new lines in strings are escaped. Struct keys are iterated in the sorted order. Examples:

```
struct(key=123).to_proto()
# key: 123

struct(key=True).to_proto()
# key: true

struct(key=[1, 2, 3]).to_proto()
# key: 1
# key: 2
# key: 3

struct(key='text').to_proto()
# key: "text"

struct(key=struct(inner_key='text')).to_proto()
# key {
#   inner_key: "text"
# }

struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_proto()
# key {
#   inner_key: 1
# }
# key {
#   inner_key: 2
# }

struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_proto()
# key {
#    inner_key {
#     inner_inner_key: "text"
#   }
# }

struct(foo={4: 3, 2: 1}).to_proto()
# foo: {
#   key: 4
#   value: 3
# }
# foo: {
#   key: 2
#   value: 1
# }
```

Deprecated: use proto.encode\_text(x) instead.