diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
index 10a327e..42b3761 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java
@@ -63,8 +63,9 @@
         ApplePlatform> {
 
   @VisibleForTesting
-  public static final String BAD_KEY_ERROR = "Argument %s not a recognized key, 'providers',"
-      + " or 'direct_dep_providers'.";
+  public static final String BAD_KEY_ERROR =
+      "Argument %s not a recognized key,"
+          + " 'strict_include', 'providers', or 'direct_dep_providers'.";
 
   @VisibleForTesting
   public static final String BAD_SET_TYPE_ERROR =
@@ -200,6 +201,8 @@
       Key<?> key = ObjcProvider.getSkylarkKeyForString((String) entry.getKey());
       if (key != null) {
         resultBuilder.addElementsFromSkylark(key, entry.getValue());
+      } else if (entry.getKey().equals("strict_include")) {
+        resultBuilder.addStrictIncludeFromSkylark(entry.getValue());
       } else if (entry.getKey().equals("providers")) {
         resultBuilder.addProvidersFromSkylark(entry.getValue());
       } else if (entry.getKey().equals("direct_dep_providers")) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 1487259..3d1f189 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -1124,7 +1124,7 @@
       return this;
     }
 
-    Builder addStrictDependencyIncludes(Iterable<PathFragment> includes) {
+    protected Builder addStrictDependencyIncludes(Iterable<PathFragment> includes) {
       strictDependencyIncludes.addAll(includes);
       return this;
     }
@@ -1295,6 +1295,19 @@
       }
     }
 
+    /**
+     * Adds the given strict include paths from skylark. An error is thrown if skylarkToAdd is not
+     * an appropriate Depset.
+     */
+    @SuppressWarnings("unchecked")
+    void addStrictIncludeFromSkylark(Object skylarkToAdd) throws EvalException {
+      NestedSet<PathFragment> toAdd =
+          (NestedSet<PathFragment>)
+              ObjcProviderSkylarkConverters.convertToJava(INCLUDE, skylarkToAdd);
+
+      addStrictDependencyIncludes(toAdd.toList());
+    }
+
     @Override
     public ObjcProvider build() {
       return build(ccCompilationContextBuilder.build());
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
index eee81ce..4b8cb62 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
@@ -1226,6 +1226,32 @@
   }
 
   @Test
+  public void testSkylarkCanCreateObjcProviderWithStrictDepsDirectly() throws Exception {
+    ConfiguredTarget skylarkTarget =
+        createObjcProviderSkylarkTarget(
+            "   strict_includes = depset(['path'])",
+            "   created_provider = apple_common.new_objc_provider\\",
+            "(strict_include=strict_includes)",
+            "   return [created_provider]");
+
+    ObjcProvider skylarkProvider = skylarkTarget.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+    assertThat(skylarkProvider.getStrictDependencyIncludes())
+        .containsExactly(PathFragment.create("path"));
+
+    scratch.file(
+        "examples/objc_skylark2/BUILD",
+        "objc_library(",
+        "   name = 'direct_dep',",
+        "   deps = ['//examples/objc_skylark:my_target']",
+        ")");
+
+    ObjcProvider skylarkProviderDirectDepender =
+        getConfiguredTarget("//examples/objc_skylark2:direct_dep")
+            .get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+    assertThat(skylarkProviderDirectDepender.getStrictDependencyIncludes()).isEmpty();
+  }
+
+  @Test
   public void testSkylarkStrictDepsDoesNotSupportDefine() throws Exception {
     AssertionError e =
         assertThrows(
