Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 81

0
votes
answers
16 views
+10

懶VS初始化爲迅速

0

我使用Socket.io庫的實時功能添加到我的應用程序單的設計,和我使用Singleton設計懶VS初始化爲迅速

import SocketIO 

class SocketIOManager: NSObject { 

    static let sharedInstance = SocketIOManager() 

    var socket: SocketIOClient! 

    func establishConnection() { 
     socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
     socket.connect() 

    } 

    func closeConnection() { 
     socket.disconnect() 
    } 

} 

因此從技術上講,只要我的應用程序加載up socket不能爲零,否則會崩潰。我發現了兩個解決方案,可以解決這個問題

  1. lazy var socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
    

通過使用這種方法socket永遠是零,因爲它總是會被初始化。但這種方法的問題是,如果創建SocketIOClient不便宜,那麼它將是一個很好的使用方法。

  • 初始化()

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient! 
    
    
    
    init() { 
         super.init() 
         socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        } 
    } 
    
  • 通過使用該方法,我有點困惑,因爲我不最初創建SocketIOManager對象像

    let socket = SocketIOManager() 
    

    因爲如果我沒有錯誤的套接字將被初始化,如果只有對象被創建,我不確定abou t在單例設計中使用init()

    哪種方法適合我的用例?

    沙发
    0
    1

    在斯威夫特全局變量,包括類的靜態成員默認情況下,所以這是正確的:

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient! 
    
        private override init() { 
         super.init() 
         socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        } 
    } 
    

    註上的init,以防止他人試圖實例化這個類的私人,因爲它是一個單身人士。

    +0

    我得到這個錯誤'屬性'self.socket'沒有初始化super.init調用' – airsoftFreak

    +1

    'socket = SocketIOClient(soc ....'需要超過'super.init()',然後'編譯:假設'SocketIOClient(socketURL:config)'不是failable初始值設定項。 –

    板凳
    0
    1

    documentation

    存儲類型屬性在他們的第一次訪問延遲初始化。它們保證只被初始化一次,即使同時被多個線程訪問,也不需要使用lazy修飾符進行標記。

    推薦的方法是申報插座作爲非可選,首先初始化屬性,然後調用super

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient 
    
        init() { 
         socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
         super.init() 
        } 
    } 
    

    或者初始化socket與閉合,但是這需要有對其他沒有訪問屬於同一類。

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let socket: SocketIOClient = { 
         return SocketIOClient(socketURL: URL(string: "https://server.com/path")!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        }() 
    } 
    

    或者,如果mainURL被宣佈爲你可以初始化socket懶洋洋地在同一類常量。這意味着套接字將首先在上初始化。

    class SocketIOManager: NSObject { 
    
        static let sharedInstance = SocketIOManager() 
    
        let mainURL = URL(string: "https://server.com/path")! 
    
        lazy var socket: SocketIOClient = { 
         return SocketIOClient(socketURL: mainURL, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) 
        }() 
    } 
    

    在第二和第三情況下,不需要額外的init方法。

    +0

    如果'getToken()'不存在,那麼它將不會建立連接,因爲最初套接字被加載沒有令牌如何重新初始化socket? – airsoftFreak

    +0

    沒有人能讀懂你的想法什麼是getToken()?如果你需要一個ad hoc連接,一個singleton可能是錯誤的解決方案,或者你必須將套接字' var'並且根據需要創建一個新的 – vadian

    +0

    ''token「'在'.connectParams'的init函數中。 – airsoftFreak

    0
    votes
    answers
    8 views
    +10

    如何在swift4中創建公共屬性

    -1

    我需要項目中的公共屬性,以便我可以使用或共享應用程序。 我已經嘗試了許多解決方案,但沒有工作。 我認爲這會使許多事情變得簡單和可重用。如何在swift4中創建公共屬性

    沙发
    0
    3

    您可以使用擴展 作爲

    https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID383

    記錄,你可以改變以前定義的類特性

    例如

    extension UIColor { 
    
        class var customGreen: UIColor { 
         let darkGreen = 0x008110 
         return UIColor.rgb(fromHex: darkGreen) 
        } 
    } 
    
    +0

    正是我在找的東西。謝了哥們。 –

    板凳
    0
    1

    使用iOS設計模式「Singleton」
    它只對一個類使用一個引用,同一個屬性會反映出你在整個應用中使用它的地方。

    參考:https://thatthinginswift.com/singletons/

    +2

    儘可能避免單身人士。 這裏是一個視頻教程,說明單身人士的問題 - 以及如何解決它們:https://youtu.be/Uf0s3LTaj3k 順便說一句,Singleton是*不* iOS設計模式。這是幾十年前由「四人幫」制定的標準之一。甚至作者認爲辛格爾頓是一件邪惡的事情。現在我們對這個問題有了更好的解決方案,例如依賴注入。 –

    地板
    0
    1

    您可以通過聲明公開的structenum來創建輕量級的「名稱空間」。然後,只需添加你的static變量,你就可以安全地分享它。 作爲一個額外的好處,你可以免費獲得線程安全。 (靜態存儲的屬性初始化是線程安全的。)

    public enum SharedConstants { 
        public static var id = "MyID" 
        public static var hashCode = 12345678 
    } 
    

    順便說一句,擴展,如果你想提高現有類型是巨大的。類型擴展允許您在不修改其原始代碼的情況下向類型添加新功能。 但是,如果您只需要共享共享屬性,則擴展可能不是最佳選擇。

    127
    votes
    answers
    28 views
    +10

    Cannot generate iOS App archive in xcode

    I have a problem generating a iOS App archive from an application. The application compiles just fine and even works in the simulator. Now I wanted to make som ad hoc testing and cannot generate the iOS App Archive. When I click on the Product -> Archive it generates a generic xcode archive. Can anyone help me. I should mention, that I have already generated an iOS App Archive of this application. It has just stopped to generate iOS Archive for some reason. Thanks a lot.

    沙发
    +430

    我做了以下工作讓它對我有用:

    1. 我有一個三維靜態庫,我使用了 cocoapods 包含主項目中的文件
    2. 跟隨所有其他子項目/靜態庫的跳過安裝,並將復制標題從公共項目切換到項目如上所述項目使用的每個庫中
    3. 最重要的是轉到構建階段 - &gt; 複製文件並確保將目標絕對路徑更改為 products directory 注意:請參閱下面的提示以縮小搜索範圍以查找導致此錯誤的庫。 < 那就是它!

      提示:了解導致存檔創建存檔文件而不是ipa的違規文件:

      1. 選擇存檔,然後單擊“分發”按鈕。
      2. 選擇“保存已建立的產品”選項。
      3. 點擊下一步並保存。
      4. 在Finder中瀏覽創建的目錄。
      5. 'libraries'子目錄將標識將Skip Install設置為Yes所需的庫。
      6. 在某些情況下 usr / local / include 將識別您需要從Public移動到Project的罪魁禍首頭文件或您必須從絕對路徑更改為products目錄的文件(甚至是您忘記將skip install設置為yes標記的文件)。但該目錄(即usr / local / include)因子庫目錄結構而異。在許多情況下..您會在此處列出的步驟3中看到所有 複製文件下列出的文件。如果你在這裡找到它們,那麼你對問題的原因有明確的答案。

        更新提示:讓生活變得更加簡單..上面提示中步驟4下顯示的任何文件..只需在xcode的全局搜索中搜索它。

    很棒的提示!我已將一些框架標題更改為“私有”; 出於某種原因,這導致它們被複製到./usr/local/include。 - Ben Mosher 2013年7月1日13:56

    能夠幫助@BenMosher總是很高興:) - abbood 2013年7月1日14:06

    我得到的最佳答案。謝謝你的提示,節省了我的一天。! - neywen 2013年8月3日8:09

    絕對是我正在尋找的答案 - 保存構建產品指出了問題的確切原因。 - Dennis L 2015年8月7日16:42

    “Save Built Products”的廣泛答案非常有用 - @abbood,非常感謝你。希望有一天我能回報他們。 - Scott Corscadden於2016年11月2日15:55

    板凳
    +210

    如果您導出存檔,請將其打開,然後在產品中查看 / urs / local / include ,嘗試此建議

    在每個pod中, Packaging Private Headers Folder Path Public Headers Folder Path 設置為 / usr / local / include 如果我清除它們,那麼我會得到一個有效的存檔。

    我可以確認這是有效的!只要你記得清除私有和公共標題路徑。它也相當容易,如果你只選擇所有pod,搜索標題路徑,然後同時清除它們。 - 迪克斯2015年9月20日11:23

    我也可以確認這是有效的,節省了我很多時間,這發生在我將我的pod升級到0.39.0.beta版本時--Bryan P 2015年9月21日6:00

    也為我工作...非常感謝.... XD - rihurla 2015年9月21日18:47

    真棒。為我工作:)我在1天半的時間裡苦苦掙扎。謝謝,謝謝,謝謝:) :) :) - Srikanth 2015年9月21日18:49

    我認為這是適合我的Xcode 7.0 iOS9。我沒有任何cocoapods,但這解決了這個問題。謝謝男人 - 傑夫H 2015年9月26日8:40

    地板
    +120

    如果你正在使用CocoaPods以及WatchKit或今日推廣,那麼就會有一個開放的問題 CocoaPods回購解釋了你的問題。

    解決方案對我來說是從WatchKit Extension和Today Extension中刪除 Copy Pod Resources 階段 Build Phases 下的目標。一旦我這樣做,該項目按照預期進行編譯和存檔。

    希望這對某人有所幫助,這讓我難以忍受了一整天!

    希望我能為此付出多於一票! - Lewis42 2015年9月20日20:04

    @ Lewis42可以隨時添加賞金;) - rebello95 2015年9月20日22:17

    沒有看到一個選項,你的評論必須做一個投票;) - Lewis42 2015年9月21日在3:20

    @ Lewis42你必須在這個問題上加上賞金並將其獎勵給答案lol - rebello95 2015年9月21日在6:49

    @ rebello95,你搖滾老兄! - 馬特2015年9月25日8:56

    4楼
    +100

    如果上述任何一個答案都不起作用,那麼您的問題可能在於 cocoaPods 最新的更新 0.38.1 為我搞砸了,但隨後我降級為 0.37.1 ,事情恢復正常。使用 Xcode 6.3.1

    稍後編輯:更新到 0.38.2 也將解決這個問題。有關此問題的更多信息,請訪問: Cocoapods 0.38.1無法創建有效的存檔 < / p>

    我更新到0.38.2仍然有問題。你在Xcode 7嗎? - 波特霍斯金斯2015年8月12日20:02

    @PorterHoskins我剛剛寫了這個問題,因為Xcode 7不會在Xcode 6中構建有效存檔的同一個項目中構建一個有效的存檔。我使用Cocoa Pods 0.38.2,當使用Xcode 6時一切都很好,但是使用Xcode 7未正確創建存檔。你有沒有檢查過你的文件夾結構,看看你的.app文件包裡面是否有.appex文件? - 北極熊2015年8月14日5:29

    我在/ Library / Frameworks有一個框架。我認為這可能與穀歌的可可豆莢沒有被構建為動態框架有關。它聽起來類似於github.com/CocoaPods/CocoaPods/issues/3889 - Porter Hoskins 2015年8月14日16:16

    我將Build Phases / Headers中的每個pod標題從公共部分移動到項目部分,並且它工作正常。確實問題可能在於CocoaPods。 - wzbozon 2015年9月3日19:18

    5楼
    +70

    雖然我正在使用Xcode5,但為我編制的內容是編輯構建方案 - 嘗試上述所有適用的建議對我的情況沒有幫助。

    我有兩個目標,比如,“App”和“App FREE”。當我試圖存檔免費版本時,我發現通用存檔的問題,我在應用程序的“正常”版本之後添加了該版本。在我的例子中,當我在工具欄中選擇了Scheme並選擇了Edit Scheme時......我看到Build部分有兩個目標,即App和App FREE。

    我取消選中App的所有列,只留下選中App FREE列,然後單擊確定。下次我選擇Product&gt; 存檔我的應用程序免費而不是通用存檔。:)

    這在XCode6中對我有用。 - malaki1974 2015年3月30日20:02

    這也適用於我,在Xcode 7中。謝謝。 - Aleph72 2016年1月14日12:12

    在Xcode 6中,您只需轉到菜單>窗口>設備>模擬器,然後刪除不需要的模擬器。 - Nimit Parekh 2015年6月19日13:39

    @NeonSamuel:我已經嘗試了這個並沒有幫助(在我的問題上看到倒數第二行)。 - Ricardo Sanchez-Saez 2015年6月19日13:41

    你必須從/ Library / Developer / CoreSimulator / Profiles / Runtimes中刪除它們 - Nimit Parekh 2015年6月19日13:53

    6楼
    +60

    如果你只有一個項目,也許這個解決方案會很有用。當我複制目標時發生了這個問題。結果我有兩個並行構建的目標。這導致了這個問題。構建了通用IOS存檔。

    要將並行內置關閉轉到

    • 管理方案,
    • 編輯方案,
    • 構建,
    • 刪除其他目標。
    7楼
    +50

    在更新到iOS 9和Xcode 7之後我遇到了這個問題.Josh H的解決方案適用於我:

    在每個pod中,在Packaging,Private Headers Folder Path和Public Headers Folder Path下設置為/ usr / local / include。如果我清除它們,那麼我會獲得一個有效的存檔。

    我還為我的Podfile創建了一個安裝後腳本來自動執行此操作!

      post_install do | installer_representation | installer_representation.pods_project.targets.each do | target | target.build_configurations.each do | config | config.build_settings ['PUBLIC_HEADERS_FOLDER_PATH'] = [“”]; config.build_settings ['PRIVATE_HEADERS_FOLDER_PATH'] = [“”];
         
    			
            
    8楼
    +50

    我的工作區中有多個項目,(GTL,Pods和我的主項目),這對我有用:

    選擇項目,那裡會有2種類型,有項目並且目標

    對於非主要項目,如 GTL PODS < / code>:

    項目:

     跳過安裝=否安裝目錄= / Applications //對於pods Private Headers Folder Path =“”Public Headers Folder Path =“”  

    目標: <預> <代碼>跳過安裝= YES安裝目錄= /應用程序//對於pods私有標題文件夾路徑=“”公共標題文件夾路徑=“”

    對於主項目(通常命名與您的產品名稱相同):

    項目:

     跳過安裝=否安裝目錄= /應用程序  

    目標:

     跳過安裝=否安裝目錄= /應用程序  

    檢查每個項目和目標上的ios部署目標,確保它們完全相同。 Public Headers Folder Path =“”

    對於主項目(通常與您的產品名稱相同):

    < strong> 項目:

     跳過安裝=無安裝目錄= /應用程序  

    目標:

     跳過安裝=無安裝目錄= /應用程序  

    檢查ios每個項目和目標的部署目標,以確保它們都是相同的。 Public Headers Folder Path =“”

    對於主項目(通常與您的產品名稱相同):

    < strong> 項目:

     跳過安裝=無安裝目錄= /應用程序  

    目標:

     跳過安裝=無安裝目錄= /應用程序  

    檢查ios每個項目和目標的部署目標,以確保它們都是相同的。 對於主項目(通常與您的產品名稱相同):

    項目:

      Skip Install = NO安裝目錄= / Applications   

    目標:

     跳過安裝=否安裝目錄= /應用程序  

    檢查每個項目和目標上的ios部署目標,以確保它們完全相同。 < /強> 對於主項目(通常與您的產品名稱相同):

    項目:

      Skip Install = NO安裝目錄= / Applications   

    目標:

     跳過安裝=否安裝目錄= /應用程序  

    檢查每個項目和目標上的ios部署目標,以確保它們完全相同。 < /強> 跳過安裝=否安裝目錄= /應用程序

    目標:

     跳過安裝=否安裝目錄= / Applications   

    檢查每個項目和目標上的ios部署目標,以確保它們完全相同。 < / p>跳過安裝=否安裝目錄= /應用程序

    目標:

     跳過安裝=否安裝目錄= / Applications   

    檢查每個項目和目標上的ios部署目標,以確保它們完全相同。 < / p>

    Thanx一步一步地解釋它。這真的幫助我解決了我的問題。 - Arslan 2015年11月7日20:56

    9楼
    +40

    我有這個問題。就我而言,這是因為將Mac應用程序目標保留為iOS應用程序的依賴項。

    設置這樣的原因是Mac應用程序是用於生成一些數據的工具。 iOS應用程序,然後包含在捆綁包中。

    我必須刪除該依賴項並在構建iOS應用程序之前單獨構建該工具。

    像lippd這樣的庫都有ios和osx目標,我忘了刪除osx目標... doh - james_alvarez 2015年5月7日16:44

    10楼
    +40

    在我的場景中,只有在我開始在主要的Objective-C項目中包含Swift代碼之後才得到錯誤的“通用存檔”。在對Xcode正在吐出的存檔文件進行大量的故障排除和檢查之後,我注意到 SwiftSupport 文件夾(帶有Swift運行時所需的dylib)在我的存檔中位於不同於vanilla全新的Swift項目應用檔案。

    我找到了安裝目錄構建設置,並註意到它已設置為我項目中的自定義路徑。我只是刪除它(將其設置為 / Applications 的通用值)和下一個Build - &gt; 存檔我確實按預期工作,並給了我一個合適的iOS App Archive。

    TL; DR:<

    11楼
    +30

    離開這里以拯救其他人從同一個旅程。

    我發現我需要從工作空間中的靜態庫目標中刪除相同的Copy Pod Resources構建階段。

    在嘗試了很多上面的東西後,這對我有用(Xcode 7) - humphriesj 2015年11月19日0:06

    12楼
    +20

    除了Alex L的回答。

    要點3.更改'構建設置' - &gt; “include / xxx”的“公共標題文件夾路徑”也有效。

    這比上面的#3更正確。如果您正在構建靜態庫,那麼您的標題需要公開 - bcattle 2014年4月18日6:17

    13楼
    +20

    如果以上都沒有幫助你...經過很長時間後.......

    我刪除了Info.plist中Bundle Version的值因為我很滿意Bundle Version Short 1.0。壞。不要這樣做。

    *注意我實際上是通過在右邊的UI中編輯它而沒有意識到它會在Info.plist文件中放入一個空鍵。我認為這使它無效。我的軟件包在存檔時顯示為其他項目,沒有圖標,我無法上傳到任何地方。

    這歸結為Info.plist中的無效值。如果它不是有效的存檔,請嘗試解壓縮舊存檔並刪除/覆蓋當前存檔,並在重建存檔時查看它是否已修復。

    14楼
    +10
    1. 轉到構建設置並將

      yourAppName / Resources / dist.plist 添加到代碼簽名權利

    2. cmd + B iOS設備 Real Device 選擇為Build Target

    3. 完成後 - > 滾動到“產品”文件夾並右鍵單擊您的AppName.app

    4. 選擇“在Finder中顯示”

    5. 創建一個名稱有效負載的文件夾(資本“P”

    6. 複製

    15楼
    +10

    嘗試幾乎所有事情后:

    • 清理,存檔
    • 刪除DerivedData,存檔
    • 重新啟動Xcode(我使用的是XCode7),存檔
    • 上面的組合......

      然後我注意到我的啟動分區'可用磁盤空間不足'...大約1GB左右。我重新啟動,然後獲得了大約18GB的免費。

      然後打開Xcode和項目,執行存檔......並且令人驚訝地(在嘗試構建存檔一小時後)我終於獲得了非通用存檔。

      不知道它是一個修復它的可用磁盤問題還是修復它的macOS重啟,但它對我有用。

    16楼
    +10

    如果您在Project&gt;目標&gt;構建階段&gt;目標依賴項中有任何.xcodeproj文件,請從那裡刪除它,然後構建您的ipa。這個對我有用。乾杯

    您可以在此處獲得答案: xcode正在創建通用xcode存檔而不是iOS App Archive < / p>

    17楼
    0

    就我而言,我必須將FMDB和BlocksKit都移動到靜態庫。以前它們是作為子項目建造的。請記住,您可以使用lipo來創建通用庫。在構建最終產品時,模擬器代碼將自動剝離。

    18楼
    0

    另一個可能的原因是在“目標依賴關係”中引用了不同平台的項目。在我的特定情況下,我正在開發一個共享OSX和iOS代碼的項目。在其中一個iOS目標中,我不小心將OSX目標添加為依賴項。

    19楼
    0

    為了徹底,我發布了我的解決方案。

    我在Xcode 5.1.1(5B1008)中嘗試構建iOS項目的存檔時遇到了同樣的問題。以上建議都沒有解決問題,而且大多數都沒有關係(我沒有添加任何框架,並且在我的構建階段的“複製標題”部分中沒有任何公共條目。)

    在我的解決問題包括簡單地關閉我的項目,刪除我之前製作的任何檔案,轉到首選項&gt; 帳戶,刪除我的開發者帳戶,退出Xcode,重新啟動,重新添加我的開發者帳戶,再次啟動存檔過程。這立刻解決了我的問題。

    20楼
    0

    還有一個解決方案,因為以上所有內容對我都不起作用...

    更改了用戶標題搜索路徑(我想標題搜索路徑< / code>可以優雅地工作到“$(BUILT_PRODUCTS_DIR)/ BlocksKit”

    背景

    In BlockKit,開發人員在主項目中構建頭文件的結構與部署結構不同。因此,您無法引用項目中的標頭,並且必須引用複製到構建目錄中的標頭。

    21楼
    0

    這對我有用的方式(Xcode 5)我有兩個目標,當我編輯方案時,在方案編輯器的左側窗格中,你會看到[BUILD,RUN,TEST,PROFILE XXX.APP,從BUILD窗格中分析,存檔],您將看到列表中列出的項目目標。在最右端,您將看到ARCHIVE選項,確保只選擇一個目標進行存檔。

    我在項目中選擇了2個目標,我只檢查了產品中我想要的目標,它有效!

    22楼
    0

    我通過在XCode中僅打開應用程序項目解決了這個錯誤,即。不打開工作區,包括應用程序和其他項目/庫/框架。

    有2個單獨的項目,框架或共享庫和iOS應用程序,我必須打開2個不同的XCode窗口,每個窗口都直接打開 .xcodeproj 文件而不是常見的 .xcworkspace ,以便預先構建每個窗口。

    作為一個好的方面效果,XCode在執行 Clean 後不再重建每個項目的每個目標,導致構建時間縮短。

    背景:我正在創建一個開源SDK和演示iOS應用程序。我在一個工作區打開了。在SDK目標上將跳過安裝設置為 YES 將阻止任何人創建存檔,因為它將為空,因此這不是一個選項。使用 Project 而不是 Public 標頭會導致存檔丟失應該分發的頭文件,因此這也不是一個選項。

    23楼
    0

    因為那是因為我在工作區工作。該項目已存檔,但將顯示在組織者窗口中。我關閉了工作區並自行打開了項目。存檔已在組織者中打開...希望它有所幫助。

    24楼
    0

    就我而言,我有一個自定義腳本,它將一些臨時文件複製到:

      $ {TARGET_BUILD_DIR} / myTempDir   

    這意味著在調查存檔以檢查其內容後,我在.app文件旁邊找到了myTempDir文件夾。一旦我修改了腳本以保存其他地方,事情就會被排序。

    25楼
    0

    嘗試在Framework projet的Public Headers文件夾路徑中設置$(PROJECT_NAME)標頭。您必須構建庫目標的設置,然後將公共標題文件夾路徑編輯為$(PROJECT_NAME)標題。

    26楼
    0

    如果將 Xcode 7 cocoapods v.0.38.2 一起使用。嘗試從今天的擴展目標中刪除 copy pod resources

    27楼
    0

    在我的iOS應用程序項目中添加OS X命令行工具後遇到此問題,默認情況下,Skip Install對命令行工具的目標設置為NO。由於您顯然無法將OS X二進製文件安裝到iOS設備,因此歸檔默認為通用Xcode存檔。為此目標設置“跳過安裝”為“是”修復了問題。

    0
    votes
    answers
    8 views
    +10

    New GMaps renderer not loading tiles until the map is dragged in iOS phonegap app

    I maintain a mobile WebApp wrapped using phonegap and encountered an issue with new renderer update of GMaps API. Some time ago this new renderer was introduced, and although according to docs it shouldn't break anything, map doesn't render until dragged around a little bit.

    Everything worked fine on the previous version of GMaps API (v3.31), but after update it works only in browser, and not working when compiled to xCode project.

    The app changes pages by hiding and showing corresponding divs, so I used to implement 'trigger resize' hack to reflow GMaps. With the new renderer it seems deprecated, and indeed in the browser the map is loading just fine with or without resize trigger. But when I compile my app with phonegap, the map tiles and info at the bottom don't render, even though markers are working, and all the listeners seem to be working too (for example I can place new markers with double click). The tiles only load after I drag the screen around, and then map is working just fine.

    I tried to programmaticaly pan the map around after load, but this doesn't change anything. Triggering 'resize', 'bounds_change', and 'drag' events doesn't help either.

    I use just the GMaps javascript API, not the cordova googlemaps plugin.

    Here's how the maps page looks just after loading

    0
    votes
    answers
    24 views
    +10

    在firestore中添加新密鑰時,應用程序崩潰

    1

    我使用github做了一個測試應用程序,後面跟着Google的例子,但有一些變化(在firestore中使用的鍵較少,過濾器少一些)。在firestore中添加新密鑰時,應用程序崩潰

    問題是這樣的,當我在firestore中添加新密鑰時,應用程序崩潰,但該應用程序使用了先前添加的兩個密鑰。

    崩潰並顯示錯誤fatalError("error")。我不明白爲什麼有兩個鍵的應用程序工作,但如果我開始使用第三個鍵(大廳),那麼應用程序崩潰。

    可能是什麼問題?

    這是我的代碼:

    class ViewControllerTwo: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    
        @IBOutlet var tableView: UITableView! 
    
        private var sweets: [Sweet] = [] 
        private var document: [DocumentSnapshot] = [] 
    
        fileprivate var query: Query? { 
         didSet { 
          if let listener = listener { 
           listener.remove() 
          } 
         } 
        } 
    
        private var listener: FIRListenerRegistration? 
    
        fileprivate func observeQuery() { 
    
         guard let query = query else { return } 
    
         stopObserving() 
    
         listener = query.addSnapshotListener { [unowned self] (snapshot, error) in 
    
          guard let snapshot = snapshot else { 
    
           print("Error fetching snapshot results: (error!)") 
    
           return 
    
          } 
    
          let models = snapshot.documents.map { (document) -> Sweet in 
    
           if let model = Sweet(dictionary: document.data()) { 
    
            return model 
    
           } else { 
    
            fatalError("error") 
    
           } 
    
          } 
    
          self.sweets = models 
    
          self.document = snapshot.documents 
    
          self.tableView.reloadData() 
    
         } 
    
        } 
    
        @IBAction func filterButton(_ sender: Any) { 
         present(filters.navigationController, animated: true, completion: nil)  
        } 
    
        lazy private var filters: (navigationController: UINavigationController, filtersController: FilterViewController) = { 
         return FilterViewController.fromStoryboard(delegate: self) 
        }() 
    
        fileprivate func stopObserving() { 
         listener?.remove() 
        } 
    
        fileprivate func baseQuery() -> Query { 
         return Firestore.firestore().collection("sweets").limit(to: 50)  
        } 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
    
         query = baseQuery()  
        } 
    
        override func viewWillAppear(_ animated: Bool) { 
         super.viewWillAppear(true) 
    
         observeQuery() 
        } 
    
        override func viewWillDisappear(_ animated: Bool) { 
         super.viewWillDisappear(true) 
    
         stopObserving()  
        } 
    
        deinit { 
         listener?.remove()  
        } 
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    
         return sweets.count 
        } 
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
         let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ViewControllerCell 
    
         let sweet = sweets[indexPath.row] 
    
         cell.studioNameLabel.text = sweet.name 
         cell.studioAddressLabel.text = sweet.content 
         cell.hallNameLabel.text = sweet.hall 
    
         return cell 
    
        } 
    
    } 
    
    extension ViewControllerTwo: FiltersViewControllerDelegate { 
    
        func query(withCategory title: String?) -> Query { 
    
         var filtered = baseQuery() 
    
         if let title = title, !title.isEmpty { 
          filtered = filtered.whereField("title", isEqualTo: title) 
         } 
    
         return filtered 
        } 
    
        func controller(_ controller: FilterViewController, didSelectCategory title: String?) { 
    
         let filtered = query(withCategory: title) 
    
         self.query = filtered 
         observeQuery() 
    
        } 
    } 
    
    class ViewControllerCell: UITableViewCell { 
    
        @IBOutlet weak var studioNameLabel: UILabel! 
        @IBOutlet weak var studioAddressLabel: UILabel! 
        @IBOutlet weak var hallNameLabel: UILabel! 
    
    } 
    

    而且我的結構:

    protocol DocumentSerializable { 
        init?(dictionary:[String:Any]) 
    } 
    struct Sweet { 
        var name:String 
        var content:String 
        var hall:String 
        var dictionary:[String:Any] { 
         return [ 
          "name": name, 
          "content" : content, 
          "hall" : hall 
         ] 
        } 
    } 
    extension Sweet : DocumentSerializable { 
    
        static let title = [ 
         "one", 
         "two", 
         "three", 
         "four" 
        ] 
        init?(dictionary: [String : Any]) { 
         guard let name = dictionary["name"] as? String, 
          let content = dictionary["content"] as? String, 
          let hall = dictionary["hall"] as? String else { return nil } 
    
         self.init(name: name, content: content, hall: hall) 
        } 
    } 
    

    我在谷歌項目帶動

    google drive

    google service info.plist

    +0

    嘗試打印'Sweet(dictionary:document.data())'並檢查它是否爲'nil' –

    +0

    @DharmeshKheni in'fatalError()'? – Dima

    +0

    以上'如果讓模型=甜(字典:document.data())' –

    沙发
    0
    0

    只需向現有結構中添加任何新密鑰,您就需要重新安裝應用程序。

    所以你應該在結構實現之前決定你需要什麼鍵。或者,如果將來添加新密鑰,則可以重新安裝應用程序。

    160
    votes
    answers
    9 views
    +10

    How to make iPhone vibrate using Swift?

    I need to make the iPhone vibrate, but I don't know how to do that in Swift. I know that in Objective-C, you just write:

    import AudioToolbox
    AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
    

    But that is not working for me.

    沙发
    +560

    在iPhone 7或7 Plus的iOS 10中,嘗試:

      let generator = UIImpactFeedbackGenerator(style:.heavy)generator.impactOccurred() 
         
    			
            
    板凳
    +420

    其他振動類型:

      import AudioToolbox AudioServicesPlaySystemSound(1519)// Actuate“Peek”反饋(弱臂)AudioServicesPlaySystemSound(1520)// Actuate“Pop”反饋(強勁繁榮)AudioServicesPlaySystemSound (1521)//執行“Nope”反饋(三個弱勢系列)  

    關於振動的更多信息 - http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with- uifeedbackgenerator /

    地板
    +210

    對於 iOS 10.0 + 您可以嘗試 UIFeedbackGenerator < / p>

    上面的簡單viewController,只需在測試“單視圖應用程序”中替換視圖控制器

      import UIKit類ViewController:UIViewController {var i = 0 override func viewDidLoad(){ super.viewDidLoad()讓btn = UIButton()self.view.addSubview(btn)btn.translatesAutoresizingMaskIntoConstraints = false btn.widthAnchor.constraint(equalToConstant:160).isActive = true btn.heightAnchor.constraint(equalToConstant:160).isActive = true btn.centerXAnchor.constraint(equalTo:view.centerXAnchor)。isActive = true btn.centerYAnchor.constraint(equalTo:view.centerYAnchor).isActive = true btn.setTitle(“Tap me!”,for:。normal)btn.setTitleColor(UIColor.red,for:。normal)btn.addTarget (self,action:#selector(tapped),for:.touchUpInside)} @objc func tapped(){i + = 1 print(“Running(i)”)switch i {case 1:let generator = UINotificationFeedbackGenerator()generator .notificationOccurred(.error)case 2:let generator = UINotificationFeedbackGenerator()generator.notificationOccurred(.success)case 3:let generator = UINotificationFeedbackGenerator()generator.notificationOccurred(.warning)case 4:let generator = UIImpactFeedbackGenerator(style:。light)generator.impactOccurred()case 5:let generator = UIImpactFeedbackGenerator(style:.medium)generator.impactOccurred()case 6:let generator = UIImpactFeedbackGenerator(style:.heavy)generator.impactOccurred( )default:let generator = UISelectionFeedbackGenerator()generator.selectionChanged()i = 0}}}  let generator = UISelectionFeedbackGenerator()generator.selectionChanged()i = 0}}}  let generator = UISelectionFeedbackGenerator()generator.selectionChanged()i = 0}}}  
         
    			
            
    4楼
    +190

    Swift 4.2已更新

    只需將以下代碼插入您的項目即可。

    用法

      Vibration.success.vibrate()  

    源代碼

      import AVFoundation import UIKit enum Vibration {case error case case case warning case light case medium case heavy case selection case oldSchool func vibrate(){ switch self {case .error:let generator = UINotificationFeedbackGenerator()generator.notificationOccurred(.error)case .success:let generator = UINotificationFeedbackGenerator()generator。
         
    			
            

    不適合我 - AfnanAhmad 4月8日5:21

    你用的是什麼設備?哪個iOS版本? - muhasturk 4月8日9:06

    5楼
    +160

    我們可以在Xcode7.1中執行此操作

      import UIKit import AudioToolbox類ViewController:UIViewController {override func viewDidLoad(){super.viewDidLoad()AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)}}  
         
    			
            

    這仍然適用於Swift 4,Xcode 9. - ken0nek 17年11月20日10:52

    6楼
    +40

    您可以使用 AudioServices Haptic Feedback 振動手機。

      // AudioServices AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))/ /觸覺反饋UIImpactFeedbackGenerator(樣式:.medium).impactOccurred()  

    簽出我的開源框架 Haptica ,它支持 Haptic Feedback AudioServices 和獨特的振動模式。適用於Swift 4.2,Xcode 10

    7楼
    +10
      AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
         
    			
            

    您應該在答案中突出顯示您正在使用AudioServicesPlaySystemSound而不是最佳答案的AudioServicesPlayAlertSound。 - Cœur8月25日'17在10:16

    8楼
    +10

    UINotificationFeedbackGenerator可從iOS 10獲得併與Haptic v2一起使用,我們可以查看:

     讓feedbackSupportLevel = UIDevice.current.value(forKey:“_ feedbackSupportLevel”)為?Int if #available(iOS 10.0,*),let feedbackSupportLevel = feedbackSupportLevel,feedbackSupportLevel&gt; 1 {do {// 1 let generator = UIImpactFeedbackGenerator(style:.medium)generator.impactOccurred()} do {//或2 let generator = UINotificationFeedbackGenerator()generator.notificationOccurred(.success)}} else {AudioServicesPlayAlertSound(SystemSoundID( kSystemSoundID_Vibrate))}  
         
    			
            
    9楼
    0
      import AudioToolbox擴展UIDevice {static func vibrate(){AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)}}   

    現在你只需要調用 UIDevice.vibrate()根據需要。

    10楼
    0

    在這裡,您可以找到每個.caf及相關類別的所有代碼:

    https: //github.com/TUNER88/iOSSystemSoundsLibrary

    例如,如果你想要更輕的振動,你可以使用代碼1003。

    祝你好運,玩得開心;)< / p>

    0
    votes
    answers
    12 views
    +10

    CAShapeLayer和SpriteKit

    1

    我想利用CAShapeLayer中的路徑動畫功能,該功能在SpriteKit中不可用,因此必須組合在同一視圖中將CAShapeLayer與SpriteKit對象進行繪製的對象。CAShapeLayer和SpriteKit

    座標系似乎是相反的:CAShapeLayer似乎有+ ve y軸向下指向,而SKScene則指向上。

    下面是一個簡單的XCODE操場,試圖從0,0到200,100繪製一條黃線,並用較粗的紅線將其遮蔽。

    import SpriteKit 
    import PlaygroundSupport 
    
    let bounds = CGRect(x: 0, y: 0, width: 400, height: 200) 
    let view = SKView(frame: bounds) 
    view.backgroundColor = UIColor.lightGray 
    
    PlaygroundPage.current.liveView = view 
    
    // Create SK Scene 
    let scene = SKScene(size: CGSize(width: 400, height: 200)) 
    scene.scaleMode = SKSceneScaleMode.aspectFit 
    view.presentScene(scene); 
    
    // Define the path 
    let path: CGMutablePath = CGMutablePath(); 
    path.move(to: CGPoint(x:0, y:0)) 
    path.addLine(to: CGPoint(x:200, y:100)) 
    
    // Use CAShapeLayer to draw the red line 
    var pathLayer: CAShapeLayer = CAShapeLayer() 
    pathLayer.path = path 
    pathLayer.strokeColor = UIColor.red.cgColor 
    pathLayer.fillColor = nil 
    pathLayer.lineWidth = 4.0 
    pathLayer.lineJoin = kCALineJoinBevel 
    pathLayer.zPosition = 1; 
    view.layer.addSublayer(pathLayer); 
    
    //Use SKShapeNode to draw the yellow line 
    let pathShape: SKShapeNode = SKShapeNode(path: path); 
    pathShape.strokeColor = .yellow; 
    pathShape.lineWidth = 1.0; 
    pathShape.zPosition = 10; 
    scene.addChild(pathShape); 
    

    我預計黃線與紅線重合。而黃色和紅色線條則以鏡像形式出現。

    無論如何重新定義CAShapeLayer座標系指向+ ve Y軸向上?

    +0

    我能夠通過反轉CAShapeLayer與仿射變換使行重合:'var mirror = CGAffineTransform(scaleX:1.0,y:-1.0); var inverse = path.copy(using:&mirror)!;' –

    沙发
    0
    0

    不,寫的文檔,這是它如何工作的,你可反座標,以滿足您的要求..

    Sprite kit docs

    單位座標系統將原點底部框架的左上角和(1,1)在框架的右上角。精靈的錨點默認爲(0.5,0.5),對應於幀的中心。

    The rest of iOS

    的iOS。默認座標系的原點位於繪圖區域的左上角,正值向下和向右延伸。 您無法在iOS中更改視圖座標系的默認方向 - 也就是說,您無法「翻轉」它。

    121
    votes
    answers
    17 views
    +10

    Undefined symbols for architecture arm64

    I am getting a Apple Mach-O Linker Error everytime I import a file from CocoaPods.

    Undefined symbols for architecture arm64:
      "_OBJC_CLASS_$_FBSession", referenced from: someFile
    ld: symbol(s) not found for architecture arm64
    

    I get about 12 of these, for the various Pods I use.

    I am trying to build for the iPhone 5S using XCode 5.

    I've been trying various solutions here on SO, but haven't got any of them to work yet.

    How do I fix this Apple Mach-O Linker Error?


    Just found another warning that might be interesting, I hope this leads me to the solution:

    Ignoring file ~/Library/Developer/Xcode/DerivedData/SomeApp/Build/Products/Debug-iphoneos/libPods.a, 
    

    file was built for archive which is not the architecture being linked (arm64):~/Library/Developer/Xcode/DerivedData/someApp/Build/Products/Debug-iphoneos/libPods.a

    沙发
    +330
    我也遇到了同樣的問題,上面的方法都行不通。我不小心刪除了下面目錄中的文件。

    文件夾安置:

    ?/ Library / Developer / Xcode / DerivedData /

    雖然這看起來很奇怪,但這確實有效。謝了哥們。 - Felipe 2016年6月7日18:19

    手動刪除派生數據,也為我做了伎倆。乾杯! - L_Sonic 2016年6月23日11:00

    它節省了我的一天......謝謝了很多 - Abhishek 2016年8月2日10:01

    謝謝。我的工作也做了。 - Muhammad Ibrahim 2016年8月22日18:03

    謝謝!我想添加一個提示:該文件夾位於/ User / yourname / Library / Developer / XCode / DerivedData - Stefano Buora 2016年9月19日11:17

    板凳
    +250

    架構設置為 armv7 armv7s 僅構建活動架構 ,對於項目中的每個目標,包括 Pods 中的每一個

    工作sorta ...現在我收到“無效的bitcode簽名”錯誤。 - JeremyF 18年4月24日20:01

    地板
    +160

    我通過檢查右側目標成員資格中的選定實施文件來修復我的問題。這在處理擴展即自定義鍵盤時尤其有用。

    即使選中了複選框,Xcode 9也不會自動應用此選項。謝謝。 - Amro Shafie '17年10月2日8:43

    那就是問題所在。謝謝你 - 伊格納西奧·埃爾南德斯18年11月14日17:55

    也體驗了這一點。可能是一個全球性的事情,要求其他開發人員在ios-developers.slack.com上確認 - yeralin 3月13日3:13

    同樣在這裡!無法在iphone上運行。只有模擬器 - Renan Aguiar 3月13日3:51

    同樣在這裡。不是付費開發者帳戶。 - T. Wei 3月13日5:38

    是的,我也面臨同樣的問題。我認為這也是免費賬號的問題 - Piyush 3月13日10:02

    同樣的問題,付費帳戶 - byemute 3月13日14:53

    4楼
    +110

    解釋為什麼build_active_architecture設置為NO。Xcode現在可以檢測您已連接的設備,並相應地設置活動架構。因此,如果您將第二代iPod Touch插入計算機,Xcode應將活動架構設置為armv6。使用上面的Debug配置構建你的目標現在只會構建armv6二進製文件來節省時間(除非你有一個巨大的項目,你可能沒有註意到差異,但我想隨著時間的推移,秒數會增加。)

    如果要創建用於發佈到App Store的分發配置,則應確保未設置此選項,以便構建胖通用二進製文件 HTTP:// useyourloaf。

    這真是令人難以置信的FUBARed!XCode的輸出取決於您連接到構建機器的設備! - 馬特2016年2月4日20:38

    5楼
    +50

    刪除DerivedData的內容後解決 - &gt; Build - &gt; Products - &gt; Debug-iphoneos

    6楼
    +40

    這可能與 libz.dylib libz.tbd 有關,只需將其添加到鏈接二進製文件的目標中,然後再嘗試編譯。 / p>

    試圖添加Tesseract框架,只有這對我有所幫助,謝謝。! - HelloimDarius 2017年5月27日8:54

    7楼
    +40

    您只需從有效架構中刪除 arm64 ,並將設置為僅限Active Architecture 現在只需清理,構建和運行。您不會再次看到此錯誤。

    :) KP

    8楼
    +30

    我通過將有效的archs設置為armv7 armv7s並在構建時將構建活動架構設置為YES,然後從命令行執行新的“pod install”來解決它

    9楼
    +30

    考慮到iPhone 5s還沒有收到64位版本的第三方庫,我不得不使用最新的Xcode回到32位模式(5.1之前並沒有抱怨)。

    我通過從Valid Architectures列表中刪除arm64,然後將Build Active Architecture Only設置為NO來修復此問題。在我看來,如上所示,這比其他方式更有意義。我發帖以防其他人無法獲得上述任何解決方案。

    10楼
    +30

    升級到Xcode 5.1後我遇到了同樣的問題,並通過將架構設置為 armv7 armv7s 來修復它

    當我這樣做時,同樣的事情發生。我無法看到調試器圖標,如步驟和位置。只在模擬器上 - Renan Aguiar 3月14日16:19

    現在我總是無法發動...... - Renan Aguiar 3月14日16:34

    看起來調試器功能不完全。我可以從設備獲得控制台輸出,但斷點不起作用; 也沒有跨步/步入命令 - Fedorov7890 3月14日17:36

    11楼
    +30

    我一直堅持這個問題。

    我有多個Scheme,它正在為Demo,Internal,Release編譯 - 但是Debug方案不會編譯並且抱怨libPods。一個失踪。

    解決方案是轉到項目 - &gt; 目標 - &gt; 構建設置並將“僅構建活動體系結構”更改為YES。清潔和建造!最後幾個小時頭癢解決了!

    與您完全相同的問題,但類似。我用你提供的相同方法解決了它。 - Helzgate 2015年11月3日22:47

    仍無法在設備上安裝。即使有新的免費appleid和證書 - Fedorov7890 3月14日8:57

    你刪除了所有證書嗎? - Husein Behboodi Rad 3月14日9:03

    是的我做了,除了我清除〜/ Library / MobileDevice / Provisioning Profiles和〜/ Library / Developer / Xcode / DerivedData並重啟iPhone - Fedorov7890 3月14日9:05

    最後它適用於此解決方法stackoverflow.com/a/54990369/3824328 - Fedorov7890 3月14日10:27

    @Franky stackoverflow.com/a/55160300/3824328 - Fedorov7890 3月14日15:36

    您可以在此處下載免費的xcode快捷方式備忘單。pragprog.com/screencasts/v-mcxcode/becoming-productive-in-xcode - falconcreek 2010年5月14日17:53

    12楼
    +20

    在目標的Build Settings中將 -ObjC 設置為 Other Linker Flags 解決了這個問題。

    它沒有!我無法在設備上調試或使用位置 - Renan Aguiar 3月14日21:40

    你好謝謝。如何去“鑰匙串App”好嗎?什麼路? - 弗蘭基3月15日0:35

    您可能現在已經找到它,但Keychain Access應用程序位於Applications-> Utilities - David Gish 3月15日5:00

    我仍然無法使用iphone調試這些答案 - Renan Aguiar 3月15日15:26

    13楼
    +20

    這對我有用:

    ios sdk 9.3

    進入app.xcodeproj的構建設置有效架構:armv7 armv7s構建活動架構:否

    清潔和構建,為我工作。

    14楼
    +10

    對於我來說,在Xcode 5.1上為64位模擬器和視網膜iPad Mini進行GPUImage編譯沒有錯誤,沒有需要從Valid Architectures列表中刪除arm64(這使得失敗了擁有64位設備以測試64位性能的目的。

    從GitHub頁面下載.zip文件夾: https://github.com/BradLarson/GPUImage

    解壓縮,然後導航到“framework”文件夾。從這裡,添加“Source”文件夾並將其複製到Xcode項目中。確保勾選“將項目複製到目標組的文件夾”,並勾選“為任何添加的文件夾創建組”。這將復制通用,iOS和Mac標題/實現文件到您的項目中。

    如果您因為編譯iOS而不需要Mac文件,則可以在將文件複製到項目中之前刪除Mac文件夾,或者只是從Xcode中刪除該組。

    將Source文件夾添加到項目後,只需使用以下內容開始使用GPUImage的類/方法:

      #import“Source / GPUImage.h”  

    需要指出的一些事項:

    • 如果您收到錯誤消息“未找到'Cocoa',則表示已將Mac文件夾/標題添加到iOS項目中 - 只需從項目中刪除Mac組/文件,警告就會消失
    • 如果重命名Source文件夾(而不是Xcode中的組),請在#import指令中使用該名稱而不是“Source / GPUImage.h”。因此,如果在添加到項目之前將文件夾重命名為GPUImageFiles,請使用:#import“GPUImageFiles / GPUImage.h”
    • 顯然,確保在“有效體系結構”列表中選擇arm64以利用A7 64-位處理器!
    • 這不是GPUImage.framework包(例如,如果你從 http://www.raywenderlich.com/60968/ios-7-blur-effects-gpuimage )所以它可能不是正確的方式來使用Brad Larson的GPUImage打算,但它適用於我目前的SpriteKit項目。
    • 那裡
    15楼
    +10

    通過Podfile和 pod install 安裝pod後,我遇到此問題。在嘗試了一堆不同的修復後,我終於手動導入了Pod(將必要的文件拖到我的項目中),這就解決了問題。

    這也適用於我,但是有一個簡單的pod有一個文件。 - iluvatar_GR 17年7月17日17:50

    有意思,但我們有XCode 10.1顯示此問題,10.1確實支持SDK 12. - Ali Beadle 3月13日19:34

    好的,我已經設法通過在Xcode中清理項目並通過我的IDE(我使用VSC)通過模擬器運行調試來獲得臨時解決方法。 - 傑克3月13日19:38

    正如OP所說,模擬器似乎不受此問題的影響。它似乎只影響真實的設備。 - Ali Beadle 3月13日20:07

    是的我無法在物理設備上加載。希望Apple盡快解決這個問題。 - 傑克3月13日21:54

    16楼
    +10

    morisunshine 的回答指向正確的方向時,他的回答中的一點調整解決了iOS8.2的問題。謝謝

    我通過設置:

      ARCHS = armv7 VALID_ARCHS = armv6 armv7 armv7s arm64建立活動架構=否 
         
    			
            

    這首先解決了我的問題,但幾分鐘後它又回來了 - Ava Mar 14 at 13:46

    17楼
    +10

    就我而言,我必須尋找

    C ++標準庫,並確保 libc ++ 是所選的。

    現在我明白了:無法啟動/private/var/containers/Bundle/Application/52553D96-4B6A-4680-B77C-C04895B7759C/dois.app - Renan Aguiar 3月16日9:35

    18楼
    +10

    對我來說,我在xcode 7.2中使用opencv 2.4.9 for iOS並且發生了上述錯誤,我使用opencv通過pod安裝而不是離線opencv框架來解決錯誤。

    你可以嘗試添加下面的opencv pod文本,如果你已經使用過,刪除離線opencv框架。

    pod'OpenCV','2.4.9'

    我使用免費帳戶..通過跟隨任何人說,現在我得到一個關於等待7天的錯誤.....我不會支付在我的設備上測試它。 - Renan Aguiar 3月19日1:47

    所以我認為packagemaker的問題是無法正確簽署pkg文件以便與Mountain Lion上的網守一起使用? - JasonZ 12年12月12日21:36

    這是有可能的,但是PackageMaker總是有蟲子,並且在Mac OS X 10.6 Snow Leopard中被棄用了。從長遠來看,它將節省您的時間,以便熟悉新工具。 - catlan 12年12月12日23:08

    @catlan:你有一個官方鏈接說包裝製造商已經在10.6被棄用了嗎? - 卡爾8月22日在2:09

    @carleeto:它從未被宣佈為被棄用,只是從Xcode中移除並最終像緬甸抗議者一樣“消失”。 - 錯誤10月23日'12在19:53

    Xcode 4.6發行說明:Package Maker的棄用adcdownload.apple.com/Developer_Tools/xcode_4.6/ - catlan 2013年1月29日9:52

    19楼
    +10

    使用 TesseractOCRiOS ,沒有一個解決方案在我的情況下修復此錯誤(Xcode 9)。經過幾個小時的反複試驗,我想出了一個很好的解決方案。我只是刪除'pod'TesseractOCRiOS','?&gt; Podfile 中的4.0.0',運行 pod install 然後,添加 pod'TesseractOCRiOS','?&gt; 4.0.0'返回 Podfile 並再次運行 pod install

    砰!有用!

    奇怪!!!但它也適合我...感謝好友:) - Priyanka Kanse 18年4月13日在7:35

    20楼
    +10

    在某些情況下,如果在.h文件中再定義一個接口,但沒有實現所有這些接口,則會發生此錯誤。

    鏈接器無法在.m文件中找到實現,所以你需要在每個接口的.m文件中實現它。

    要解決此錯誤:

    1.in .m文件,為每個接口提供實現。2.rebuild

    21楼
    0

    在安裝AWS框架以解決此問題後,我遇到了同樣的問題,我已經更新了項目中的POD配置文件,該文件是在安裝AWS POD後創建的。檢查配置文件如下

      OTHER_LDFLAGS = $(繼承)-ObjC -l“Pods-AWSAutoScaling”-l“Pods-AWSCloudWatch”-l“Pods-AWSCognito”-l“Pods-AWSCore “-l”Pods-AWSDynamoDB“-l”Pods-AWSEC2“-l”Pods-AWSElasticLoadBalancing“-l”Pods-AWSKinesis“-l”Pods-AWSLambda“-l”Pods-AWSMachineLearning“-l”Pods-AWSS3“ -l“Pods-AWSSES”-l“Pods-AWSSNS”-l“Pods-AWSSQS”-l“Pods-AWSSimpleDB”-l“Pods-Bolts”-l“Pods-FMDB”-l“Pods-GZIP” - L“豆莢幔”
         
    			
            
    22楼
    0
    1. 轉到目標構建設置。
    2. 僅為ADM和發佈設置BUILD ACTIVE ARCHITECTURE = NO
    3. 構建並運行

    在PODS項目中僅將BUILD ACTIVE ARCHITECTURE設置為NO! - Elad 2016年2月28日10:02

    23楼
    0

    如果體系結構和鏈接器設置看起來不錯,請檢查您的h文件。我的問題是同樣的錯誤,但我重組了h文件,我刪除了一個extern語句。其他m文件正在使用該變量,導致鏈接器錯誤。

    24楼
    0

    添加“Security.framework”為我做了訣竅。

    25楼
    0

    我知道這是一個古老的分支。但是,在遷移到最新的CocoaPods版本(1.0.0)並嘗試重新安裝所有pod之後,同樣的問題開始發生在我身上。我遇到了“armv64缺少符號”鏈接器錯誤。奇怪的是,我通過執行以下步驟解決了這個問題:

    1. 刪除所有pod(pod init,pod install)

    2. 重寫podfile以相反的順序(而不是:pod“Mixpanel”,pod“Intercom”,我用過:pod“Intercom”,pod“Mixpanel”)

    3. Pod install < / p>

      顛倒podfile中依賴項的順序並重建pod已解決了這個問題。

    26楼
    0

    “OPN [Debug]目標會覆蓋OTHER_LDFLAGS構建設置”。這是主要問題。在其他鏈接器標誌的新行中添加$(繼承)解決了我的問題。

    0
    votes
    answers
    24 views
    +10

    錯誤500上MySQL PUT和刪除通過Express,Axios

    0

    我剛剛繼承了一個項目,有點隨意使用我不是很熟悉的工具建立。它使用Express,Bookshelf和Axios來訪問MySQL數據庫。 GET和PUT的快速路由似乎工作得很好,但POST和DELETE每個導致錯誤500.錯誤500上MySQL PUT和刪除通過Express,Axios

    這裏是我使用的路由(我已經刪除了更多的GET和POST路由, ):

    import express from 'express'; 
    import Points from '../models/points'; 
    
    let router = express.Router(); 
    
    // GET all points associated with a specific user AND a specific session 
    // This works fine. 
    router.get('/user/:user/session/:session', (req, res) => { 
        Points.query({ 
         select: ['id', 'number', 'quadrant', 'level', 'title', 'category'], 
         where: {sessionId: req.params.session, userId: req.params.user} 
        }).fetchAll().then(point => { 
         res.json({point}); 
        }) 
    }); 
    
    // POST a single point to the database. 
    // This works fine. 
    router.post('/', (req, res) => { 
        const {sessionId, userId, number, quadrant, level, title, category} = req.body; 
    
        Points.forge({ 
         sessionId, userId, number, quadrant, level, title, category 
        }).save() 
         .then(user => res.json({success: true})) 
         .catch(err => res.status(500).json({error: err})); 
    }); 
    
    // PUT (update) an existing point 
    // Doesn't work right now (500) 
    router.put('/edit/:identifier', (req, res) => { 
        Points.update({ 
         set: {title: req.params.title}, 
         where: {id: req.params.identifier} 
        }), function (err, point) { 
         if (err) { 
          return res.send(err); 
         } 
         res.json({message: 'Updated'}); 
        }; 
    }); 
    
    // DELETE a point by id 
    // Doesn't work right now (500) 
    router.delete('/delete/:identifier', (req, res) => { 
        Points.remove({ 
         id: req.params.identifier 
        }), function (err, point) { 
         if (err) { 
          return res.send(err); 
         } else { 
          res.json({message: 'Deleted'}); 
         } 
        }; 
    }); 
    
    export default router; 
    

    這裏是對應於上述的路由的終極版操作:

    import axios from 'axios'; 
    
    
    export function getPointsByUserAndSession(data) { 
        return dispatch => { 
         return axios.get('/api/points/user/'+data.user+'/session/'+data.session) 
        } 
    } 
    
    export function addPoint(data) { 
        return dispatch => { 
         return axios.post('/api/points', data) 
        } 
    } 
    
    export function editPointById(data) { 
        return dispatch => { 
         return axios.put('/api/points/edit/' + data.id) 
        } 
    } 
    
    export function deletePointById(identifier) { 
        return dispatch => { 
         return axios.delete('/api/points/delete/' + identifier) 
        } 
    } 
    
    沙发
    0
    0

    啓用用下面的代碼CORS:

    router.use((req, res, next) => { 
        res.header('Access-Control-Allow-Origin', '*'); 
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, x-access-token'); 
        res.header('Access-Control-Allow-Methods', 'GET, POST,OPTIONS, DELETE, PATCH, PUT'); 
        next(); 
    }); 
    
    0
    votes
    answers
    22 views
    +10

    從iOS的發現文件生成服務類

    0

    我有一個rpc格式的發現文件,但使用了新的生成器,我無法生成它。從iOS的發現文件生成服務類

    如何使用新的服務生成器爲iOS生成文件?

    沙发
    0
    0

    您需要獲取REST格式發現文件。