iOS 10 Today 的適配
NCWidgetProviding
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);
這是iOS10新出的API,today多了展開和摺疊兩種模式,當模組發生改變之後就會呼叫這個方法。
activeDisplayMode 為NCWidgetDisplayModeCompact 、NCWidgetDisplayModeExpanded, maxSize為today的最大支援的size。
activeDisplayMode還可以通過self.extensionContext.widgetActiveDisplayMode獲得
maxSize可以通過[self.extensionContext widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeExpanded]獲得。
當然 [self.extensionContext widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeCompact]獲得摺疊下的最小支援size。
widgetActiveDisplayMode是一個只讀變數,與此還有一個widgetLargestAvailableDisplayMode屬性,NCWidgetDisplayModeCompact 表示不支援摺疊和展開,只能是摺疊模式了,需要設定為
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
才支援摺疊和展開
最小支援
iPhone5 | iPhone6 | iPhone6 P | |
---|---|---|---|
豎屏 | 304(width,就是兩邊為8),110(height) | 359,110 | 398,110 |
橫屏 | 420,110 | 420,110 | 420,110 |
最大支援
iPhone5 | iPhone6 | iPhone6 P | |
---|---|---|---|
豎屏 | [鎖屏進入],(width)304,(height)528;[通知欄下拉]304,396 | [鎖屏進入]359,616;[通知欄下拉]359,528 | [鎖屏進入]398,660;[通知欄下拉]398,572 |
橫屏 | [鎖屏進入]420,高度待測試;[通知欄下拉]420,176 | [鎖屏進入]420,高度待測試;[通知欄下拉]420,220 | [鎖屏進入]420,352;[通知欄下拉]420,264 |
注意的是iOS10 today有三個入口就是,鎖屏,iPhone home的第一個tab頁面,通知欄下拉,前兩個對高度的限制是一樣的且會寬鬆一些,通知欄下拉則對高度限制嚴格些,一般來說不能超出當前螢幕顯示範圍。
today佈局
today 預設是 storyboard佈局的,如果想要使用程式碼佈局。需要把today中Info.plist的
<key>NSExtension</key> <dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.widget-extension</string> </dict>
修改為
<key>NSExtension</key> <dict> <key>NSExtensionMainStoryboard</key> <string> NSExtensionPointIdentifier</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.widget-extension</string> </dict>
調起app
通過
[self.extensionContext openURL:[NSURL URLWithString:urlString] completionHandler:^(BOOL success) { NSLog(@"open url result:%d",success); }];
就可以調起app了,
然後在app端的appdelegate裡面下面方法接收。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation
資料共享
app 和 today都有各自的空間,但也有共享的空間group。
通過NSUserDefaults共享資料
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.c om.xxx"];
可以通過這個userdefaults讀寫group的資料,suiteName是需要在capabilities裡面配置的,userdefaults和filemanager是共用的。
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri tyApplicationGroupIdentifier:@"group.com.xxx"];
而NSFileManager則可以通過上面的url進行讀寫。
程式碼共享
如果一個檔案需要在today和app內都用的話,則只要.m檔案的targetmembership勾選兩個就可以了。
如果 在你的工程裡面有自己的其他 framework target。 如果你想用這個target裡面檔案,則可以在這個target的general裡面勾選allow app extension API only。
如果對於一個類app和extension都可以呼叫,但是你其中的某些程式碼塊想區分。
你可以在today target裡面新增巨集定義 ,Build Settings - Preprocessor Macros下面新增
TARGET_IS_EXTENSION=1
使用的話就是
#ifndef TARGET_IS_EXTENSION #endif
iOS 10 支援的裝置
iPhone 7 iPhone 7 Plus iPhone 6s iPhone 6s Plus iPhone 6 iPhone 6 Plus iPhone SE iPhone 5s iPhone 5c iPhone 5 iPad Pro 12.9 英寸 iPad Pro 9.7 英寸 iPad Air 2 iPad Air iPad 第四代 iPad mini 4 iPad mini 3 iPad mini 2 iPod touch 第六代