To solve this optimization problem, we first need to identify the decision variables, constraints, and the objective function.

- **Decision Variables**: Let \(x_1\) be the amount (in kg) of Granny Smith apples produced, and \(x_2\) be the amount (in kg) of McIntosh apples produced.
- **Constraints**:
  - The farm can make at most 100 kg of Granny Smith apples: \(x_1 \leq 100\)
  - The farm can make at most 120 kg of McIntosh apples: \(x_2 \leq 120\)
  - The farm must supply at least 25 kg of Granny Smith apples: \(x_1 \geq 25\)
  - The farm must supply at least 50 kg of McIntosh apples: \(x_2 \geq 50\)
  - Each kg of both types of apples requires 3 hours in the cleaning machine, and the machine is available for at most 15 hours per day: \(3x_1 + 3x_2 \leq 15\)
- **Objective Function**: The profit per kg of Granny Smith apples is $2, and the profit per kg of McIntosh apples is $1. We want to maximize profit, so the objective function is: Maximize \(2x_1 + x_2\)

Given these elements, we can now formulate the problem in Gurobi code:

```python
from gurobipy import *

# Create a model
m = Model("Apple_Farm_Optimization")

# Define decision variables
x1 = m.addVar(lb=25, ub=100, vtype=GRB.CONTINUOUS, name="Granny_Smith_Apples")
x2 = m.addVar(lb=50, ub=120, vtype=GRB.CONTINUOUS, name="McIntosh_Apples")

# Define the objective function
m.setObjective(2*x1 + x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 <= 100, "Max_Granny_Smith")
m.addConstr(x2 <= 120, "Max_McIntosh")
m.addConstr(3*x1 + 3*x2 <= 15, "Cleaning_Machine_Time")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Granny Smith Apples: {x1.x} kg")
    print(f"McIntosh Apples: {x2.x} kg")
    print(f"Maximum Profit: ${m.objVal}")
else:
    print("No optimal solution found. The model is either infeasible or unbounded.")
```