You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

获取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. 代码逻辑未处理中间步骤的错误

你嵌套的多层回调里没有检查每一步的错误,比如requestCapabilitiesrequestStorefrontIdentifier失败时,仍继续执行后续请求,这会导致无效的调用。建议在每个回调里先判断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

火山引擎 最新活动