개인 계정으로 App Group을 사용하는 팀 개발

6810 단어 XcodeiOS

문제점


AppGroup은 iOS 8에서 애플리케이션 간에 데이터를 공유하는 메커니즘으로 가져옵니다.맞춤형 키보드와 애플워치 앱 등의 확장은 또 다른 앱이기 때문에 이런 앱을 개발할 때 실제로 앱 그룹을 활용하는 것은 없어서는 안 된다.(참조: http://www.toyship.org/archives/1845
AppGroup은 모든 개발자 계정의 데이터이며, 반드시 세계에서 유일한 이름을 가지고 있어야 한다.개인(Individual) 계정은 여러 사람이 공유할 수 없기 때문에 같은 앱 그룹을 사용할 수 없습니다.기업(Company/Organization) 계좌라면 앱 그룹을 공유할 수 있지만 취득하려면 법인이어야 한다.
이 때문에 불법인 단체(예를 들어 대학 동아리 등)는 앱 그룹을 사용하기 어렵다.

해결책


다음 지침에 따라 여러 사람이 개발할 수 있다.
  • 개발자마다 App Group 이름/Bundle Identifier를 변경합니다.
  • 앱 그룹 이름/Bundle Identifier가 구체적으로 쓴 곳을 한 곳으로 설정하면 쉽게 변경할 수 있다.
  • 그러나 한 사람이 앱스토어에 제기한 제약을 해결할 수 없기 때문에 정식판 건축학과/앱스토어 제출원이 되는 사람이 필요하다.

    절차.


    단계는 Xcode6.3.2에 설명되어 있습니다.

    Config.xcconfig 만들기


    다음 내용의 Config.xcconfig를 제작하여 프로젝트에 추가합니다.
    // 以下の行を開発者ごとに変更すること
    APP_IDENTIFIER = org.example.mzp.some_app
    
    GCC_PREPROCESSOR_DEFINITIONS = $(inherited) APP_IDENTIFIER=${APP_IDENTIFIER}
    
    git 관리의 경우 다음과 같다.
    위의 내용은 Config입니다.xcconfig.example에 기술
  • .gitignore Config.xcconfig 무시
  • 로 설정
    개발자 clone 이후 얼마 지나지 않아, Config.Config.xcconfig.examlpe를 복원하기 위해 README 등에 기술하기

    Config.xcconfig 추가


    프로젝트 ->Info->Configuration에서 사용Config.xcconfig을 설정합니다.

    Info.plist의 변경 사항


    각 대상Info.plist의 Bundle identifier 부분을 $(APP_IDENTIFIER)로 대체합니다.
    목표의 종류에 따라 반드시 교체해야 하는 곳도 다르다.

    AppGroup의 유효성


    각 대상의 Capabilities에서 AppGroup을 활성화합니다.
    또한 아래의 "+"버튼을 사용하여 App Group을 만들 수도 있습니다.

    *.entitlements 변경 사항


    추가<アプリ名>.entilements되었기 때문에group.$(APP_IDENTIFIER)앱그룹명을 대체하였습니다.

    나팔목 클래스 생성하기


    앱 내에서 앱그룹으로 처리하기 위해 스피커 클래스를 제작했다.CPP 매크로를 사용하려면 Objective-C여야 합니다.
    Objectvie-C 때문에 Swift에서 사용할 때 Bridge Header를 적절하게 설정해야 합니다.

    AppGroup.h

    #import <Foundation/Foundation.h>
    
    // AppGroupに関係する情報のラッパ。
    //
    // 個人アカウントを使っているため、ユーザに応じてAppGroup名を変える必要がある。
    // AppGroup名はConfig.xcconfig内でCPPマクロとして定義されているため、Swiftからは読むことができない。
    // そのためObjective-Cで記述する。
    @interface AppGroup : NSObject
    
    // AppGroup名
    + (NSString *)appGroupID;
    
    // AppGroupで共有された領域のパスを取得
    + (NSString *)pathForResource:(NSString *)subpath;
    
    // AppGroupで共有されたNSUserDefaultsを取得
    + (NSUserDefaults*)userDefaults;
    @end
    

    AppGroup.m

    #import "AppGroup.h"
    
    #define STR(x) @#x
    #define STR2(x) STR(x)
    static NSString * const kAppIdentifier = STR2(APP_IDENTIFIER);
    
    @implementation AppGroup
    
    + (NSString *)appGroupID
    {
        return [NSString stringWithFormat:@"group.%@", kAppIdentifier];
    }
    
    + (NSString *)pathForResource:(NSString *)subpath
    {
        NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:[self appGroupID]].path;
        return [containerPath stringByAppendingPathComponent:subpath];
    }
    
    + (NSUserDefaults*)userDefaults
    {
        return [[NSUserDefaults alloc] initWithSuiteName: [self appGroupID]];
    }
    
    @end
    

    좋은 웹페이지 즐겨찾기