You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Apple Pay应用内配置扩展:init调用后viewDidLoad未触发

解决Apple Pay In-App Provisioning授权扩展viewDidLoad未执行的问题

核心问题分析

你的授权扩展主类虽遵守了PKIssuerProvisioningExtensionAuthorizationProviding协议,但未实现协议要求的关键方法,同时视图控制器未正确提供可显示的视图,导致Wallet加载扩展时无法完成视图初始化流程,viewDidLoad因此不会触发。

具体修复步骤

1. 实现协议必要方法

PKIssuerProvisioningExtensionAuthorizationProviding协议要求必须实现startAuthorizationWithPresentationCompletion:方法,系统通过该方法触发授权流程并获取要显示的视图。在主类中添加该方法:

- (void)startAuthorizationWithPresentationCompletion:(void (^)(UIViewController * _Nullable))presentationCompletion {
    NSLog(@"startAuthorizationWithPresentationCompletion");
    // 将当前控制器传入回调,让Wallet显示你的视图
    presentationCompletion(self);
}

2. 确保视图控制器有可加载的视图

如果未使用xib/storyboard,需手动创建视图避免视图为nil:

- (instancetype)init {
    NSLog(@"--- init");
    self = [super init];
    if (self) {
        // 手动创建视图并设置背景色,确保视图可显示
        self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.view.backgroundColor = [UIColor whiteColor];
    }
    return self;
}

如果使用xib,需确保xib文件名与控制器类名一致,或在Info.plist的NSExtension字典下添加NSExtensionNibName指定xib文件。

3. 检查Info.plist配置

确认NSExtensionPrincipalClass的类名正确,若使用模块需写成$(PRODUCT_MODULE_NAME).IssuerProvisioningViewController,避免类找不到的情况。

4. 验证权限和环境

确保开发者账号已开通Apple Pay支付卡配置权限,测试设备的iOS 16.4.1版本支持该扩展能力,且使用包含com.apple.developer.payment-pass-provisioning权限的测试配置文件。

修复后的完整主类实现示例

#import "IssuerProvisioningViewController.h"
#import <PassKit/PassKit.h>

@interface IssuerProvisioningViewController ()<PKIssuerProvisioningExtensionAuthorizationProviding>

@end

@implementation IssuerProvisioningViewController

@synthesize completionHandler;

- (instancetype)init {
    NSLog(@"--- init");
    self = [super init];
    if (self) {
        self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.view.backgroundColor = [UIColor whiteColor];
    }
    return self;
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSLog(@"--- initWithNibName nibNameOrNil");
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    // 在这里添加你的授权UI逻辑,比如登录表单、验证控件等
}

- (void)startAuthorizationWithPresentationCompletion:(void (^)(UIViewController * _Nullable))presentationCompletion {
    NSLog(@"startAuthorizationWithPresentationCompletion");
    presentationCompletion(self);
}

@end

内容的提问来源于stack exchange,提问作者user9546646

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:25:41