Xcode11 iOS for MAC 遇到的問題

擇勢勤發表於2019-10-04

需要系統MacOS 10.15,Xcode11,OC程式碼和Swift程式碼專案都行。

MacOS 10.15之後,Xcode11 可以將iOS app秒變Mac app,對iOS開發者又將是一波潮流,MacOS的生態更加繁榮。Mac OS和iOS 系統還是有許多不同之處,有不同的框架庫,雖然蘋果官方做了相容處理,但大部分的第三方庫,並還未做完全相容。可能存在問題大概就是呼叫了廢棄方法,呼叫了iOS獨有類未終端限制等。 iOS 裝置上的強大的手勢操作,可以通過Macbook的觸控板部分實現。

用個小專案試了下,iOS可以執行for Mac。專案小隻用了AFNetWorking 和Masonry、MJExtension、DGActivityIndicatorView 庫,遇到問題和參照解決方法。

1、AFNetWorking 庫呼叫了廢棄方法

最新的AFNetworking 3.2.1

- (instancetype)initWithMemoryCapacity:(NSUInteger)memoryCapacity diskCapacity:(NSUInteger)diskCapacity diskPath:(nullable NSString *)path API_DEPRECATED_WITH_REPLACEMENT("initWithMemoryCapacity:diskCapacity:directoryURL:", macos(10.2,API_TO_BE_DEPRECATED), ios(2.0,API_TO_BE_DEPRECATED), watchos(2.0,API_TO_BE_DEPRECATED), tvos(9.0,API_TO_BE_DEPRECATED)) API_UNAVAILABLE(uikitformac);
=> API_UNAVAILABLE(uikitformac);
複製程式碼

也許您應該使用新的API:

- (instancetype)initWithMemoryCapacity:(NSUInteger)memoryCapacity diskCapacity:(NSUInteger)diskCapacity directoryURL:(nullable NSURL *)directoryURL API_AVAILABLE(macos(10.15), ios(13.0), watchos(6.0), tvos(13.0));
複製程式碼

問題已提交到github,但AFNetworking還未更新,可以手動修改unlock儲存。執行,若有pod install 需要再修改過了。

2、UIWebView + AFNetworking 編譯不通過

MacOS上並不在使用UIWebView ,因此UIWebView + AFNetworking不能編譯通過, 如果您未使用UIWebView+AFNetworking,您可以臨時刪除這個類和相關引用。

3、 WCDBOptimizedSQLCipher 存在gethostuuid() 問題

WCDB 庫是一個不錯的sqlite管理庫。但是在forMac編譯時,可以將如下定義

#if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \
                           (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000))
#  if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \
       && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0))
#    define HAVE_GETHOSTUUID 1
#  else
#    warning "gethostuuid() is disabled."
#  endif
#endif
複製程式碼

修改為

#if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \
                           (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000))
#  if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \
       && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) \
       && !defined(TARGET_OS_UIKITFORMAC)
#    define HAVE_GETHOSTUUID 1
#  else
#    warning "gethostuuid() is disabled."
#  endif
#endif
複製程式碼

新增 !defined(TARGET_OS_UIKITFORMAC) 的判斷。

注意: 以上修改若有pod install 需要再次修改。

4、SocketRocket 庫在for Mac問題較多,我暫時不需要,就移除了這個庫,後續再補充方法。

5、介面效果對比圖

iOS app示例圖

MacOS  app示例圖

原文連結

相關文章