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: 62

0
votes
answers
8 views
+10

Viewport-fit=cover breaks other views on iPhone. How to solve it?

I am building an app for the iPhone and I noticed that viewport-fit=cover, which is needed for the iPhone X view, is breaking my other views (let's say the iPhone 7).

What happens? Well, when I use viewport-fit=cover it pushes my content / body upwards, making it seem great on the iPhone X, but bad on iPhone 7, as the content gets closer to the statusbar above.

How can I solve this issue?

enter image description here

You can see the content (yellow things) very close to the statusbar, while it wasn't the case when I didn't optimised it for the iPhone X with viewport-fit=cover

Anyone care to help?

0
votes
answers
38 views
+10

推送通知 - 後臺進程 - iPhone

1

我剛纔聽到 - 「推送通知」有可能在iPhone推送通知 - 後臺進程 - iPhone

我需要以下詳細信息。

  • 什麼是推送通知?
  • 它是如何工作的?
  • 它需要什麼?
  • 任何示例代碼鏈接都可用?
  • 任何文檔鏈接(如果有)?
  • 「StackOverFlow Masters」關於開發上述要求的一些指導/提示。

預先感謝與家人#1我&分享你的知識。

+0

兩部分教程完成推送通知的指南。 http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12 http://www.raywenderlich.com/3525/apple-push-notification-services -Tutorial-part-2 – 2012-10-05 06:24:50

沙发
0
5

您正在尋找的背景處理類型不適用於推送通知。

推送通知允許您通知用戶某事。一個例子是一個Twitter客戶端,當用戶在Twitter上收到一條直接消息時發送通知。

當應用程序未運行時,推送通知無法對iPhone上發生的事情做出反應。取而代之,它取決於你有一個服務器,它決定何時發送通知,然後發送一個通知。

我在您的應用程序中看不到任何背景處理需求。如果您存儲了用戶的初始位置,則在下次應用加載時,您可以獲取其位置並計算兩者之間的距離。如果您正在尋找旅行的路線,那麼除非您有make a deal with AT&T like Loopt just did,否則您運氣不佳。

+0

你告訴 - 「一個例子是一個Twitter客戶端,當用戶在Twitter上收到一條直接消息時發送通知。」我們怎麼能這樣做? – 2009-09-04 21:14:10

+1

你需要一個服務器來檢查Twitter的直接消息。當它檢測到一個新的,它需要排隊推送通知給該用戶的手機。 – ceejayoz 2009-09-05 00:50:51

板凳
0
1

推送通知不是真的爲此目的,你應該閱讀推送通知在這裏的蘋果網站http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html,它更像是當你的用戶爲我的消息時,你可以讓用戶得到它,而不必讓他們打開應用程序。現在爲了您的目的,爲什麼不能在關閉應用程序時存儲位置,一旦重新打開應用程序,您可以重新獲取位置,使用以前的位置和新的位置來計算行駛的公里數?

地板
0
1

雖然只與本討論相關,但我認爲你可能會對Loopt與AT & T至track user's iPhones(按月收費)的協議感興趣。

4楼
0
0

Apple Push Notification服務(簡稱APN)是推送通知功能的核心。這是一項強大且高效的服務,可將信息傳播至iPhone,iPad和iPod touch設備等設備。每個設備都與該服務建立一個經過認證和加密的IP連接,並通過此持久連接接收通知。如果應用程序的通知在應用程序未運行時到達,則設備會通知用戶應用程序有數據正在等待它。

軟件開發者(「提供者」)在其服務器軟件中發起通知。提供商通過一個持久安全的通道與APN連接,同時監控針對其客戶端應用程序的傳入數據。當應用程序的新數據到達時,提供程序通過該通道準備併發送通知給APN,這會將通知推送到目標設備。

檢查此鏈接解釋清楚蘋果推送通知服務

http://mobiforge.com/developing/story/programming-apple-push-notification-services

0
votes
answers
23 views
+10

Iphone線程優先

0

我的應用程序在自己的線程中處理音頻,並使用AudioUnits播放緩衝區。Iphone線程優先

當我的應用程序進入我開始聽到從我的聲音平靜了一些小問題的背景。
現在這不是最糟糕的部分。

在我進入我可以通過我的應用程序滾動的UIScrollView在我的音頻線沒有問題的背景下,但之後,我從後臺返回任何滾動導致故障在我的音樂。

我檢查之前和之後backgrounding使用[[NSThread currentThread] threadPriority]我的線程優先級和那些似乎並沒有什麼不同。

可能是什麼問題?

沙发
0
1

想通了。我在發佈設置下重建了應用程序,現在一切正常,聽起來很棒。

板凳
0
1

可能是什麼問題?

很可能,您的音頻處理是計算密集型的,並且沒有足夠的CPU週期讓系統保持對用戶輸入的響應並允許您的計算全速運行。系統正在嘗試保持UI響應並抑制計算,導致跳過。

的修復很可能會是讓你的計算使用較少的CPU,無論是通過提高效率或者少做工作。

+0

我已經解決了這個問題。令我困惑的是,Scrolling和其他用戶界面不會影響我的音頻處理,直到應用程序進入後臺。 – Dmacpro 2011-03-30 03:57:21

+0

只要你的應用程序在後臺,根據定義,有另一個應用程序在前臺運行,消耗資源等等......你正在爭奪同一組資源,但競爭更激烈。不知道更多,很難具體說。 – bbum 2011-03-30 03:58:48

+0

是的,我只是不明白爲什麼,當它回到前臺並重置我的線程優先級時,我的音頻引擎表現得像它仍然在後臺? – Dmacpro 2011-03-30 04:02:07

0
votes
answers
15 views
+10

Swift - 當不同的UITableView單元中的另一個播放按鈕被按下時,如何自動停止當前正在播放的音頻?

1

我是一位快速入門者,目前正在開發我的第一款iOS應用程序。Swift - 當不同的UITableView單元中的另一個播放按鈕被按下時,如何自動停止當前正在播放的音頻?

我有一個TableViewController它有幾個單元格,每個單元格包含一個播放按鈕。當按下幾個播放按鈕時,同時播放幾個不同的音頻,但是當按下另一個播放播放按鈕時,我想要停止正在播放的音頻。

以下是我創建的示例代碼。

請給我一個建議。非常感謝!

ViewController.swift

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var tableView: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 

    tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "cell") 

} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 3 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 88 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    return cell 
} 


} 

TableViewCell.swift

import UIKit 
import AVFoundation 

class TableViewCell: UITableViewCell, AVAudioPlayerDelegate { 

var audioPlayer: AVAudioPlayer = AVAudioPlayer() 
var counter = 0 

@IBAction func buttonTapped(_ sender: Any) { 

    // Audio player setting 
    do { 

     audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "sample", ofType: "mp3")!)) 
     audioPlayer.delegate = self 
     audioPlayer.prepareToPlay() 

    } catch { 
     print(error) 
    } 

    if counter == 0 { 
     audioPlayer.play() 
     counter = 1 
    } else { 
     audioPlayer.stop() 
     counter = 0 
    } 
} 

} 
沙发
0
0

一種可能的解決方案是創建_currentActivePlayer對象變量。當你開始播放音頻,然後分配給它播放播放器。當其他單元想播放音頻時,檢查該變量,停止播放器並分配新的播放器。

+0

謝謝您的回覆!我試圖創建一個像你在ViewController.swift中建議的對象,但我有一個檢測表視圖單元格中按下哪個播放按鈕的問題。我不確定我是否在正確的道路上。你能否給我更多的線索?先謝謝你。 – coonie

+0

Stackoverflow上有很多問題如何在按鈕處理程序中獲取相應的單元格。我不想複製答案,只需找到解決方案。 – kirander

+0

好的。謝謝! – coonie

148
votes
answers
22 views
+10

How can I create local notifications in iOS?

I would like to know how I can setup local notifications so that at the time I set, my app generates a notification/alert with a customized message...

沙发
+890

以下是適用於我的項目的 LocalNotification 的示例代碼。

Objective-C:

此代碼塊在<代碼>的AppDelegate 文件:

 <代碼>  - (BOOL)應用:(UIApplication的*)應用didFinishLaunchingWithOptions:(NSDictionary的*)launchOptions {[launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]; //在應用程序啟動後覆蓋自定義點。返回YES; //當應用程序處於前台(活動模式)時調用此代碼塊 - (void)應用程序:(UIApplication *)應用程序didReceiveLocalNotification:(UILocalNotification *)通知{UIAlertView * notificationAlert = [[UIAlertView alloc] initWithTitle:@“ soundName = UILocalNotificationDefaultSoundName; notification.applicationIconBadgeNumber = 10; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; }   

上面的代碼顯示一個AlertView後7秒的時間間隔按下按鈕綁定 startLocalNotification 如果應用程序在後台然後顯示 BadgeNumber 為10並具有默認通知聲音。

此代碼適用於iOS 7.x及更低版本,但對於 iOS 8,它將在控制台上提示:< / p>

嘗試使用警報安排本地通知但未收到用戶顯示警報的權限

這意味著您需要註冊本地通知。這可以使用以下方法實現:

  if([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings :)]){[application registerUserNotificationSettings [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; }   

你也可以參考博客,用於本地通知。

Swift:

AppDelegate.swift 文件應該看起來像這個:

  func應用程序(應用程序:UIApplication,didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?) - &gt; Bool {//在應用程序啟動後覆蓋自定義點。application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes:UIUserNotificationType.Sound | UIUserNotificationType.Badge | UIUserNotificationType.Alert,類別:無))返回true}   

在迅速文件(比如<代碼> ViewController.swift )你要在其中創建本地通知應包含以下代碼:

  // MARK: - 按鈕函數func buttonIsPressed(sender:UIButton){println(“buttonIsPressed函數調用( UIButton.description())“)var localNotification = UILocalNotification()localNotification.fireDate = NSDate(timeIntervalSinceNow:3)localNotification.alertBody =“這是從2.0斯威夫特本地通知”localNotification.timeZone = NSTimeZone.localTimeZone()localNotification.repeatInterval = NSCalendarUnit.CalendarUnitMinute localNotification.userInfo = [“重要”:“數據”]; localNotification.soundName = UILocalNotificationDefaultSoundName localNotification.applicationIconBadgeNumber = 5 localNotification.category =“Message”UIApplication.sharedApplication()。scheduleLocalNotification(localNotification)} // MARK: -  viewDidLoad class ViewController:UIViewController {var objButton:UIButton!override func viewDidLoad(){super.viewDidLoad()。objButton = UIButton.buttonWithType(.Custom)為?UIButton objButton.frame = CGRectMake(30,100,150,40)objButton.setTitle(“點擊我”,forState:。正常)objButton.setTitle(“按下按鈕”,forState:.Highlighted)objButton.addTarget(個體,動作:“buttonIsPressed:”,forControlEvents:.TouchDown) 。}。}   

您在iOS 9及更低版本中使用本地通知的方式在iOS 10中完全不同。

在屏幕抓取下方來自Apple的發行說明描述了這一點。

您可以參考UserNotification的rel =“noreferrer”> Apple參考文檔

以下是本地通知的代碼:

Objective-C :

  1. App-delegate.h 文件中使用 @import UserNotifications;

  2. App-delegate應符合 UNUserNotificationCenterDelegate 協議

  3. didFinishLaunchingOptions 中使用以下代碼:

      UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)completionHandler:^(BOOL授予,NSError * _Nullable錯誤){if(!error){NSLog(@“request authorization succeeded!”); [self showAlert]; }};  - (void)showAlert {UIAlertController * objAlertController = [UIAlertController alertControllerWithTitle:@“Alert”消息:@“顯示警告!” preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@“OK”樣式:UIAlertActionStyleCancel處理程序:^(UIAlertAction * action){NSLog(@“Ok clicked!”); }]; [objAlertController addAction:cancelAction]; [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:objAlertController animated:YES completion:^ {}];    
  4. 現在在任何視圖控制器中創建一個按鈕,在IBAction中使用以下代碼:

      UNMutableNotificationContent * objNotificationContent = [[ UNMutableNotificationContent alloc] init]; objNotificationContent.title = [NSString localizedUserNotificationStringForKey:@“Notification!”參數:nil]; objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@“這是本地通知消息!”參數:nil]; objNotificationContent.sound = [UNNotificationSound defaultSound]; // 4.更新應用程序圖標徽章編號objNotificationContent.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1); //在五秒鐘內發送通知。UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10.f重複:否]; UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@“ten”content:objNotificationContent trigger:trigger]; // 3.安排localNotification UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter]; [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error){if(!error){NSLog(@“Local Notification succeeded”); } else {NSLog(@“本地通知失敗”); }};     

    Swift 3:

    1. AppDelegate.swift 文件中使用 import UserNotifications
    2. Appdelegate應符合 UNUserNotificationCenterDelegate protocol
    3. didFinishLaunchingWithOptions 中使用以下代碼

        //在應用程序啟動後覆蓋自定義點。let center = UNUserNotificationCenter.current()center.requestAuthorization(options:[.alert,.sound]){(授予,錯誤)//根據授權啟用或禁用功能。if error!= nil {print(“Request authorization failed!”)} else {print(“Request authorization succeeded!”)self。
           
      			
              

我是否一定需要在按下按鈕時運行funcButtonIsPressed?如果我希望應用程序默認情況下每週發出一次通知,我應該將它添加到初始VC的viewDidLoad中,該怎麼辦? - Dave G 16年2月24日1:08

另外,為什麼你的AppDelegate.swift文件有兩次didFinishLaunchingWithOptions? - Dave G 2016年2月24日10:32

“導入UserNotifications”在ViewController中導入 - iOS 1月2日11:05

板凳
+510

在appdelegate.m文件中,在applicationDidEnterBackground中編寫以下代碼以獲取本地通知

   - (void)applicationDidEnterBackground:(UIApplication *)application {UILocalNotification * notification = [[UILocalNotification alloc]在裡面]; notification.repeatInterval = NSDayCalendarUnit; [notification setAlertBody:@“Hello world”]; [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]]; [notification setTimeZone:[NSTimeZone defaultTimeZone]]; [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]]; }  
     
			
        

謝謝。幫幫我:D - 弗拉基米爾2014年4月28日7:01

當您使用setScheduledLocalNotifications安排一個通知時:是不必要的。有scheduleLocalNotification方法,它接受一個參數 - 要安排通知。developer.apple.com.cn/library/ios/DOCUMENTATION/UIKit/Reference / ...: - Paul Brewczynski 2014年9月25日15:28

地板
+60

創建本地通知非常簡單。只需按照以下步驟操作

  1. 在viewDidLoad()函數中,詢問用戶是否允許您的應用顯示通知。為此,我們可以使用以下代碼。

      UNUserNotificationCenter.current()。requestAuthorization(options:[.alert,.sound,.badge],completionHandler:{didAllow,error in})   
  2. 然後您可以創建一個按鈕,然後在action函數中編寫以下代碼以顯示通知。

      //創建通知內容let content = UNMutableNotificationContent()//添加標題,副標題,正文和徽章content.title =“嘿這是簡化的iOS”content.subtitle =“ 即使應用程序位於前台,您也可以顯示通知。為此,您只需添加名為 UNUserNotificationCenterDelegate     

    的委託。有關詳細信息,請訪問此博客文章: iOS本地通知教程

是否可以每天用太平洋時間重複通知並重複直到應用程序打開? - Mitul Marsoniya 18年2月23日凌晨5點

@KashfaKhan你能告訴我,當應用程序處於後台並且應用程序收到通知時,會執行哪種方法? - ArgaPK 18年8月18日11:49

4楼
+10
   - (void)applicationDidEnterBackground:(UIApplication *)application {UILocalNotification * notification = [[UILocalNotification alloc] init]; notification.repeatInterval = NSDayCalendarUnit; [notification setAlertBody:@“Hello world”]; [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]]; [notification setTimeZone:[NSTimeZone defaultTimeZone]]; [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]]; }   

這是有效的,但在iOS 8.0及更高版本中,您的應用程序必須使用註冊用戶通知 - [UIApplication registerUserNotificationSettings:] 在能夠安排和呈現UILocalNotifications之前,不要忘記這一點。

- [UIApplication registerUserNotificationSettings:]將覆蓋推送通知設置。所以如果使用了push actionable通知,請注意。 - Avijit Nagare 2016年7月11日9:07

5楼
+10
UIApplicationDelegate,UNUserNotificationCenterDelegate {let notificationCenter = UNUserNotificationCenter.current()var window:UIWindow?func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey:Any]?) - &gt; Bool {//確認Delegete並請求權限notificationCenter.delegate = self let options:UNAuthorizationOptions = [.alert,.sound,.badge] notificationCenter.requestAuthorization(options:options){(didAllow,error)in if!didAllow {print (“用戶已拒絕通知”)}}返回true} func applicationWillResignActive(_ application:UIApplication){} func applicationDidEnterBackground(_ application:categoryIdentifier = categoryIdentifire //添加帶有更多內容的通知附件if(notificationType ==“帶內容的本地通知”){let imageName =“Apple”guard let imageURL = Bundle.main.url(forResource:imageName,withExtension:“png” )else {return} let attachment = try!UNNotificationAttachment(標識符:imageName,url:imageURL,選項:.none)content.attachments = [attachment]} let trigger = UNTimeIntervalNotificationTrigger(timeInterval:5,重複:false)let identifier =“Local Notification”let request = UNNotificationRequest(identifier:標識符,內容:內容,觸發器:觸發器)notificationCenter。count} func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - &gt; UITableViewCell {let cell = tableView.dequeueReusableCell(withIdentifier:“Cell”,for:indexPath)cell.textLabel?.text = notifications [indexPath.row] return cell} func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){let notificationType = notifications [indexPath.row] let alert = UIAlertController(標題:“”,消息:“5秒後”+ notificationType +“將出現”,preferredStyle:.alert)讓okAction = UIAlertAction(標題:“好的,我會的在self.appDelegate中等待“,style:.default”{(action)。

這對我有用...謝謝swifyBoy - Khushal iOS Jun 12 at 12:11

6楼
0

iOS 8及以上用戶,請將其包含在App委託中以使其正常工作。

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings :)]){[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; } return YES; }   

然後添加這行代碼會有所幫助,

   - (void)applicationDidEnterBackground:(UIApplication *)application {UILocalNotification * notification = [[ UILocalNotification alloc] init]; 通知。repeatInterval = NSDayCalendarUnit; [notification setAlertBody:@“Hello world”]; [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]]; [notification setTimeZone:[NSTimeZone defaultTimeZone]]; [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]]; }  
     
			
        
7楼
0
   - (void)kundanselect {NSMutableArray * allControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; NSArray * allControllersCopy = [allControllers copy]; if([[allControllersCopy lastObject] isKindOfClass:[kundanViewController class]]){[[NSNotificationCenter defaultCenter] postNotificationName:@“kundanViewControllerHide”object:nil userInfo:nil]; } else {[[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@“selected”]; [self performSegueWithIdentifier:@“kundansegue”發件人:self]; }   

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ApparelsViewControllerHide)name:@“ApparelsViewControllerHide”對象:

53
votes
answers
10 views
+10

Build fat static library (device + simulator) using Xcode and SDK 4+

It appears that we can - theoretically - build a single static library that includes both simulator and iPhone and iPad.

However, Apple has no documentation on this that I can find, and Xcode's default templates are NOT configured to do this.

I'm looking for a simple, portable, re-usable technique that can be done inside Xcode.

Some history:

  • In 2008, we used to be able to make single static-libs that included both sim and device. Apple disabled that.
  • Throughout 2009, we made pairs of static libs - one for sim, one for device. Apple has now disabled that too.

References:

  1. This is a great idea, it's an excellent approach, but it doesn't work: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • There's some bugs in his script that means it only works on his machine - he should be using BUILT_PRODUCTS_DIR and/or BUILD_DIR instead of "guesstimating" them)
    • Apple's latest Xcode prevents you from doing what he's done - it simply will not work, due to the (Documented) change in how Xcode processes targets)
  2. Another SO questioner asked how to do it WITHOUT xcode, and with responses that focussed on the arm6 vs arm7 part - but ignored the i386 part: How do i compile a static library (fat) for armv6, armv7 and i386

    • Since Apple's latest changes, the Simulator part isn't the same as the arm6/arm7 difference any more - it's a different problem, see above)
沙发
+300

There is a command-line utility xcodebuild and you can run shell command within xcode. So, if you don't mind using custom script, this script may help you.

#Configurations.
#This script designed for Mac OS X command-line, so does not use Xcode build variables.
#But you can use it freely if you want.

TARGET=sns
ACTION="clean build"
FILE_NAME=libsns.a

DEVICE=iphoneos3.2
SIMULATOR=iphonesimulator3.2






#Build for all platforms/configurations.

xcodebuild -configuration Debug -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Debug -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO







#Merge all platform binaries as a fat binary for each configurations.

DEBUG_DEVICE_DIR=${SYMROOT}/Debug-iphoneos
DEBUG_SIMULATOR_DIR=${SYMROOT}/Debug-iphonesimulator
DEBUG_UNIVERSAL_DIR=${SYMROOT}/Debug-universal

RELEASE_DEVICE_DIR=${SYMROOT}/Release-iphoneos
RELEASE_SIMULATOR_DIR=${SYMROOT}/Release-iphonesimulator
RELEASE_UNIVERSAL_DIR=${SYMROOT}/Release-universal

rm -rf "${DEBUG_UNIVERSAL_DIR}"
rm -rf "${RELEASE_UNIVERSAL_DIR}"
mkdir "${DEBUG_UNIVERSAL_DIR}"
mkdir "${RELEASE_UNIVERSAL_DIR}"

lipo -create -output "${DEBUG_UNIVERSAL_DIR}/${FILE_NAME}" "${DEBUG_DEVICE_DIR}/${FILE_NAME}" "${DEBUG_SIMULATOR_DIR}/${FILE_NAME}"
lipo -create -output "${RELEASE_UNIVERSAL_DIR}/${FILE_NAME}" "${RELEASE_DEVICE_DIR}/${FILE_NAME}" "${RELEASE_SIMULATOR_DIR}/${FILE_NAME}"

Maybe looks inefficient(I'm not good at shell script), but easy to understand. I configured a new target running only this script. The script is designed for command-line but not tested in :)

The core concept is xcodebuild and lipo.

I tried many configurations within Xcode UI, but nothing worked. Because this is a kind of batch processing, so command-line design is more suitable, so Apple removed batch build feature from Xcode gradually. So I don't expect they offer UI based batch build feature in future.

謝謝,真正有趣的是,底層的簡單命令似乎仍然有效 - 這只是Apple徹底打破了他們的GUI。看起來我可以製作一個完全自定義的項目模板,通過預先製作所有目標,並通過xcode構建變量連接此腳本來“修復”並修復Apple破壞的東西。我將在我的下一個項目中嘗試:) - 2010年10月2日的Adam於20:01

我使用了類似於此的腳本並將其放在僅包含shell腳本的新目標下。上面的遞歸構建腳本非常聰明,但不必要地混淆。 - benzado 2011年2月9日18:52

我喜歡shell腳本這樣的東西,這是我的服用gist.github.com/3178578 - slf 7月25日'12在20:47

@benzado是的,我故意避免了複雜性,因為我認為shell腳本必須易於閱讀才能進行修改。 - Eonil 7月26日在5:42

lipo:無法打開輸入文件:/ Debug-iphoneos / - Dima 2013年3月11日9:11

板凳
+90

I needed a fat static lib for JsonKit so created a static lib project in Xcode and then ran this bash script in the project directory. So long as you've configured the xcode project with "Build active configuration only" turned off, you should get all architectures in one lib.

#!/bin/bash
xcodebuild -sdk iphoneos
xcodebuild -sdk iphonesimulator
lipo -create -output libJsonKit.a build/Release-iphoneos/libJsonKit.a build/Release-iphonesimulator/libJsonKit.a
地板
+70

IOS 10 Update:

I had a problem with building the fatlib with iphoneos10.0 because the regular expression in the script only expects 9.x and lower and returns 0.0 for ios 10.0

to fix this just replace

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.{3}$')

with

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '[\.0-9]{3,4}$')

謝謝。我今天早上做了類似的改變,但是用了d。我認為這是我們想要的(它比你更好還是更差?)... grep -o'd {1,2} .d {2} $' - Adam 2016年9月19日16:23

我認為我的更可靠,因為它只考慮數字 - 本2016年9月19日18:27

不,你的比賽有一種特殊的寫數字方式。鑑於Apple對(和使用)美化字符和文本(例如文件名)的歷史支持,我希望您對幾位數的專有選擇不太可靠。 - Adam於2016年9月21日8:10

好吧也許你是對的。至少我的項目也工作了,我們對接下來的89個ios版本是安全的 - 大約2016年9月21日8:26

@ben解決方案適合我,Adam的正則表達式'[ .0-9] {3,4} $'給出錯誤代碼2 - Zee Oct 5 '16 at 8:27

4楼
+40

I've made this into an Xcode 4 template, in the same vein as Karl's static framework template.

I found that building static frameworks (instead of plain static libraries) was causing random crashes with LLVM, due to an apparent linker bug - so, I guess static libraries are still useful!

嗨邁克爾,我已經嘗試過您的靜態庫模板,但我可以編譯為模擬器而不是設備,這裡的錯誤:** BUILD FAILED **以下構建命令失敗:ProcessPCH / var / folders / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth MenuBarUniversal / MenuBarUniversal-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler(1 failure )顯示前200個通知只有Command / bin / sh失敗,退出代碼為65 - Kappe 11年1月1日在10:40

5楼
+20

Great job! I hacked together something similar, but had to run it separately. Having it just be part of the build process makes it so much simpler.

One item of note. I noticed that it doesn't copy over any of the include files that you mark as public. I've adapted what I had in my script to yours and it works fairly well. Paste the following to the end of your script.

if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ]
then
  mkdir -p "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
  cp "${CURRENTCONFIG_DEVICE_DIR}"/usr/local/include/* "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
fi

好的,我已將其添加到上面的答案中。(還沒有機會測試它,但看起來對我來說) - 亞當2010年12月2日15:02

6楼
+10

I actually just wrote my own script for this purpose. It doesn't use Xcode. (It's based off a similar script in the Gambit Scheme project.)

Basically, it runs ./configure and make three times (for i386, armv7, and armv7s), and combines each of the resulting libraries into a fat lib.

180
votes
answers
18 views
+10

iOS 6: How do I restrict some views to portrait and allow others to rotate?

I have an iPhone app that uses a UINavigationController to present a drill-down interface: First one view, then another, up to four levels deep. I want the first three views restricted to portrait orientation and only the last view should be allowed to rotate to landscape. When returning from the fourth view to the third and the fourth view was in landscape orientation I want everything to rotate back to portrait.

In iOS 5 I simply defined shouldAutorotateToInterfaceOrientation: in each of my view controllers to return YES for the allowable orientations. Everything worked as described above, including the return to portrait even if the device was being held in landscape orientation when returning from view controller #4 to #3.

In iOS 6 all view controllers rotate to landscape, breaking those that weren't meant to. The iOS 6 release notes say

More responsibility is moving to the app and the app delegate. Now, iOS containers (such as UINavigationController) do not consult their children to determine whether they should autorotate. [...] The system asks the top-most full-screen view controller (typically the root view controller) for its supported interface orientations whenever the device rotates or whenever a view controller is presented with the full-screen modal presentation style. Moreover, the supported orientations are retrieved only if this view controller returns YES from its shouldAutorotate method. [...] The system determines whether an orientation is supported by intersecting the value returned by the app’s supportedInterfaceOrientationsForWindow: method with the value returned by the supportedInterfaceOrientations method of the top-most full-screen controller.

So I subclassed UINavigationController, gave my MainNavigationController a boolean property landscapeOK and used this to return the allowable orientations in supportedInterfaceOrientations. Then in each of my view controllers' viewWillAppear: methods I have a line like this

    [(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

to tell my MainNavigationController the desired behavior.

Here comes the question: If I now navigate to my fourth view in portrait mode and turn the phone over it rotates to landscape. Now I press the back button to return to my third view which is supposed to work portrait only. But it doesn't rotate back. How do I make it do that?

I tried

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]

in the viewWillAppear method of my third view controller, but it doesn't do anything. Is this the wrong method to call or maybe the wrong place to call it or should I be implementing the whole thing in a totally different way?

沙发
+950

我遇到了同樣的問題,並找到了適合我的解決方案。為了使其工作, 足以在UINavigationController中實現 - (NSUInteger)supportedInterfaceOrientations 您還需要在控制器#3中實現此方法,這是第一個在彈出控制器#4後僅為縱向的控制器。所以,我在UINavigationController中有以下代碼:

   - (BOOL)shouldAutorotate {return YES; }  - (NSUInteger)supportedInterfaceOrientations {if(self.isLandscapeOK){//對於iPhone,你也可以返回UIInterfaceOrientationMaskAllButUpsideDown返回UIInterfaceOrientationMaskAll; }返回UIInterfaceOrientationMaskPortrait; }   

在視圖控制器#3中,添加以下內容:

   - (NSUInteger)supportedInterfaceOrientations {return UIInterfaceOrientationMaskPortrait; }   

您無需向視圖控制器#1,#2和#4添加任何內容。這對我有用,我希望它會對你有幫助。

你解決了幾個月來人們試圖解決的問題!你應該得到很多讚譽!我將supportedInterfaceOrientations添加到UIViewController上的類別,它完美地作為這些僅限肖像控制器的默認設置。 - dwery 10年12月26日在19:03

在SO的100個不同答案中,這是真正有效的答案。謝謝:-) - Christer Nordvik 11年11月15日9:57

我有這個設置,當從肖像回到僅限於風景的視圖控制器時,仍然會出現錯誤的方向。它不會自動旋轉到景觀 - 其他人還在看它嗎? - Oded Ben Dov 2013年2月19日16:34

如果所需的景觀視圖控制器是從segue呈現並且沒有導航控制器怎麼辦? - jesses.co.tt 2013年9月2日19:04

將最後一個編輯為NSUInteger作為返回類型。 - abssssive 2014年5月19日22:19

板凳
+670

添加 CustomNavigationController

在其中覆蓋這些方法:

   - (BOOL)shouldAutorotate {return [[self.viewControllers lastObject] shouldAutorotate]; }  - (NSUInteger)supportedInterfaceOrientations {return [[self.viewControllers lastObject] supportedInterfaceOrientations]; }(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; }   

現在在plist中添加所有方向

在視圖控制器中僅添加所需的圖像:

   - (BOOL)shouldAutorotate {return YES; }  - (NSUInteger)supportedInterfaceOrientations {return UIInterfaceOrientationMaskPortrait; }   

這些方法會覆蓋導航控制器方法

你真的用這個答案釘了它!非常感謝。你真的幫了很多忙。這對我來說一直是個大問題。很好。 - K2Digital 12年12月29日6:26

謝謝!這花了我很多時間和精力來弄清楚! - bkbeachlabs 2013年1月6日17:23

謝謝。恕我直言,這是正確的解決方案。 - Shiun 2013年4月3日20:48

你是生命保護者....這也適用於我的應用程序。其實我在我的應用程序中想要的是我所有的ViewController都處於縱向模式,而我的一個ViewController處於Landscap和縱向模式。我也支持iOS 5.0和iOS 6.0這就是為什麼我很困惑,但這是一個很好的解決方案。我在我的根視圖控制器中添加CustomNavigationController並根據我的需要提供支持。再次感謝。 - Bhavin_m 2013年5月25日12:17

是的,真棒! - StianHøiland2013年6月21日9:21

地板
+90

在SO上查看無數類似問題的每個答案後,沒有一個答案對我有用,但他們確實給了我一些想法。以下是我最終解決問題的方法:

首先,確保項目目標中的支持接口方向包含旋轉視圖所需的所有方向。

接下來,製作一個 UINavigationController 的類別(自Apple說不要繼承它):

  @implementation UINavigationController(iOS6AutorotationFix) - (BOOL)shouldAutorotate {return [self.topViewController shouldAutorotate]; } @end   

將您希望能夠旋轉的類別和視圖控制器(我將其稱為 RotatingViewController )導入到最高級別的視圖控制器,該控制器應包含您的導航控制器。在該視圖控制器中,按如下方式實現 shouldAutorotate 請注意,這不應該與要旋轉的視圖控制器相同。

   - (BOOL)shouldAutorotate {BOOL shouldRotate = NO; if([navigationController.topViewController isMemberOfClass:[RotatingViewController class]]){shouldRotate = [navigationController.topViewController shouldAutorotate]; } return shouldRotate; }   

最後,在 RotatingViewController 中,實現 shouldAutorotate < / code>和 supportedInterfaceOrientations 如下:

   - (BOOL)shouldAutorotate {//旋轉視圖的準備工作轉到這裡返回YES; }  - (NSUInteger)supportedInterfaceOrientations {return UIInterfaceOrientationMaskAllButUpsideDown; //或者你想要旋轉}   

你需要這樣做的原因是因為iOS 6控制旋轉到根視圖控制器而不是頂視圖控制器。如果您希望單個視圖的旋轉行為與堆棧中的其他視圖的行為不同,則需要在根視圖控制器中為其編寫特定的大小寫。 - (BOOL)shouldAutorotate {//旋轉視圖的準備工作轉到這裡返回YES; } - (NSUInteger)supportedInterfaceOrientations {return UIInterfaceOrientationMaskAllButUpsideDown; //或者你想要旋轉}

你需要這樣做的原因是因為iOS 6控制旋轉到根視圖控制器而不是頂視圖控制器。如果您希望單個視圖的旋轉行為與堆棧中的其他視圖的行為不同,則需要在根視圖控制器中為其編寫特定的大小寫。 - (BOOL)shouldAutorotate {//旋轉視圖的準備工作轉到這裡返回YES; } - (NSUInteger)supportedInterfaceOrientations {return UIInterfaceOrientationMaskAllButUpsideDown; //或者你想要旋轉}

你需要這樣做的原因是因為iOS 6控制旋轉到根視圖控制器而不是頂視圖控制器。如果您希望單個視圖的旋轉行為與堆棧中的其他視圖的行為不同,則需要在根視圖控制器中為其編寫特定的大小寫。 您需要這樣做的原因是因為iOS 6控制旋轉到根視圖控制器而不是頂視圖控制器。如果您希望單個視圖的旋轉行為與堆棧中的其他視圖的行為不同,則需要在根視圖控制器中為其編寫特定的大小寫。 您需要這樣做的原因是因為iOS 6控制旋轉到根視圖控制器而不是頂視圖控制器。如果您希望單個視圖的旋轉行為與堆棧中的其他視圖的行為不同,則需要在根視圖控制器中為其編寫特定的大小寫。

這是一個值得更多愛的優秀答案。以下是我在其他任何地方都找不到的信息,這是至關重要的:如果您希望單個視圖的旋轉行為與堆棧中的其他視圖不同,則需要在根中為其編寫特定的大小寫查看控制器 - shmim 2014年11月10日20:00

我想如果你有一個navigationController作為應用程序故事板的第一個成員作為初始控制器,那麼這將是有效的但是當初始控制器只是一個ViewController的情況呢? - SpaceDog 17年3月13日18:45

4楼
+40

我沒有足夠的聲譽來評論@Brian的回答,所以我會在這裡添加我的註釋。

Brian提到iOS6將旋轉控制提供給rootViewController - 這不僅僅是一個如上所述的UINavigationController,也是一個UITabBarController,它適合我。我的結構如下所示:

  • UITabBarController
    • UINavigationController
      • UIViewControllers ...
      • UINavigationController
        • UIViewControllers ...

          所以我首先在自定義UITabBarController中添加方法,然後在一個自定義的UINavigationController,最後是在特定的UIViewController中。

          來自UITabBarController和UINavigationController的示例:

             - (BOOL)shouldAutorotate {return [self.viewControllers.lastObject shouldAutorotate]; }  - (NSUInteger)supportedInterfaceOrientations {return [self.viewControllers.lastObject supportedInterfaceOrientations]; }  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation]; }   viewControllers.lastObject shouldAutorotate]; }  - (NSUInteger)supportedInterfaceOrientations {return [self.viewControllers.lastObject supportedInterfaceOrientations]; }  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation]; }   viewControllers.lastObject shouldAutorotate]; }  - (NSUInteger)supportedInterfaceOrientations {return [self.viewControllers.lastObject supportedInterfaceOrientations]; }  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation]; }   (UIInterfaceOrientation)toInterfaceOrientation {return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation]; }   (UIInterfaceOrientation)toInterfaceOrientation {return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation]; }  
               
          			
                  

我實際上在我的根視圖控制器中使用了UITabBarController作為實例變量,因為你不應該在6.0之前的iOS版本中繼承UITabBarController並且我需要支持回到iOS 5.0。 - Brian於2013年8月20日19:33

@micmdk我有同樣的問題。請告知如何解決,我已復制您的代碼並放入自定義Navigation Controller和customUabbarController並將其他視圖控制器設置為Brian的Guided。但仍未獲得縱向固定視圖控制器。 - Ram S 2015年1月17日8:16

@Brian我有同樣的問題。請告知如何解決,我已復制您的代碼並將其置於自定義Navigation Controller和customUabbarController中,並將其他視圖控制器設置為Micmdk的Guided。但仍然沒有在ios8中獲得縱向固定視圖控制器。 - Ram S 2015年1月17日8:16

5楼
+30

我想對我自己的問題給出部分答案。我在我的第三個 UIViewController viewWillAppear 方法中找到了以下代碼行:

  [[UIDevice currentDevice] performSelector:NSSelectorFromString(@“setOrientation:”)withObject:(id)UIInterfaceOrientationPortrait];   

但我真的不喜歡這個解決方案。它使用技巧分配給只讀屬性,根據Apple文檔,該屬性表示設備的物理方向。這就像告訴iPhone在用戶手中跳到正確的方向。

我很想把它留在我的應用程序中,因為它只是起作用。

如果您將應用留在那裡,您的應用很可能會被拒絕。我也在尋找解決方案,但看起來不可能。所有我能找到的是回答這個問題:stackoverflow.com/questions/7196300 / ...它有點工作,但由於某種原因它打破了我的一個視圖控制器中的按鈕觸摸處理 - Lope 10年6月6日在11:39

我抓住了機會並提交給Apple。還在等待審核......我會告訴你的。 - HaraldBögeholz12年8月8日在7:11

蘋果剛剛批准我的應用程序,這個黑客到位,是的!我希望它在未來的iOS更新中不會適得其反。與此同時,我仍然願意接受清潔解決方案的建議! - HaraldBögeholz12年12月12日19:48

@HaraldBögeholzGrt建議。但是當我使用ARC工作在新的xCode時,我不能使用ans。我正在獲取“使用NSInteger(也就是int)來強制執行id不允許使用ARC PerformSelector可能導致洩漏,因為它的選擇器未知”我該如何解決這個問題?如果我們得到解決方案,我真的很感激你。當我因為一些洩漏數據而關閉了針對特定視圖的應用程序崩潰。請建議我 - Hitarth 2013年2月7日14:09

使用私有API絕不是解決方案。 - Javier Soto 2013年7月11日22:25

6楼
+10

這是我用於ios 6.0中的方向支持

   - (BOOL)shouldAutorotate {return YES; }  - (NSUInteger)supportedInterfaceOrientations {return UIInterfaceOrientationMaskAll; }  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return UIInterfaceOrientationPortrait; }  
     
			
        
7楼
+10

因為這是一個受到高度關注的線程。我想我會加上我認為最簡單的答案。這適用於ios8及以上

   - (BOOL)shouldAutorotate {return YES; }   

   - (UIInterfaceOrientationMask)supportedInterfaceOrientations {return UIInterfaceOrientationMaskPortrait; }   

就是這樣。享受!

哦,我的ViewControllers嵌入在導航控制器中,我不需要以任何方式進行子類化或配置。

8楼
0

這可能對每個人都不起作用,但對我來說效果很好。而不是實現...

  [(MainNavigationController *)[self navigationController] setLandscapeOK:YES];   

在所有控制器的viewWillAppear中,我決定通過覆蓋 UINavigationControllerDelegate 方法 navigationController:willShowViewController:animated:

 < code>  - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {self.previousVCLandscapeOK = self.isLandscapeOK; //在推送新VC之前存儲當前VC的方向首選項,這樣我們就可以在自定義“返回”方法中再次設置這個方法self.isLandscapeOK = NO; //設置NO為所有VC的默認值if([viewController isKindOfClass:[YourViewController class]]){self.isLandscapeOK = YES; }   

我發現當從導航堆棧中彈出VC時,不會調用此委託方法。這對我來說不是問題,因為我正在處理我的UINavigationController子類中的後退功能,這樣我就可以為特定的VC設置正確的導航欄按鈕和操作......

  if([viewController isKindOfClass:[ShareViewController class]]){UIButton * backButton = [[UIButton alloc] initWithFrame:CGRectMake(0,0,57,30)]; [backButton setImage:[UIImage imageNamed:@“back-arrow”] forState:UIControlStateNormal]; [backButton addTarget:self action:@selector(back)forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem * backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; viewController.navigationItem.leftBarButtonItem = backButtonItem; UIImageView * shareTitle = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@“share-title”]]; [shareTitle setContentMode:UIViewContentModeScaleAspectFit]; [shareTitle setFrame:CGRectMake(0,0,shareTitle.frame.size.width  -  10,shareTitle.frame.size.height  -  10)]; viewController.navigationItem。titleView = shareTitle; } else if(...){...}   

這是我的 back 方法看起來處理彈出堆棧的VC和設置適當的旋轉偏好...

   - (void)back {self.isLandscapeOK = self.previousVCLandscapeOK; self.previousVCLandscapeOK = NO; [self popViewControllerAnimated:YES]; }   

所以,正如你所看到的,基本上所有發生的事情都是我首先為我設置兩個屬性...

  @property(nonatomic) )BOOL isLandscapeOK; @property(nonatomic)BOOL previousVCLandscapeOK;   

navigationController:willShowViewController:animated: 這將確定即將呈現的VC中支持的方向是什麼。當彈出VC時,我的自定義“後退”方法被調用,然後我將isLandscapeOK設置為通過previousVCLandscapeOK值存儲的內容。

正如我所說,這可能不適用於所有人,但是它對我很有用,我不必擔心為每個視圖控制器添加代碼,我能夠將它全部集中在UINavigationController子類中。

希望這可以幫助某人,因為它做了我。謝謝,傑里米。 這可能不適合所有人,但它對我很有用,我不必擔心向每個視圖控制器添加代碼,我能夠將它全部集中在UINavigationController子類中。

希望這可以幫助某人,因為它幫助了我。謝謝,傑里米。 這可能不適合所有人,但它對我很有用,我不必擔心向每個視圖控制器添加代碼,我能夠將它全部集中在UINavigationController子類中。

希望這可以幫助某人,因為它幫助了我。謝謝,傑里米。

當你說你已經將它添加到你的項目中時,你到底做了什麼?我不認為XCode認為它有效。 - Devin Ceartas 09年9月15日18:22

如果您在XCode 4.6中遇到此問題請訪問此處stackoverflow.com/questions/14622684 / ... - Boris Gafurov 2013年2月22日16:52

更新截圖。 - 用戶2014年10月8日19:46

9楼
0

轉到Info.plist文件並進行更改

10楼
0

你想強制使用iOS 6 app portrait,然後你可以添加到UIViewController子類下面的方法

   - (BOOL)shouldAutorotate {if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad){return YES ; } else {return NO;  - (NSUInteger)supportedInterfaceOrientations {if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad){return UIInterfaceOrientationMaskAll; } else {return UIInterfaceOrientationMaskPortrait; }}  
     
			
        

問題是,除非該視圖是根視圖(它不在此問題中),否則不應調用Autorotate。 - Brian於2013年4月24日15:54

無論出於何種原因,NSUInteger的返回類型都會拋出警告,儘管它是正確的var類型。如果你有OCD使用UIInterfaceOrientationMask而不是。 - C Jones 2016年4月12日6:50

此外,這個解決方案適用於模態視圖控制器(相機視圖),我沒有任何子類UINavigationController的需要。我猜測模態是獨立處理的。與原始問題無關,但設計明智的有用信息。 - C Jones 2016年4月12日6:51

11楼
0

除了一個外,我想讓所有的VC鎖定為縱向。這對我有用。

  1. 添加對plist文件中所有方向的支持。
  2. 在根視圖控制器中,檢測視圖控制器的類型在窗口頂部,並在 supportedInterfaceOrientations 方法中相應地設置應用程序的方向。例如,我只需要在webview位於堆棧頂部時旋轉我的應用程序。這是我在rootVC中添加的內容:

       - (NSUInteger)supportedInterfaceOrientations {UIViewController * topMostViewController = [[Utils getAppDelegate] appNavigationController] .topViewController; if([topMostViewController isKindOfClass:[SVWebViewController類]]){return UIInterfaceOrientationMaskAllButUpsideDown; }返回UIInterfaceOrientationMaskPortrait; }    
         
    			
            

Trunal,這已經有幾個月了,但你能否詳細介紹一下如何檢測頂部的視圖控制器。具體來說,我不確定你到底在做什麼[[Utils getAppDelegate] appNavigationController]。實用工具我猜是你有的課,但我不知道你在做什麼。任何幫助都會很棒! - 本2014年4月18日6:14

12楼
0

我沒有足夠的聲譽來回答@micmdk回復下的@Ram S問題所以我會在這裡添加我的註釋。

當你使用 UITabbarController 時,嘗試將@ micmdk的代碼中的 self.viewControllers.lastObject 更改為 self.selectedViewController ,如下所示:

   - (BOOL)shouldAutorotate {return [self .selectedViewController shouldAutorotate]; }  - (NSUInteger)supportedInterfaceOrientations {return [self.selectedViewController supportedInterfaceOrientations]; }  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]; }  - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {return [self.selectedViewController preferredInterfaceOrientationForPresentation]; }  
     
			
        
13楼
0

您可以在所有View Controller類中實現和覆蓋shouldAutorotate()和supportedInterfaceOrientations var,這些類應該以與應用程序的PLIST中定義的方向不同的方向呈現。

但是,在一個非常重要的用戶界面你可能會遇到一個問題,將它添加到幾十個類中,你不想讓它們都是支持它的幾個常見的子類(MyBaseTableViewController,MyBaseNavigationController和MyBaseTabBarController)。

因為你無法覆蓋直接在UIViewController上的那些方法/ var,你可以在它的子類上做這些,這些子類通常是你的基類,比如UITableViewController,UINavigationController和UITabBarController。

所以你可以實現一些擴展,並且仍然設置MyPreciousViewController,以不同的方向顯示,比如Swift 4的代碼片段:

 擴展UITableViewController {覆蓋open var supportedInterfaceOrientations:UIInterfaceOrientationMask {if let last last = self.navigationController?.childViewControllers.last,last!= self {return last.supportedInterfaceOrientations} else {return [.portrait]}}}擴展名MyPreciousViewController {覆蓋open var supportedInterfaceOrientations:UIInterfaceOrientationMask {return [.portrait,.landscape]}}擴展UINavigationController {override open var supportedInterfaceOrientations:UIInterfaceOrientationMask {return [。肖像]}}擴展UITabBarController {覆蓋open var supportedInterfaceOrientations:UIInterfaceOrientationMask {return [.portrait]}}  
     
			
        
14楼
0

我已經解決了同樣的問題。

如果您使用 UINavigationController 推送視圖控制器,則必須設置以下方法。

 擴展名UINavigationController {覆蓋open var shouldAutorotate:Bool {if topViewController!= nil&amp;&amp; (topViewController?.isKind(of:LogInViewController.self))!{return true} return false} override open var supportedInterfaceOrientations:UIInterfaceOrientationMask {if topViewController!= nil&amp;&amp; (topViewController?.isKind(of:LogInViewController.self))!{return .portrait} return .landscapeRight}覆蓋open var preferredInterfaceOrientationForPresentation:UIInterfaceOrientation {if topViewController!= nil&amp;&amp; (topViewController?.isKind(of:LogInViewController.self))!{return .portrait} return .landscapeRight}}   

代替 LoginViewController 使用你想要顯示的 UIViewController 在我的例子中,我想在 landscape 模式下以 Portrait 模式顯示其他 ViewControllers 中的 LoginViewController

代替 LoginViewController ,使用你想要顯示的 UIViewController 在我的例子中,我想在 landscape 模式下以 Portrait 模式顯示其他 ViewControllers 中的 LoginViewController

代替 LoginViewController ,使用你想要顯示的 UIViewController 在我的例子中,我想在 landscape 模式下以 Portrait 模式顯示其他 ViewControllers 中的 LoginViewController

15楼
-10

請使用以下方法解決此問題

   - (NSUInteger)supportedInterfaceOrientations {return UIInterfaceOrientationMaskPortrait; }   

只返回你想要的方向!!!

就像我寫的那樣,我做到了。這樣可以防止我的視圖控制器旋轉,但是當它返回時它不會強制它回到唯一支持的方向。 - HaraldBögeholz12年12月12日19:45

這對我不起作用。即使已將其包含在我的視圖控制器中,視圖仍會旋轉。是什麼賦予了? - 墊片於12月26日在5:44

為什麼要求maxfiresolutions?它適用於我和@Flo給出的相同方法有很多贊成。 - ViruMax 2014年5月21日5:25

0
votes
answers
15 views
+10

更新設備到iOS 11.2休息和Xcode 9.1支持

17

我試圖運行iOS 11.2的設備上運行我的應用程序並收到以下錯誤:更新設備到iOS 11.2休息和Xcode 9.1支持

Could not locate device supported files.

This iPhone 5s (Model A1457, A1518, A1528, A1530) is running iOS 11.2 (15C114), which may not be supported by this version of Xcode.

我已經使用iPhone 5S(11.1.2版)我想從xcode 9.1(ios 11.1)構建我的項目。

沙发
0
17

看來,蘋果發佈的iOS 11.2公衆不釋放的Xcode 9.2,但(在Mac App Store報告9.1截至發稿時最新的),其中包括必要的iOS的11.2 SDK目標運行iOS 11.2的設備。你應該能夠用Xcode的9.2測試版,您可以從developer download page,如果你有一個開發者賬戶下載您的設備上運行此

編輯:的Xcode 9.2,現在是公開的,你可以從這裏下載Mac App Store

板凳
0
2

Xcode 9.2終於發佈了。您可以從App Store進行更新,或者直接在此處下載:https://download.developer.apple.com/Developer_Tools/Xcode_9.2/Xcode_9.2.xip

+0

我已經下載並還檢查與Xcode_9.2。當我創建一個'單一視圖應用程序'它沒關係,並沒有任何問題構建(iphone 5s)。但是當我使用box2d項目創建cocos2dx時會出現問題。 – AMIT

+0

小心! Xcode 9.2仍然是一個測試版。因此,儘管您可以爲iOS 11.2構建,但您無法將構建提交給Apple。 –

+0

@AndrewDuncan它說,它的發佈版本在這裏:https://itunes.apple.com/tr/app/xcode/id497799835?mt=12(但是,當我安裝時,實際的構建以「b」結尾。 ) –

地板
0
0

我的MacBook上有Xcode9.2,我的MacMini上有8張。所以我只是將11.2 DeviceSupport DeveloperDiskImage .dmg和.signature從MacBook複製到MacMini。工作很好。

+0

你從哪裏下載了磁盤映像? –

+0

當xcode更新時,它會自動添加到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport。所以我只是把Xcode 9的版本放在另一臺電腦上的Xcode 8中。 –

4楼
0
0

對於像我這樣的新手,如果你得到類似這樣的消息:

「這iPhone 6運行iOS 11.2.X,這可能不支持此版本的Xcode的支持」

這意味着你必須更新Xcode。

我打這個問題時,我的手機正在運行11.2.6,我行駛的Xcode 9.0版本

您可以從App Store中更新或只是在這裏下載:https://download.developer.apple.com/Developer_Tools/Xcode_9.2/Xcode_9.2.xip

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 
} 

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

53
votes
answers
18 views
+10

Get itunes link for app before submitting

I read in another post that you can submit the app without the binary but I based on what I have seen this is no longer possible. It seems you cannot submit without the binary and the binary is submitted through the application loader. Is there any other known way to get the itunes/app store link to my app before I submit the binary?

沙发
+110

截至今天,我想說最好的選擇是 @“http://itunes.apple.com/app/%@/id%@?mt=8”,插入:

  1. 您的應用程序小寫名稱,
  2. 您的應用程序ID。

    實際上,這實際上是您可以獲得的鏈接在 iTunes Connect (iTunes Connect&gt;管理您的應用程序&gt;您的應用程序&gt;在App Store中查看)的應用程序頁面上顯示您的應用程序。減去一些參數(看起來 - 在其他未識別的東西之間 - 鏈接到一個精確的國家)。

    我認為它比 itms:// ... 更好,因為這個一個重定向到您設備上的iTunes Store,這不是App Store。然後重定向,等等。 http:// ... 鏈接似乎直接掛鉤到App Store應用程序。

板凳
+100

我已經在2019年4月24日對此網址進行了測試,並且運行良好

https://itunes.apple.com/app/idXXXXXXXXXX

XXXXXXXXXX是來自App Store Connect的Apple ID - &gt; 應用信息 - 一般信息 - Apple ID

希望這有助於某人,因為這裡有很多答案!

完善2017年1月18日的工作 - Dr.Ax 2017年1月18日17:29

這裡的XXXXX應該怎麼辦?Apple ID? - Isuru 2017年2月9日10:28

是XXXXXXXXX是來自iTunes Connect的Apple ID - stan 2017年3月29日9:08

地板
+80

您可以在iTunes Connect上傳二進製文件之前獲取應用程序鏈接。

您只需使用iTunes Connect上傳元數據即可。提交這些數據後,您將獲得Apple ID。通過此ID,您可以獲取應用程序的URL。

例如 http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=appID

其中appID =“您提交時的申請ID元數據“

請檢查一下。它在這里工作。如果您還有任何問題,請告訴我。我會幫你解決問題。

4楼
+50

獲取應用鏈接的最佳方式是

  1. 登錄itunes connect
  2. 轉到我的應用 - &gt; 如果您沒有,請創建應用記錄。
  3. 選擇您的應用 - &gt; 轉到應用程序信息部分
  4. 在頁面底部查看附加信息部分,有一個名為“在App Store上查看”的鏈接。點擊該鏈接,您將獲得適用於您的app.Copy-Paste和Enjoy的確切網址。
6楼
+40

根據 Apple的iTunes Connect文檔 在App Store上查看鏈接僅在至少有一個版本的應用已將其狀態設置為時才可用準備出售

說過你仍然可以看到實際鏈接的內容,你將無法加載頁面。

7楼
+30

轉到 https://itunesconnect.apple.com
如果尚未創建,請創建一個新的應用程序。

打開它並在第一個屏幕( AppStore - &gt;應用程序信息 - >常規)中有一個名為“ Apple ID 的字段strong>“使用 ID號

複製並使用它。是這個。

8楼
+30

似乎app id現在是itunesconnect頁面中的Apple ID。轉到應用程序信息並向下滾動,直到看到Apple ID。這是您的應用ID。

http://itunes.apple的.com /應用程序/ ID [Apple_ID]

這在app store連接中是否可見? - Amber K 2月4日12:16

是。這是完全相同的程序。我沒有發現任何差異。似乎App Store Connect只是iTunes Connect的品牌重塑。 - KaYBlitZ 2月5日18:04

9楼
+20

如果AdWords不允許指向iTunes的鏈接,則可解決此問題...

如果您使用iTunesConnect底部生成的鏈接,並且您在國際銷售,則會發現 / us / / gb / / de / 等表示相關商店的語言。Adwords不會批准指定語言的鏈接。

為什麼?

因為Adwords不接受重定向和不匹配的網址。如果鏈接指向美國商店,但Adword測試來自德國,則會檢測到重定向。當然,這種行為是正確的,因為無論鏈接說什麼,用戶都會轉到她的本地應用商店。

解決方案:編輯iTunes Connect中的鏈接。刪除不需要的信息。只需匹配顯示和最終URL,忽略顯示URL警告文本中有關長度的任何消息。

從iTunes複製的URL: https://itunes.apple.com/us/app/this-is-my-app- name / id1111111111?ls = 1&amp; mt = 8

適用於AdWords的編輯網址

DISPLAY網址itunes.apple.com/app/id111111111 < p>最終網址 http://itunes.apple.com/app/id111111111

筆記: - appstore.com是一個重定向 - itunes.apple.com本身就是一個重定向。只有< strong>完整,如上所述會直接進入您的應用頁面。 - 當一個網址 - 無論多麼有效 - 重定向時,結果都是不匹配的網址。

/ gb

10楼
+10

最簡單的鏈接是 http://itunes.apple.com/app/idXXXXXXXXX

您可以通過 http://itunesconnect.apple.com

11楼
+10

1- Go&gt; https://appstoreconnect.apple.com/

2-我的應用&gt; 選擇您的應用程序

3- App Store&gt; 應用信息&gt; 在App Store上查看