extension创建 ios
2014-11-25 15:49:47 jackshiny 阅读数 373

刚开始接触OC再看别人写的代码的时候,常常困惑于人家在声明属性时的写法,总结出来有三中方式,不知道哪一种比较规范化,现在我把三种方式贴出来,然后再一一探讨每个方式声明属性的区别。

方式一:直接在@interface中的大括号中声明。

@interface MyTest : NSObject{

    NSString *mystr;

}


方式二:在@interface中声明,然后再在@property中声明。

@interface MyTest : NSObject{

    NSString *_mystr;

}


@property (strong, nonatomic) NSString *mystr; 

随后在.m文件中加入 

@synthesize mystr = _myStr;


方式三:直接用@property声明

@interface MyTest : NSObject{

}


@property (strong, nonatomic) NSString *mystr;

随后在.m文件中加入@synthesize mystr = _myStr;


==========================我是分割线============================


首先来说一下方式一根方式三的区别,使用方式一声明的成员变量是只能在自己类内部使用的,而不能在类的外部使用,(就是通过 类名. 点的方式是显示不出来的),方式三则相反,它可以在类的外部访问,在类的内部可以通过下划线+变量名或者self.变量名的方式来访问。


方式二的写法是一种过时的声明变量的方式,xcode在早期@systhesize没有自动合成属性器之前,需要手写

getter与setter方法,下划线从风格上表明这是类的内部变量,要是需要直接使用变量则需要使用get或者set的方式。

在XCode目前有了自动合成属性器后,编译器会自动帮我们生成一个以下划线开头的的实例变量,所以我们不必去同时声明属性与变量。 我们可以直接用@property的方式来声明一个成员属性,在.m文件中使不使用@systhesize都无所谓,xcode会自动帮你生成getter与setter.

个人比较喜欢使用方式三的方式,这是是苹果开发模板所推荐的,也可以在.m文件中不加@systhesize看个人喜好吧。





IOS5之后默认新建的.m文件里有延展

只想供类内部使用的可以写在延展里面的,

但是强制使用任然可以使用

.h文件{}写在括号里面  要用->访问,一般受保护不给访问

_+文件名=self.文件名

2017-02-08 13:30:42 u012960049 阅读数 362

1. [代码] iOS类别(Category)与扩展(Extension) 创建     

1
iOS类别(Category)与扩展(Extension)  创建

2. [图片] 1.png    

3. [图片] 2.png    

2018-05-29 00:09:46 csdn_hhg 阅读数 33

extension像没有命名的category。因此被称为:匿名类别,也叫类扩展

//
//  Person.h
//  匿名类别
//
//  Created by hhg on 15-6-15.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject {
@private NSUInteger _number;
}

- (void)eat;
- (void)song;
@end
//
//  Person.m
//  匿名类别
//
//  Created by hhg on 15-6-15.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import "Person.h"

@interface Person () {
    NSString *_name; 
}

- (void)jump;

@end



@implementation Person {
    NSUInteger _age; // 私有的成员变量, 相当于在匿名类别里声明变量;
}

- (void)eat {
    NSLog(@"吃饭.....");
}


- (void)song {
    NSLog(@"唱歌.....");
}

/// 本类使用
- (void)jump {
    _age = 3;
    NSLog(@"jump ,%lu times ",(unsigned long)_age);
}

@end

正常调用的时候extension只能在自己内部调用,外部调用则报错

//
//  main.m
//  匿名类别
//
//  Created by hhg on 15-6-15.
//  Copyright (c) 2015年 hhg. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p = [[Person alloc] init];

        [p eat];
        [p song];
        // [p test]; // 外部直接调用则报错

    }
    return 0;
}
2016-04-12 17:24:00 weixin_34303897 阅读数 26

先上效果图。从系统自带的浏览器Safari打开一个网址,分享到自己的app

1281559-632d6c8a0c2d7822.png
1281559-e495e48eaedd705c.png
1281559-f23f013a56a36b71.png

具体实现步骤:

1.File->New->Target, Application Extension->Share Extension

1281559-f7e4cb95841bb6ae.png

新建文件

2.Product Name 是在分享菜单中显示的名字。


1281559-84de1aa55b357e06.png

新建文件

1281559-32fdaeb402678452.png

文件建好效果
但目前这个分享扩展什么都不能做,需要完善功能。

4.先来分析ShareViewController这个类

- (void)viewDidLoad
- (BOOL)isContentValid
- (void)didSelectPost
- (NSArray *)configurationItems

viewDidLoad这个方法我们就不用说了, isContentValid来判断我们获取到得数据是否是我们想要的。didSelectPost是选择之后的方法, configurationItems 只返回一个SLComposeSheetConfigurationItem 这是一个类似tableview的列表下面会看到效果.以上三步就能实现一个简单的share Extension 编译运行之后,我们会看到一个很简单的分享页面,当然现在我们还没有做任何东西,那么怎么把我们要分享的东西,或者其他操作和我们的应用关联呢或者上传到我们的服务器呢?

直接上代码:

shareViewController代码如下

@interface ShareViewController ()
@property (strong, nonatomic) UIWebView    *webView;
@end
@implementation ShareViewController
- (BOOL)isContentValid {
    return YES;
}
- (void)didSelectPost {
    [self initWebView];
    [self parsePostUrl];
}
- (void)parsePostUrl {
    NSExtensionItem *extensionItem = self.extensionContext.inputItems.firstObject;
    NSItemProvider *itemProvider = extensionItem.attachments[0];
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
                                  initWithSuiteName:@"group.com.yabadun.live"];
    [myDefaults setObject:self.contentText forKey:@"text"];
    [myDefaults synchronize];
    if ([itemProvider hasItemConformingToTypeIdentifier:(NSString*)kUTTypeURL]) {
        [itemProvider loadItemForTypeIdentifier:(NSString*)kUTTypeURL options:nil completionHandler:^(NSURL *url, NSError *error) {
            [self.extensionContext completeRequestReturningItems:@[] completionHandler:^(BOOL expired) {
                [self openAppWithURL:url.absoluteString text:self.contentText];
            }];
        }];
    }
}
- (NSArray *)configurationItems {
    return @[];
}
- (void)initWebView {
    self.webView = [[UIWebView alloc] init];
    [self.view addSubview:self.webView];
}
- (void)openAppWithURL:(NSString*)urlString text:(NSString*)text {
    UIResponder* responder = self;
    while ((responder = [responder nextResponder]) != nil) {
        if ([responder respondsToSelector:@selector(openURL:)] == YES) {
            [responder performSelector:@selector(openURL:) withObject:[NSURL URLWithString:[NSString stringWithFormat:@"wolaiSocial://%@", [self urlStringForShareExtension:urlString text:text]]]];
        }
    }
}
- (NSString*)urlStringForShareExtension:(NSString*)urlString text:(NSString*)text {
    NSString* finalUrl=[NSString stringWithFormat:@"%@____%@", text, urlString];
    finalUrl =  (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                                                                                      NULL,
                                                                                      (CFStringRef)finalUrl,
                                                                                      NULL,
                                                                                      (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                      kCFStringEncodingUTF8 ));
    return finalUrl;
}
@end

然后在appdelegate实现如下

#pragma mark Handle app open from share extention
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([url.description hasPrefix:@"wolaiSocial"]) {
        [POIShareHelper shareFromURL:url];
    }
}
//iOS 9 及以上
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary *)options {
    if ([url.description hasPrefix:@"wolaiSocial"]) {
        [**POIShareHelper shareFromURL:url**];
    }
}

POIShareHelper主要实现如下:通过url,获取该网页的标题和图片分享到app内部的社区模块

#import "POIHtmlParser.h"    //解析html内容
#import "POIShareHelper.h"
#import "POIUploaderHelper.h"  //图片处理
#import "POIPublishRequest.h"  //发布到社区模块
#import "POIExploreViewController.h"

@implementation POIShareHelper
+ (void)shareFromURL:(NSURL *)url{
    [self shareFromWolaiSocial:url];
}
+ (void)shareFromWolaiSocial:(NSURL *)url{
    NSString *attrStr = [NSString poi_urlStringFromShareExtension:url.absoluteString];
    NSArray* attrArr = [attrStr componentsSeparatedByString:@"____"];
    if([attrArr count] > 1){
        NSString* text = attrArr[0];
        NSString* linkUrl = attrArr[1];
        POIHtmlParser *parser = [[POIHtmlParser alloc] initWithUrl:attrArr[1]];
        if(parser.imageUrl && ![parser.imageUrl isEqualToString:@""])
        {
            NSURL *url = [NSURL URLWithString:parser.imageUrl];
            UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
            [POIUploaderHelper uploadImage:image completion:^(id responseObject) {
                NSString* linkImage = @"";
                if ([responseObject isKindOfClass:[NSString class]])
                {
                    linkImage = (NSString*)responseObject;
                }
                [self handleShareLinkImageUploadFinished:@{
                                                           @"linkURL":linkUrl,
                                                           @"text":text,
                                                           @"linkTitle":parser.title,
                                                           @"linkImage":linkImage
                                                           }];
            } progress:^(float percent) {
            } failed:^{
                [self handleShareLinkImageUploadFinished:@{
                                                           @"linkURL":linkUrl,
                                                           @"text":text,
                                                           @"linkTitle":parser.title,
                                                           @"linkImage":@""
                                                           }];
            }];
        }else{
            [self handleShareLinkImageUploadFinished:@{
                                                       @"linkURL":linkUrl,
                                                       @"text":text,
                                                       @"linkTitle":parser.title,
                                                       @"linkImage":@""
                                                       }];
        }
    }
}
+ (void)handleShareLinkImageUploadFinished:(id)object {
    NSString* linkURL = [object objectForKey:@"linkURL"];
    NSString* linkImage = [object objectForKey:@"linkImage"];
    NSString* linkTitle = [object objectForKey:@"linkTitle"];
    NSString* text = [object objectForKey:@"text"];
    [POIPublishRequest requestPublishWithUrl:linkURL text:text linkImage:linkImage linkTitle:linkTitle complete:^(NSInteger stastus) {
        [SVProgressHUD showSuccessWithStatus:@"分享成功!"];
    } failure:^{
            [MBProgressHUD showMessage:@"分享失败" afterDelay:2.0f];
    }];
}
@end

至于html解析与图片处理的类就不放了,方法有很多。仅供参考哈~ 有不对或有什么问题的地方欢迎纠正

2018-04-27 08:46:00 weixin_34324081 阅读数 17

前言

iOS定义了程序扩展供开发使用,可以解释为一种用户程序与系统程序的关联。例如:共享,通知中心,键盘。

4092596-d5702ba42e4e9195.png
几种类型的应用程序扩展
4092596-caf6049c1bd5a41b.png
几种类型的应用程序扩展

一、App Extension

应用程序扩展功能与应用程序不同,每个扩展程序都是独立于应用程序的二进制文件。需要注意的是:

At a high level, the best user experience for all extensions is quick, streamlined, and focused on a single task.

这句话很有可能就是你App 扩展功能审核不通过的主要原因。

1.Action Extension

2.Audio Unit Extension

3.Broadcast UI Extension

4.Broadcast Upload Extension

5.Call Directory Extension

6.Content Blocker Extension

7.Custom Keyboard Extension

8.Document Provider Extension

9.iMessage Extension

10.Intents Extension

11.Intents UI Extension

12.Notification Content Extension

13.Notification Service Extension

14.Photo Editing Extension

15.Share Extension

16.share Links Extension

17.Spotlight Index Extension

18.Sticker Pack Extension

19.Today Extension 

在“通知中心”的“今日”视图中快速更新或执行快速任务。

二、App Extension 工作方式

应用程序通过扩展应用程序的事件来响应用户的选择,从而激活应用程序,然后使用其在应用程序的的请求事件来执行任务。

4092596-0dfb608c8af7ca01.png
App Extension 生命周期

扩展应用程序主要与系统应用进行通信。

4092596-530df42b811e9c43.png
扩展应用程序与系统程序进行通讯

通常情况下,运行应用程序,其包含的扩展应用程序不一定会运行。在典型的请求/响应事件中,系统应用程序打开扩展应用程序,通过extensionContext来传输数据请求,扩展程序执行操作后,将结果返回给系统程序。

扩展程序可以通过extensionContext.openURL:completionhandler:方法来打开应用程序。任何扩展程序和应用程序都可以访问Shared Resources中的数据。

4092596-ee772ae55178e86a.png
扩展程序可以与应用程序间接通信

系统使用进程间的通信来确保系统应用程序和扩展程序协同工作。

三、App Extension访问限制

无法访问shareApplication对象,因此无法使用该对象的任何方法。

应用程序的库文件,头文件不可访问,访问需要重新添加到扩展程序中。

不可访问相机或者麦克风(除iMessage扩展程序,当然iMessage使用需要在扩展程序的Info.plist中配置NSCameraUsageDescription和NSMicrophoneDescription)

不可执行长时间运行的后台任务。(应用扩展程序可以使用NSURLSession对象)

可以使用AirDrop。

四、App Extension的创建

例如:Xcode->File->New->Target->Today Extension

通过这样的方式创建出来的App Extension 一般会有一个文件包,所有的代码操作就在这个文件包中进行。

五、App Extension的方法介绍

当系统应用调用扩展程序是会调用beginRequestWithExtensionContext:方法,扩展程序可以通过extensionContext获取系统数据。

获取:let myExtensionContext = extensionContext

 其inputItems成员变量会携带系统信息,例如,分享的标题,内容文本,附件和用户星系。

扩展程序通过调用completeRequestReturningItems:completionHandler:方法,有选择的将NSExtensionItem对象返回到系统程序或着cancelRequetWithError:方法中。

iOS 扩展(Extension)

阅读数 3

iOS Category和Extension

阅读数 328

没有更多推荐了,返回首页