微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

API_DEPRECATED宏中的平台问题

如何解决API_DEPRECATED宏中的平台问题

在我的应用程序中,我想将某些类标记为已弃用的API。为此,我使用了宏API_DEPRECATED

  /*
     * API Deprecations
     *
     * Use to specify the release that a particular API became unavailable.
     *
     * Platform names:
     *   macos,ios,tvos,watchos
     *
     * Examples:
     *
     *    API_DEPRECATED("No longer supported",macos(10.4,10.8))
     *    API_DEPRECATED("No longer supported",10.8),ios(2.0,3.0),watchos(2.0,tvos(9.0,10.0))
     *
     *    API_DEPRECATED_WITH_REPLACEMENT("-setName:",tvos(10.0,10.4),ios(9.0,10.0))
     *    API_DEPRECATED_WITH_REPLACEMENT("SomeClassName",10.6),3.0))
     */

    #define API_DEPRECATED(...) __API_DEPRECATED_MSG_GET_MACRO(__VA_ARGS__,__API_DEPRECATED_MSG8,__API_DEPRECATED_MSG7,__API_DEPRECATED_MSG6,__API_DEPRECATED_MSG5,__API_DEPRECATED_MSG4,__API_DEPRECATED_MSG3,__API_DEPRECATED_MSG2,__API_DEPRECATED_MSG1,0)(__VA_ARGS__)

我以这种方式使用此宏:

API_DEPRECATED("UIFont",ios(7.0,API_TO_BE_DEPRECATED)) // here I have a warning: UnkNown platform '__API_DEPRECATED_PLATFORM_' in availability macro

如何使用此宏将我的API标记为已弃用?

UPD API_TO_BE_DEPRECATED在可用性中定义。h:

/* 
 * API_TO_BE_DEPRECATED is used as a version number in API that will be deprecated 
 * in an upcoming release. This soft deprecation is an intermediate step before formal 
 * deprecation to notify developers about the API before compiler warnings are generated.
 * You can find all places in your code that use soft deprecated API by redefining the 
 * value of this macro to your current minimum deployment target,for example:
 * (macOS)
 *   clang -DAPI_TO_BE_DEPRECATED=10.12 <other compiler flags>
 * (iOS)
 *   clang -DAPI_TO_BE_DEPRECATED=11.0 <other compiler flags>
 */
 
#ifndef API_TO_BE_DEPRECATED
#define API_TO_BE_DEPRECATED 100000

我找到了NS_CLASS_DEPRECATED_IOS,但是此宏仅适用于iOS。我在项目中使用了它,但想找到一些通用的解决方案:

#define MARK_CLASS_DEPRECATED(MSG) NS_CLASS_DEPRECATED_IOS(3_0,10_0,MSG)
#define MARK_METHOD_DEPRECATED(MSG) NS_DEPRECATED_IOS(3_0,MSG)

解决方法

使类仅从某些特定的OS版本开始可用。

API_AVAILABLE(ios(13.0))
@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>
@property (strong,nonatomic) UIWindow * window;
@end

仅提供特定版本的资源,并提示要使用的其他内容

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong,nonatomic) UIWindow *window
API_DEPRECATED_WITH_REPLACEMENT("SceneDelegate:window",ios(2.0,13.0)) NS_DEPRECATED_IOS(2.0,13.0);
...

将属性定义为已弃用,因此,在未警告开始特定操作系统版本的情况下不能使用该属性。

...
@property (strong,nonatomic) ExternalDisplay *externalDisplay
NS_DEPRECATED_IOS(2.0,13.0);
@end

定义从特定OS版本开始可用的方法实现

- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions API_AVAILABLE(ios(13.0)) {
    // your code
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。