开发
方法分发时,始终使用沙盒环境。App Store Connect(App Store和TestFlight)
、Ad Hoc
和企业级
方法分发应用程序。有关更多信息,请参见"Distributing Your App for Beta Testing and Releases"。embedded.mobileprovision
,而在macOS或Catalyst上,它是embedded.provisionprofile
。您无法读取App.entitlements
,因为该文件并不总是可用。相反,embedded.mobileprovision
包含一个字典(以XML格式)。这是我从测试应用程序中提取的此文件的示例。它包含,除其他外:<key>Entitlements</key>
<dict>
<key>aps-environment</key>
<string>development</string>
...
xcarchive
的包内容(/Users/username/Library/Developer/Xcode/Archives/2021-08-28/projectName\ 28-08-2021,\ 08.17.xcarchive/Products/Applications/projectName.app/embedded.mobileprovision
),并且在finder预览中显示得很好。Firebase iOS SDK中也有一条注释: * @param type The type of APNs token. Debug builds should use
* FIRMessagingAPNSTokenTypeSandbox. Alternatively, you can supply
* FIRMessagingAPNSTokenTypeUnknown to have the type automatically
* detected based on your provisioning profile.
您可以阅读FIRMessagingTokenManager.m
,或阅读我在不同文件中的分析:
在Firebase iOS SDK中,如果您未传递类型(沙盒/生产)或明确传递FIRMessagingAPNSTokenTypeUnknown
,则会运行此代码:
if (type == FIRMessagingAPNSTokenTypeUnknown) {
isSandboxApp = FIRMessagingIsSandboxApp();
}
这是
BOOL FIRMessagingIsSandboxApp(void) {
static BOOL isSandboxApp = YES;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
isSandboxApp = !FIRMessagingIsProductionApp();
});
return isSandboxApp;
}
FIRMessagingIsProductionApp 是一个长达119行的方法。它是用来做什么的?它几乎总是默认为生产应用程序,有很多Firebase特定的配置逻辑,并检查如果在iOS模拟器上运行,则是否为生产环境,如果应用程序是通过AppStore或TestFlight交付的。
从根本上讲,它会检查 embedded.provisionprofile
或 embedded.mobileprovision
(这就是生成 plistMap
的方式):
// plistMap is loaded from the provisioning profile in a multi step process.
NSString *apsEnvironment = [plistMap valueForKeyPath:kEntitlementsAPSEnvironmentKey];
if ([apsEnvironment isEqualToString:kAPSEnvironmentDevelopmentValue]) {
return NO;
}
在配置文件中,他们引用以下密钥:
#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH
static NSString *const kEntitlementsAPSEnvironmentKey = @"Entitlements.aps-environment";
#else
static NSString *const kEntitlementsAPSEnvironmentKey =
@"Entitlements.com.apple.developer.aps-environment";
#endif
static NSString *const kAPSEnvironmentDevelopmentValue = @"development";
0
,会“停止”ASCII解析器,或者大于127的值,是无效的。)NSPropertyListSerialization
将此数据转换为字典ProvisionedDevices
键,如果存在,则为开发配置文件。kEntitlementsAPSEnvironmentKey
最后,一旦Firebase iOS SDK知道设备(和APNs设备令牌)正在生产/开发中运行,它可以告诉APNs提供者(与APNs连接的服务器)使用正确的端点,即api.push.apple.com:443
和api.sandbox.push.apple.com:443
,又名api.development.push.apple.com:443
(它只是指向沙盒的CNAME)。这个isProduction
或isSandbox
布尔值可能会与APNs设备令牌一起存储在Firebase数据库中。
我在关于 FIRInstanceIDAPNSTokenType
的文档中找到了答案。
http://cocoadocs.org/docsets/FirebaseInstanceID/1.0.6/Constants/FIRInstanceIDAPNSTokenType.html
应用的APNS令牌类型。如果令牌类型设置为UNKNOWN,则InstanceID将隐式尝试从预配文件中确定实际的令牌类型。因此,答案是“实际的令牌类型由预配文件确定”,可能是通过“aps-environment”键确定的。