在delphi Tokyo下,如果您查看例如iOSapi.MapKit.pas
,则可以看到仅在NOT defined(CPUARM)
时才触发初始化部分(基本上,初始化部分仅针对iOS Simulator运行):
{$IF defined(IOS) and NOT defined(CPUARM)}
initialization
MapKitModule := dlopen(MarshaledAString(libMapKit), RTLD_LAZY);
finalization
dlclose(MapKitModule);
{$ENDIF IOS}
但是当您看到iOSapi.CoreTelephony.pas
时,情况并非如此:
initialization
CoreTelephonyModule := dlopen(MarshaledAString(libCoreTelephony), RTLD_LAZY);
finalization
dlclose(CoreTelephonyModule);
end.
知道为什么吗?今天,我遇到一个奇怪的错误,我以与PHPhotoLibrary
相同的方式实现iOSapi.MapKit.pas
(照片框架),
{$IF defined(IOS) and NOT defined(CPUARM)}
initialization
PhotosModule := dlopen(MarshaledAString(libPhotos), RTLD_LAZY);
finalization
dlclose(PhotosModule);
{$ENDIF IOS}
它可以在我的iPad Pro中工作,但在出现错误的iPhone 7上却不:
找不到ObjectiveC类PHPhotoLibrary
当我执行TPHPhotoLibrary.OCClass.authorizationStatus
删除{$IF defined(IOS) and NOT defined(CPUARM)}
可以使代码在Iphone 7上正常工作。那么正确链接Apple Ios库(Apple框架中的库)应遵循的规则是什么?是否一直使用dlopen?