Seattle (4-8) snapped a three-game losing streak but it wasn’t easy as a number of mistakes gave the 49ers a chance for a tying touchdown in the final moments.
Gerald Everett fumbled at the San Francisco 2 with 4:03 remaining and Seattle on the cusp of a clinching score. Jimmy Garoppolo led the 49ers 95 yards to the Seattle 3. But his third-down pass for Trent Sherfield was broken up by Sidney Jones, and his fourth-down pass was deflected at the line of scrimmage by Carlos Dunlap.
It was the second big play by Dunlap, who sacked Garoppolo for a safety early in the third quarter.
Newly signed running back Adrian Peterson moved into a tie with Jim Brown for 10th all-time with 126 career touchdowns, scoring on a 1-yard run in the second quarter for Seattle.
Wilson threw a 7-yard touchdown to Dee Eskridge in the second quarter and his 12-yard touchdown to Tyler Lockett late in the third quarter provided the winning points.
Travis Homer also ran 73 yards for a touchdown on a fake punt on the opening possession of the game for Seattle.
San Francisco (6-6) saw its three-game win streak snapped and was swept by Seattle this season. The 49ers were unable to get their run game going as in recent weeks, with Elijah Mitchell rushing for 66 yards on 22 carries.
Garoppolo threw for 299 yards and two TDs, but also had a pair of interceptions, the second grabbed by Quandre Diggs and setting up Seattle’s go-ahead touchdown.
George Kittle had nine catches for 181 yards and two touchdowns, but was shut down in the second half until the final drive.
On that final drive it took San Francisco five plays to reach the Seattle 30, including completions to Kittle of 29 and 14 yards. Brandon Aiyuk’s 11-yard catch got the 49ers to the Seattle 7, two runs by Mitchell yielded only 4 yards and Garoppolo couldn’t connect on his last two throws.
San Francisco reserve running back Trenton Cannon was taken off the field on a backboard after a scary collision on the opening kickoff against Seattle. Cannon was attempting to make a tackle on DeeJay Dallas when his head hit the leg of a teammate. The 49ers said Cannon had a concussion, was in stable condition at a Seattle area hospital, and would remain overnight for observation.
Kittle was just the second tight end in the past five seasons with at least 100 yards receiving and two touchdowns in the first half. Darren Waller also did it last season against the Jets. Kittle had five catches for 121 yards and two TDs in the first half.
The 49ers didn’t have starting wide receiver Deebo Samuel due to a groin injury, starting linebacker Fred Warner (hamstring) and LB Marcell Harris (concussion). CB Emmanuel Moseley suffered an ankle injury in the first quarter and did not return.
Seattle was without starting RB Alex Collins, who had been dealing with an abdominal/core injury for several weeks, and left guard Damien Lewis. Seattle lost safety Jamal Adams to a shoulder injury late in the first half. Adams returned to the sideline in the third quarter in sweats.
49ers: San Francisco is at Cincinnati next Sunday.
Seahawks: Seattle is at Houston next Sunday.