获取Apple Music User Token返回nil且报SKErrorDomain Code=7错误,求助排查
解决Apple Music User Token获取返回nil且SKErrorDomain Code=7(401)的问题
你遇到的SKErrorDomain Code=7底层对应HTTP 401错误,这本质是身份验证失败,结合你的代码和Apple Music的规则,我整理了几个核心问题点和解决办法:
1. 开发者令牌(Developer Token)已过期
从你提供的开发者令牌内容来看,它的过期时间exp字段是1538438400,转换成北京时间是2018年9月30日,早就失效了!Apple Music开发者令牌的最长有效期是6个月,你必须:
- 重新使用Apple开发者后台的私钥生成一个有效期内的令牌
- 确保生成令牌时使用的是ES256签名算法,私钥和你的开发者账号对应无误
2. 授权流程未做有效性校验
你的代码里跳过了用户授权状态的检查,如果用户没有授权Apple Music,后续所有请求都会失败:
- 在
requestAuthorization的回调里,必须先判断status是否为SKCloudServiceAuthorizationStatusAuthorized,只有授权成功后再执行后续逻辑 - 修改后的授权校验代码示例:
[SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) { if (status != SKCloudServiceAuthorizationStatusAuthorized) { NSLog(@"请引导用户授权Apple Music权限"); return; } // 后续的cloudServiceController初始化、能力校验等逻辑放在这里 }];
3. App未配置Apple Music相关能力
- 打开Xcode的
Signing & Capabilities面板,确认已添加MusicKit能力 - 登录Apple开发者后台,检查你的App ID是否已启用Apple Music服务
4. 代码逻辑未处理中间步骤的错误
你嵌套的多层回调里没有检查每一步的错误,比如requestCapabilities或requestStorefrontIdentifier失败时,仍继续执行后续请求,这会导致无效的调用。建议在每个回调里先判断error是否存在,有错误则直接返回:
调整后的完整代码示例
NSString *developerToken = @"替换为你的新有效开发者令牌"; [SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) { if (status != SKCloudServiceAuthorizationStatusAuthorized) { NSLog(@"用户未授权Apple Music"); return; } SKCloudServiceController *cloudServiceController = [[SKCloudServiceController alloc] init]; [cloudServiceController requestCapabilitiesWithCompletionHandler:^(SKCloudServiceCapability capabilities, NSError * _Nullable error) { if (error) { NSLog(@"获取服务能力失败:%@", error); return; } // 确认设备支持Apple Music播放能力 if (!(capabilities & SKCloudServiceCapabilityMusicCatalogPlayback)) { NSLog(@"当前设备不支持Apple Music功能"); return; } [cloudServiceController requestStorefrontIdentifierWithCompletionHandler:^(NSString * _Nullable storefrontIdentifier, NSError * _Nullable error) { if (error) { NSLog(@"获取Storefront失败:%@", error); return; } if (@available(iOS 11.0, *)) { [cloudServiceController requestUserTokenForDeveloperToken:developerToken completionHandler:^(NSString * _Nullable userToken, NSError * _Nullable error) { if (error) { NSLog(@"获取User Token失败:%@", error); } else { NSLog(@"成功获取User Token:%@", userToken); } }]; } else { NSLog(@"iOS版本低于11.0,不支持获取User Token"); } }]; }]; }];
总结
最优先解决的是开发者令牌过期的问题,这是导致401错误的核心原因。更新令牌后,再依次检查授权流程、App能力配置,应该就能成功获取到User Token了。
内容的提问来源于stack exchange,提问作者New Coder




